AWS認証情報プロバイダーからセキュリティトークンを取得する

ラフ

誰かが私を説明できますか、このブログの最初のステップをどのように実装する必要がありますか?AWSのドキュメントで見つかりません。

言い換えれば、私はコマンドを翻訳する必要があります:

curl --cert eeb81a0eb6-certificate.pem.crt --key eeb81a0eb6-private.pem.key -H "x-amzn-iot-thingname: myThingName" --cacert AmazonRootCA1.pem https://<prefix>.credentials.iot.us-west-2.amazonaws.com/role-aliases/MyAlias/credentials

JAVAへ。どうすればいいですか?AWS SDKが必要です(「HTTPSリクエストを行うカスタムクライアント」のないソリューションが好きです)

更新:

カスタムクライアントを使用してHTTPSリクエストを作成しようとしましたが、キーをJava KeyStoreにエクスポートしようとするとスタックしました(ただし、curlコマンドは問題なく機能します)。

$ winpty openssl pkcs12 -export -in eeb81a0eb6-certificate.pem.crt -inkey eeb81a0eb6-private.pem.key -chain -CAfile AmazonRootCA1.pem -name mycompany.com -out my.p12

Error unable to get local issuer certificate getting chain.

別の更新(私がすでに試したこと)

  1. myPrivateKeyとdeviceCertificateをJKSに変換します。

    winpty openssl pkcs12 -export -in eeb81a0eb6-certificate.pem.crt -inkey eeb81a0eb6-private.pem.key -name mycompany.com -out my.p12

    keytool -importkeystore -destkeystore mycompany.jks -srckeystore my.p12 -srcstoretype PKCS12

  2. 私のコードからこのJKSを使用してください:

     System.setProperty("deployment.security.TLSv1.2", "true");
     System.setProperty("https.protocols", "TLSv1.2");
     System.setProperty("javax.net.debug", "ssl");
    
     HttpPost request = new HttpPost(clientEndpoint);
     request.setHeader("x-amzn-iot-thingname", "0ad16050-d974-4f78-88ea-c6ee2b0a551e");
    
     KeyStore keyStore;
     try (InputStream keyStoreStream = this.getClass().getResourceAsStream(KEYSTOREPATH)) {
         keyStore = KeyStore.getInstance("PKCS12");
         keyStore.load(keyStoreStream, KEYSTOREPASS.toCharArray());
     }
    
     SSLContext sslContext = SSLContexts.custom()
             .loadKeyMaterial(keyStore, KEYPASS.toCharArray()) // use null as second param if you don't have a separate key password
             .loadTrustMaterial(null, new TrustSelfSignedStrategy())
             .build();   
    
     SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext);
     Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                                                     .register("https", sslConnectionSocketFactory)
                                                     .register("http", new PlainConnectionSocketFactory())
                                                     .build();
    
     BasicHttpClientConnectionManager manager = new BasicHttpClientConnectionManager(registry);
    
     try (CloseableHttpClient httpClient = HttpClients
                                             .custom()
                                             .setSSLSocketFactory(sslConnectionSocketFactory)
                                             .setConnectionManager(manager)
                                             .build();
          CloseableHttpResponse response = httpClient.execute(request)) {
    
    
         System.out.println();
    
    
    
     } catch (IOException e) {
         System.err.println(e);
     }
    
  3. 例外が発生します:

    javax.net.ssl.SSLHandshakeException:致命的なアラートを受信しました:bad_certificate

jccampanero

AWS SDKはSdkHttpClient、同期または非同期の両方でAmazonサービスと対話するために使用できるいくつかの実装を提供します。

たとえば、ApacheHttpClientクラスを使用できます

このHTTPクライアントはすべて、Builders、ApacheHttpClient.Builderforで作成および構成されますApacheHttpClient

ApacheHttpClient.Builder クライアント側、リモートピア、または相互認証用の安全なHTTP接続を構成できるメソッドを提供します。

クライアントを認証する必要がある場合は、呼び出しの引数--cert--key引数に対応して、その目的で使用する必要のある証明書と秘密鍵を提供する必要がありますcurl

通常、この証明書と秘密鍵はKeyStore保護された1つのパスワードで、通常はPKCS#12形式(.p12または.pfxファイル)で保存されます。

この情報にはApacheHttpClient.Builder、2つの方法でアクセスできます。

まず、一連のSystemプロパティを設定します。

import static software.amazon.awssdk.utils.JavaSystemSetting.SSL_KEY_STORE;
import static software.amazon.awssdk.utils.JavaSystemSetting.SSL_KEY_STORE_PASSWORD;
import static software.amazon.awssdk.utils.JavaSystemSetting.SSL_KEY_STORE_TYPE;

//...

