10

Amazonは、1.3.21バージョンのAWSJavaSDKでSSLセキュリティを「アップグレード」しました。これにより、AmazonのAWS Java APIを使用するときに、名前にピリオドが含まれるS3バケットへのアクセスが中断されました。2012年10月5日までのバージョン1.3.21.1を使用しています。以下の回答でいくつかの解決策を提供しましたが、この問題に対する追加の回避策を探しています。

このエラーが発生した場合は、例外/ログに次のようなメッセージが表示されます。この例では、バケット名はfoo.example.comです。

INFO: Unable to execute HTTP request: hostname in certificate didn't match:
       <foo.example.com.s3.amazonaws.com> != <*.s3.amazonaws.com>
       OR <*.s3.amazonaws.com> OR <s3.amazonaws.com>
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220)
at org.apache.http.conn.ssl.StrictHostnameVerifier.verify(StrictHostnameVerifier.java:61)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:149)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:130)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)

この問題のドキュメントは、AWSS3ディスカッションフォーラムで確認できます。

https://forums.aws.amazon.com/thread.jspa?messageID=387508

この問題に対するAmazonの対応は次のとおりです。

この命名パターンのバケットに対して(新しい仮想ホストスタイルのアドレス指定ではなく)バケットアドレス指定の古いパススタイルの方法を使用することで、これを修正できるはずです。修正を開始し、内部統合テストにピリオドを含むバケット名のテストケースがあることを確認します。

回避策または他の解決策はありますか?フィードバックをありがとうございます。

4

2 に答える 2

9

オリジナル:2012年10月

Amazonは2012年9月下旬にS3のSSLセキュリティを「アップグレード」したことが判明しました。これにより、AmazonのAWS Java APIを使用しているときに、名前にピリオドが含まれるS3バケットへのアクセスが中断されました。

これは不正確です。S3のSSLワイルドカードマッチングは、2006年にS3がリリースされたときと同じです。AWSJavaSDKチームがSSL証明書のより厳密な検証を有効にしたが、S3のSSLに違反して実行されていたバケット名を壊してしまった可能性が高いです。証明書(悪い)。

正解は、 DNSスタイルのアドレス指定ではなくパススタイルのアドレス指定を使用する必要があるということです。これが、SSL証明書のワイルドカード一致に関する問題を回避する唯一の安全な方法です。検証を無効にすると、中間者攻撃にさらされる可能性があります。

私が現在知らないのは、JavaSDKがこれを構成可能なオプションとして提供しているかどうかです。もしそうなら、それはあなたの答えです。それ以外の場合は、Java SDKチームが「この機能を追加してから、統合テストを追加して、すべてが機能することを確認する」と言ったようです。

更新:2020年10月

AWSは、パススタイルのアドレッシングが廃止されることを発表しました。近い将来、廃止される予定です。AWSのアドバイスは、DNS互換のバケット名を使用することです。これは、ピリオドがないことを意味します(他のいくつかのことの中でも)。S3の特定の新しい機能には、DNS互換のバケット名が必要です(例:高速転送)。

ピリオドを含むバケット名が必要な場合(近い将来、新しいバケットでも使用できなくなります)、HTTPSを介してヒットする場合は、CloudFrontディストリビューションをその前に配置することをお勧めします。

于 2012-10-06T02:29:51.297 に答える
6

Amazonはこの問題を解決するバージョン1.3.22をリリースしました。コードが機能することを確認しました。リリースノートから引用するには:

名前にピリオドが含まれているバケットは、HTTPSを介して再度正しくアドレス指定できるようになりました。

Amazonが新しいAPIをリリースするまで待つ以外に、私が見ることができる解決策がいくつかあります。

  1. もちろん、AWSJavaSDKの1.3.20バージョンにロールバックすることもできます。残念ながら、1.3.21の機能のいくつかが必要でした。

  2. org.apache.http.conn.ssl.StrictHostnameVerifierクラスパスでを置き換えることができます。これはハックですが、Apachehttp接続のSSLチェックをすべて削除すると思います。これが私のために働いたコードです:http://pastebin.com/bvFELdJE

  3. 最終的に、AWSソースjarから独自のパッケージをダウンロードしてビルドしました。次の近似パッチをHttpClientFactoryソースに適用しました。

    ===================================================================
    --- src/main/java/com/amazonaws/http/HttpClientFactory.java     (thirdparty/aws)      (revision 20105)
    +++ src/main/java/com/amazonaws/http/HttpClientFactory.java     (thirdparty/aws)    (working copy)
    @@ -93,7 +93,7 @@
    
                            SSLSocketFactory sf = new SSLSocketFactory(
                                    SSLContext.getDefault(),
    -                               SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
    +                               SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    
  4. 正しい修正は、ドメイン名バケット処理からパスベースの処理に変更することです。

ところで、以下はうまくいくようですが、うまくいきませ。AWSクライアントは特にベリファイアをリクエストしSTRICT、デフォルトのベリファイアを使用しません。

SSLSocketFactory.getSystemSocketFactory().setHostnameVerifier(
    SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
于 2012-10-05T22:51:17.807 に答える