2017-07-17 18 views
1

私はjava1.8で作業していて、OKHTTP経由でAPNS(api.push.apple.com)に接続しています。Java 1.8:TLSv1.2 ClientHelloハンドシェイクエラー(楕円曲線の拡張子がありません)

症状はSSLハンドシェイクが失敗しています:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure私の研究によると、サーバーはクライアントとの暗号をネゴシエートできませんでした。

コードでは、SSLContext.getInstance("TLS")でSSLコンテキストを作成しています。

-Djavax.net.debug=allで自分のアプリケーションを実行した後、私は私のSSLハンドシェイクのClientHelloは、次のようになりますことを発見:基本的にはちょうど

OkHttp https://api.push.apple.com/3/device/token, READ: TLSv1.2 Alert, length = 2 
OkHttp https://api.push.apple.com/3/device/token, RECV TLSv1.2 ALERT: fatal, handshake_failure 

不可解でフォローしている

*** ClientHello, TLSv1.2 
RandomCookie: GMT: 1500317763 bytes = { 59, 94, 246, 29, 243, 123, 94, 45, 2, 86, 47, 12, 198, 219, 164, 71, 166, 30, 143, 25, 190, 34, 243, 50, 24, 239, 0, 131 } 
Session ID: {} 
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA] 
Compression Methods: { 0 } 
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA256withDSA, SHA224withECDSA, SHA224withRSA, SHA224withDSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA 
Extension server_name, server_name: [type=host_name (0), value=api.push.apple.com] 
Extension renegotiation_info, renegotiated_connection: <empty> 
Extension application_layer_protocol_negotiation, protocols: [h2, spdy/3.1, http/1.1] 
*** 

問題は、コードが同僚のノートパソコンで正常に動作していることです.SSL ClientHelloは、次の2つのエントリを除いて同一です。

APNSサーバー( https://www.ssllabs.com/ssltest/analyze.html?d=api.push.apple.com&s=17.188.154.31)のためにSSLを分析
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1} 
Extension ec_point_formats, formats: [uncompressed] 

それだけTLSv1.2と、次の暗号を受け入れることを示しています

私はSSLで Extension Sが欠けていることだと思います
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8) ECDH secp256r1 (eq. 3072 bits RSA) FS 256 
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030) ECDH secp256r1 (eq. 3072 bits RSA) FS 256 
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) ECDH secp256r1 (eq. 3072 bits RSA) FS 128 

ハンドシェイクは、共通の暗号を使用していないことに基づいてサーバーがハンドシェイクを拒否するようにしています。


これが実行されるラップトップはOS X 10.10ですが、壊れているものはmacOS 10.12です。私たちはどちらもJava1.8です。


誰もがこれについてのリードを持っていると大変感謝します。

お時間をいただきありがとうございます。

答えて

2

はおそらく不在ECの拡張子は、技術的にはそれが許されていますが、問題を引き起こしているものです - RFC 4492のセクション4参照:ECC暗号スイートが これらの拡張を含めないことを選択することができる提案

クライアントを。この場合、サーバは、しかし、おそらくないあなたは、サーバーの初飛行(のServerHelloを受ける前に、まだ間違って行くことができ

第5節に記載された楕円曲線またはポイント形式のいずれか を自由に選択することができます。 .. ServerHelloDone)、私はサーバーがこの不在を許可しないと仮定します。

私はあなたのJDKが何らかの形で奇妙に設定されていることを期待しているので、JDK8がその拡張子を送信しないことはかなり変わった動作だと思うし、まったく新しいJDK8をインストールしてテストするのが最適かもしれないJCE Unlimited Strength "ポリシーファイル)。

私は簡単に(OpenJDKの)JDK8ソースを見て、この拡張機能がないかもしれない理由の可能性のカップルがあります:

  • はどういうわけか、「EC」のJCE暗号化プロバイダは、「見つからないかdoesnのさTLSカーブをサポートします。 security.providerエントリのjre/lib/security/java.securityリストと、プログラマチックなプロバイダの変更を確認してください。クライアント認証に何らかのハードウェアトークンを使用しようとしていますか?
  • "jdk.tls.namedGroups"システムプロパティが設定されている可能性があります(空の場合は例外が表示されるはずですが、サポートされていない曲線のみがリストアップされている可能性があります)。他のシステムプロパティを確認してください。

     if (debug != null && idList.isEmpty()) { 
         debug.println(
          "Initialized [jdk.tls.namedGroups|default] list contains " + 
          "no available elliptic curves. " + 
          (property != null ? "(" + property + ")" : "[Default]")); 
        } 
    

    は、あなたがそのメッセージを参照しているかどうか報告してください、そしてどのようなことが書かれています:

は、ソースコードによると、任意の曲線を見つけるために、障害によって生成されたデバッグログにラインがあるかもしれません。使用しているJDK8のバージョンと、FIPSモードを有効にしているかどうかを知ることも役に立ちます。

0

bootclasspathのALPNライブラリは、JDKのSSLコードをパッチ適用済みのバージョンに置き換えます。これは、JDKが更新され、ALPNが古いバージョンのままであるときに、JDKを破壊することを意味します。あなたはマッピングファイルであなたのJDKに必要ALPNバージョン

チェック: https://github.com/jetty-project/jetty-alpn/tree/master/docs

すべてALPN JARはここで見つけることができます: http://repo1.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/

関連する問題