Path clientKeyStore = Paths.get(...);

System.setProperty(SSL_KEY_STORE.property(), clientKeyStore.toAbsolutePath().toString());
System.setProperty(SSL_KEY_STORE_TYPE.property(), "pkcs12");
System.setProperty(SSL_KEY_STORE_PASSWORD.property(), "password");

注:static輸入は標準のための唯一の定数であるJSSEの性質javax.net.ssl.keyStorejavax.net.ssl.keyStorePasswordjavax.net.ssl.keyStoreType

第二に、TlsKeyManagersProvidertlsKeyManagersProviderメソッドに実装を提供することによってApacheHttpClient.Builder例えば:

Path clientKeyStore = ...
TlsKeyManagersProvider keyManagersProvider = FileStoreTlsKeyManagersProvider.create(clientKeyStore, "pkcs12", "password");

実際、内部では、上記のSystemプロパティベースの構成がSystemPropertyTlsKeyManagersProvider別のTlsKeyManagersProvider実装で使用されています。

サーバーを認証する必要がある場合は、2つのオプションもあります。

まず、もう一度、いくつかのSystemプロパティを設定します。

Path serverKeyStore = Paths.get(...);
System.setProperty("javax.net.ssl.trustStore", serverKeyStore.toAbsolutePath().toString());
System.setProperty("javax.net.ssl.trustStorePassword", "password");
System.setProperty("javax.net.ssl.trustStoreType", "jks");

ご覧のとおり、簡単にするために、今回は別の種類のKeyStoreを使用していjksます。あなたは、このようなAを構築することができKeyStore、あなたのAWSサーバ証明書のPEMファイル(と関連するものから--cacert、あなたにcurlこのような何かを持つコマンド):

