署名鍵をローテーションする
署名鍵を定期的に手動でローテーションして、アプリケーションやAPIがトークンの検証に使用するJSON Web Key(JWK)を変更することができます。アプリケーションまたはAPIがこのキー変更を許可せず、トークンの検証に期限の切れた署名鍵を使おうとした場合は、認証要求が失敗します。
Auth0は一度に1つの署名鍵しか署名しませんが、テナントのOpenID Connect(OIDC)ディスカバリーには常に複数のキーが含まれています。OIDCディスカバリーには常に現在のキーと次のキーの両方が含まれています。以前のキーが取り消されていない場合には、それも含まれています。緊急の状況でも速やかに動作するように、アプリケーションがディスカバリーにあるどのキーでも使用できるようにしておきます。OpenID Connectディスカバリーについては、「JSON Web Key Setを見つける」をお読みください。
Auth0 DashboardやManagement APIを使用すると、テナントのアプリケーションの署名鍵をローテーションすることができます。
Dashboardの使用
[Dashboard]>[Settings(設定)]>[Signing Keys(署名鍵)]に移動します。
[Rotation Settings(ローテーション設定)]の下から、[Rotate Signing Key(署名鍵のローテーション)]を見つけ、[Rotate Key(キーのローテーション)]を選択します。
[Rotate(ローテーション)]をクリックして確定します。
Management APIの使用
署名鍵のリストを取得するには、全アプリケーション署名鍵の取得エンドポイントに
GET
呼び出しを行います。署名鍵をローテーションするには、アプリケーション署名鍵のローテーションエンドポイントに
POST
呼び出しを行います。MGMT_API_ACCESS_TOKEN
プレースホルダーの値をManagement APIのアクセストークンで置き換えてください。curl --request POST \ --url 'https://{yourDomain}/api/v2/keys/signing/rotate' \ --header 'authorization: Bearer {yourMgmtApiAccessToken}'
Was this helpful?
/var client = new RestClient("https://{yourDomain}/api/v2/keys/signing/rotate"); var request = new RestRequest(Method.POST); request.AddHeader("authorization", "Bearer {yourMgmtApiAccessToken}"); IRestResponse response = client.Execute(request);
Was this helpful?
/package main import ( "fmt" "net/http" "io/ioutil" ) func main() { url := "https://{yourDomain}/api/v2/keys/signing/rotate" req, _ := http.NewRequest("POST", url, nil) req.Header.Add("authorization", "Bearer {yourMgmtApiAccessToken}") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := ioutil.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) }
Was this helpful?
/HttpResponse<String> response = Unirest.post("https://{yourDomain}/api/v2/keys/signing/rotate") .header("authorization", "Bearer {yourMgmtApiAccessToken}") .asString();
Was this helpful?
/var axios = require("axios").default; var options = { method: 'POST', url: 'https://{yourDomain}/api/v2/keys/signing/rotate', headers: {authorization: 'Bearer {yourMgmtApiAccessToken}'} }; axios.request(options).then(function (response) { console.log(response.data); }).catch(function (error) { console.error(error); });
Was this helpful?
/#import <Foundation/Foundation.h> NSDictionary *headers = @{ @"authorization": @"Bearer {yourMgmtApiAccessToken}" }; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://{yourDomain}/api/v2/keys/signing/rotate"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; [request setHTTPMethod:@"POST"]; [request setAllHTTPHeaderFields:headers]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog(@"%@", error); } else { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; NSLog(@"%@", httpResponse); } }]; [dataTask resume];
Was this helpful?
/$curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://{yourDomain}/api/v2/keys/signing/rotate", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTPHEADER => [ "authorization: Bearer {yourMgmtApiAccessToken}" ], ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; }
Was this helpful?
/import http.client conn = http.client.HTTPSConnection("") headers = { 'authorization': "Bearer {yourMgmtApiAccessToken}" } conn.request("POST", "/{yourDomain}/api/v2/keys/signing/rotate", headers=headers) res = conn.getresponse() data = res.read() print(data.decode("utf-8"))
Was this helpful?
/require 'uri' require 'net/http' require 'openssl' url = URI("https://{yourDomain}/api/v2/keys/signing/rotate") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Post.new(url) request["authorization"] = 'Bearer {yourMgmtApiAccessToken}' response = http.request(request) puts response.read_body
Was this helpful?
/import Foundation let headers = ["authorization": "Bearer {yourMgmtApiAccessToken}"] let request = NSMutableURLRequest(url: NSURL(string: "https://{yourDomain}/api/v2/keys/signing/rotate")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume()
Was this helpful?
/値 説明 MGMT_API_ACCESS_TOKEN
create:signing_keys
とupdate:signing_keys
のスコープを持つManagement APIのアクセストークン。
キーのローテーションによる影響
アクセストークンを受け入れるAPIとAPIゲートウェイ
ほとんどのミドルウェアとAPIゲートウェイは、JSON Web Key Set(JWKS)エンドポイントを利用して、特定の間隔で現在の署名鍵と次の署名鍵を取得します。ミドルウェアやAPIゲートウェイがこのエンドポイントをサポートしておらず、*.cer
ファイルの手動設定が必要な場合は、Auth0での署名キーのローテーションとミドルウェアおよびゲートウェイの再構成を調整する必要があります。
通常のWebアプリケーション
Auth0で署名鍵をローテーションする場合には、WS-FedやSAMLを利用するアプリケーションを再構成して調整する必要があります。これは通常、新しい公開証明書のアップロードや、WS-Fed/SAMLメタデータURLを追加してアプリケーションを再構成した際に起こります。これにより、アプリケーションがトークンの検証に使用するJWKSキーが変更されてしまいます。実装でJWKSキーが変わらないと想定されていないことを確認してください。