Path pemPath = ...;
try(final InputStream is = Files.newInputStream(pemPath) {
  CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
  X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(is);
  String alias = cert.getSubjectX500Principal().getName();
  KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
  keyStore.load(null);
  keyStore.setCertificateEntry(alias, cert);
}

相互認証の場合、同じものを再利用できますが、KeyStore2つを維持することをお勧めします。1つはクライアントの秘密鍵と証明書を使用し、もう1つは信頼するサーバー証明書(トラストストア)を使用します。

または、TrustManager使用する必要のあるを定義して、サーバー側の認証を構成することもできます

このタスクのために、ApacheHttpClient.Builderはメソッドを提供しますtlsTrustManagersProviderこのメソッドには、TlsTrustManagersProviderインターフェイスの実装が必要です。

このインターフェイスは、SSL通信でリモートピアをチェックするために使用する必要がtrustManagersあるTrustManagersの配列を返す単一のメソッドを定義します

残念ながら、AWS SDKはこのインターフェースの実装を提供していません。独自のインターフェースを実装する必要があります(さらに情報が必要な場合はお知らせください)。

初期化および構成が完了するとまたはメソッドをそれぞれ使用して、のようなカスタムサービスクライアントにこれSdkHttpClientまたはそのを提供できますSdkHttpClient.BuilderIotClienthttpClienthttpClientBuilder

curlコマンドのようにTLS接続をテストする必要がある場合は、次のように試すことができます。

Path clientKeyStore = Paths.get(...);
System.setProperty("javax.net.ssl.keyStore", clientKeyStore.toAbsolutePath().toString());
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.keyStorePassword", "password");

Path serverKeyStore = Paths.get(...);
System.setProperty("javax.net.ssl.trustStore", serverKeyStore.toAbsolutePath().toString());
System.setProperty("javax.net.ssl.trustStorePassword", "password");
System.setProperty("javax.net.ssl.trustStoreType", "jks");

SdkHttpClient client = ApacheHttpClient.builder().build();

SdkHttpRequest httpRequest = SdkHttpFullRequest.builder()
        .method(SdkHttpMethod.GET)
        .uri(new URI("https://<prefix>.credentials.iot.us-west-2.amazonaws.com/role-aliases/MyAlias/credentials"))
        .putHeader("x-amzn-iot-thingname", "myThingName")
        .build();

HttpExecuteRequest request = HttpExecuteRequest.builder()
        .request(httpRequest)
        .build();

HttpExecuteResponse response = client.prepareRequest(request).call();

AWS JavaSDKでこのテスト確認しください。これも役立つ場合があります。

最後に、プロジェクトで使用できる非同期HTTPクライアントもあります。これらのクライアントで安全なHTTP通信を構成する方法は、上記の段落で説明した方法と非常によく似ています。

これらのリソースはすべて、AWS Java SDK v2GitHubリポジトリにあります

SDK全体をプロジェクトにインポートできます(Mavenを使用していると思います)。

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>aws-sdk-java</artifactId>
  <version>2.15.7</version>
</dependency>

ただし、Apache HTTPクライアントをテストするために必要なのは、次の依存関係だけだと思います。

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>apache-client</artifactId>
  <version>2.15.7</version>
</dependency>

AWS SDKによって提供されるコードに答えを集中しようとしましたが、必要であると理解したので、これらの一時的な認証情報を取得するには、ApacheHttpClientなどのAWSへの安全な接続を可能にする任意のメカニズムを使用することもできます。あなたの例では、OkHttpなどです。

これらの一時的な認証情報を使用して、AWSリクエストに署名し、AWSサービスで(想定されるIAMロールに従って)オペレーションを実行できます。たとえば、指定したブログの例に従って、DynamoDBテーブルにアイテムを挿入できます。

AwsSessionCredentials credentials = AwsSessionCredentials.create(
  "the_returned_access_key_id",
  "the_returned_secret_key_id",
  "the_returned_session_token"
);

DynamoDbClient ddb = DynamoDbClient.builder()
  .region(Region.US_EAST_1)
  .credentialsProvider(StaticCredentialsProvider.create(credentials))
  .build();

 HashMap<String,AttributeValue> itemValues = new HashMap<String,AttributeValue>();

itemValues.put("serial_number", AttributeValue.builder().s("123456789").build());
itemValues.put("timestamp", AttributeValue.builder().s("2017-11-20T06:00:00.000Z").build());
itemValues.put("current_temp", AttributeValue.builder().n("65").build());
itemValues.put("target_temp", AttributeValue.builder().n("70").build());
itemValues.put("humidity", AttributeValue.builder().n("45").build());

PutItemRequest request = PutItemRequest.builder()
  .tableName("MyHomeThermostat")
  .item(itemValues)
  .build();

try {
  ddb.putItem(request);
} catch (ResourceNotFoundException e) {
  //...
} catch (DynamoDbException e) {
  //...
} 

取得したトークンを更新する方法についての上記のコメントでのあなたの質問に関連して、私はあなたに答えを与えることができないことを認識しなければなりません

私の意見では、上記の呼び出しによって返された一時的な認証情報は更新できないと思います。少なくともAWS SDKはそのためのメカニズムを提供していません。この認証情報プロバイダーは、IoT向けに設計された非常に特殊なユースケースです。あなたが引用したブログとAWS公式ドキュメント

AWS SDKはAWSCredentialsProviderStsAssumeRoleCredentialsProviderまたはなどのトークン更新をサポートするさまざまStsGetSessionTokenCredentialsProviderなを提供しますが、このユースケースに固有のプロバイダーはありません。

何か助けがあれば、基本クラスのソースコードStsCredentialsProvider、特にセットアップCachedSupplierや関連するものに関連するコンストラクターのコードを確認できます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

AWSがインスタンスメタデータからセキュリティ認証情報を取得する

分類Dev

Springセキュリティ-カスタムログインページからカスタム認証プロバイダーを呼び出す

分類Dev

Powershell:Windowsセキュリティイベントログからログイン情報を抽出する方法は?

分類Dev

アプリのドキュメントディレクトリから音楽のアーティスト情報を取得する方法

分類Dev

FlinkS3書き込みが失敗するチェーン内のどのプロバイダーからAWS認証情報を読み込めない

分類Dev

Google認証プロバイダーから返された情報を使用してデータへのアクセスを提供する方法

分類Dev

AWS DotNet SDKエラー:EC2インスタンスメタデータサービスからIAMセキュリティ認証情報を取得できません

分類Dev

サーバー側からSpringセキュリティを認証する

分類Dev

Aws-vault:認証情報の取得に失敗しました-InvalidClientTokenId:リクエストに含まれているセキュリティトークンが無効です

分類Dev

基本認証を実装するときに認証プロバイダーを使用する理由 春のセキュリティ

分類Dev

Springセキュリティにカスタム認証プロバイダーを実装するクラスの実装を選択させる

分類Dev

Restコントローラーのセキュリティトークンからデータを取得する

分類Dev

チェーンSpringCloud StreamKinesisバインダー内のプロバイダーからAWS認証情報を読み込めません

分類Dev

セキュリティグループ情報を取得するためにすべてのAWSリージョンを反復処理する方法

分類Dev

Wildflyサーバー認証モジュールからリモートEJBクライアントに「パスワードの有効期限」情報を渡す

分類Dev

Javaセキュリティプロバイダーから特定のアルゴリズムを削除する

分類Dev

Springセキュリティフィルターは認証プロバイダーを直接呼び出す必要がありますか?

分類Dev

プロバイダーがホストするアプリからSharepointドキュメントライブラリアイテムにアクセスする

分類Dev

AWS:プライベートインスタンスからインターネットに直接接続されたロードバランサーにアクセスできるようにするセキュリティグループ

分類Dev

認証付きのダイナミックコンテンツプロバイダーからhtml5オーディオをロードする

分類Dev

AWSまたは他のクラウドサービスでウェブサイトをホストすると、ユーザーにログインする際の認証のセキュリティが強化されますか?

分類Dev

複数の認証プロバイダーによるSpringセキュリティ-UsernameNotFoundException

分類Dev

認証情報なしのPythonを使用してパブリックAWS S3からファイル/フォルダーをダウンロード

分類Dev

保護されたS3オブジェクトにアクセスするためのモバイルアプリケーションのSTS認証情報を取得するにはどうすればよいですか?

分類Dev

JavaのJAASセキュリティでログインせずにユーザー資格情報を確認する

分類Dev

AWS Polly Javaクライアントでエラーが発生する:チェーン内のプロバイダーからリージョン情報をロードできません

分類Dev

エグゼキュータからの環境認証情報を使用して、リモートでaws_s3タスクを実行します

分類Dev

CASをバイパスして、Springブートアプリからセキュリティで保護されていないヘルス情報を取得します

分類Dev

JavaアプリケーションがAWSEC2インスタンスでホストされている場合に、AWSLambda関数を呼び出すための認証情報プロバイダーを取得します

Related 関連記事

  1. 1

    AWSがインスタンスメタデータからセキュリティ認証情報を取得する

  2. 2

    Springセキュリティ-カスタムログインページからカスタム認証プロバイダーを呼び出す

  3. 3

    Powershell:Windowsセキュリティイベントログからログイン情報を抽出する方法は?

  4. 4

    アプリのドキュメントディレクトリから音楽のアーティスト情報を取得する方法

  5. 5

    FlinkS3書き込みが失敗するチェーン内のどのプロバイダーからAWS認証情報を読み込めない

  6. 6

    Google認証プロバイダーから返された情報を使用してデータへのアクセスを提供する方法

  7. 7

    AWS DotNet SDKエラー:EC2インスタンスメタデータサービスからIAMセキュリティ認証情報を取得できません

  8. 8

    サーバー側からSpringセキュリティを認証する

  9. 9

    Aws-vault:認証情報の取得に失敗しました-InvalidClientTokenId:リクエストに含まれているセキュリティトークンが無効です

  10. 10

    基本認証を実装するときに認証プロバイダーを使用する理由 春のセキュリティ

  11. 11

    Springセキュリティにカスタム認証プロバイダーを実装するクラスの実装を選択させる

  12. 12

    Restコントローラーのセキュリティトークンからデータを取得する

  13. 13

    チェーンSpringCloud StreamKinesisバインダー内のプロバイダーからAWS認証情報を読み込めません

  14. 14

    セキュリティグループ情報を取得するためにすべてのAWSリージョンを反復処理する方法

  15. 15

    Wildflyサーバー認証モジュールからリモートEJBクライアントに「パスワードの有効期限」情報を渡す

  16. 16

    Javaセキュリティプロバイダーから特定のアルゴリズムを削除する

  17. 17

    Springセキュリティフィルターは認証プロバイダーを直接呼び出す必要がありますか?

  18. 18

    プロバイダーがホストするアプリからSharepointドキュメントライブラリアイテムにアクセスする

  19. 19

    AWS:プライベートインスタンスからインターネットに直接接続されたロードバランサーにアクセスできるようにするセキュリティグループ

  20. 20

    認証付きのダイナミックコンテンツプロバイダーからhtml5オーディオをロードする

  21. 21

    AWSまたは他のクラウドサービスでウェブサイトをホストすると、ユーザーにログインする際の認証のセキュリティが強化されますか?

  22. 22

    複数の認証プロバイダーによるSpringセキュリティ-UsernameNotFoundException

  23. 23

    認証情報なしのPythonを使用してパブリックAWS S3からファイル/フォルダーをダウンロード

  24. 24

    保護されたS3オブジェクトにアクセスするためのモバイルアプリケーションのSTS認証情報を取得するにはどうすればよいですか?

  25. 25

    JavaのJAASセキュリティでログインせずにユーザー資格情報を確認する

  26. 26

    AWS Polly Javaクライアントでエラーが発生する:チェーン内のプロバイダーからリージョン情報をロードできません

  27. 27

    エグゼキュータからの環境認証情報を使用して、リモートでaws_s3タスクを実行します

  28. 28

    CASをバイパスして、Springブートアプリからセキュリティで保護されていないヘルス情報を取得します

  29. 29

    JavaアプリケーションがAWSEC2インスタンスでホストされている場合に、AWSLambda関数を呼び出すための認証情報プロバイダーを取得します

ホットタグ

アーカイブ