2017-01-30 15 views
1

これは私の最初のstackoverflowです。HTTPS通信に失敗しました.jdk 1.8(64ビット)サーバーのjdk 1.6(32ビットクライアント):READ:Unknown-3.3 Alert、length = 2

  1. クライアントTomcat、JDK1.6 32ビットを使用しています。
  2. サーバーTomcat、JDK1.8を使用64ビット。私が手

    HttpClient hc = new HttpClient(); 
    hc.startSession(monitAppURL); 
    int code = hc.executeMethod(poster); 
    

    例外:

    は致命的なアラートを受信:握手_

    は私がしてJVMを起動することによって、より詳細な例外を得るとHTTPS要求のため

クライアントコード-Djavax.net.debug=ssl:handshake:verbose


レガシーhelloメッセージを許可:このSecureRandom
が危険な再交渉を許可播種行われたSecureRandom

トリガ播種真
は、初期ハンドシェイクです:真
は、安全な再ネゴシエーションです:@dealy真
監視サービス:: nap 30 :: 30、setSoTimeout(0)と呼ばれる
監視サービス@dealy :: nap 30 :: 30、setSoTimeout(0)と呼ばれる
%%キャッシュされていないクライアントセッション
*** ClientHello、 TLSv1 RandomCookie:GMT:1468994533バイト= {100,134,165,203,220,40,175,72,89,189,99,104,208,177,19,59,234,210,59,1,57 、254、73、155、253、82、102、221} セッションID:{}
暗号スイート:[SSL_RSA_WITH_RC4_128_MD5、SSL_RSA_WITH_RC4_128_SHA、TLS_RSA_WIT _AES_128_CBC_SHA、TLS_DHE_RSA_WITH_AES_128_CBC_SHA、TLS_DHE_DSS_WITH_AES_128_CB _SHA、SSL_RSA_WITH_3DES_EDE_CBC_SHA、SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA、SSL_DHE DSS_WITH_3DES_EDE_CBC_SHA、SSL_RSA_WITH_DES_CBC_SHA、SSL_DHE_RSA_WITH_DES_CBC_S A 、SSL_DHE_DSS_WITH_DES_CBC_SHA、SSL_RSA_EXPORT_WITH_RC4_40_MD5、SSL_RSA_EXPORT WITH_DES40_CBC_SHA、SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA、SSL_DHE_DSS_EXPORT_W TH_DES40_CBC_SHA、TLS_EMPTY_RENEGOTIATION_INFO_SCSV]

圧縮方法:{0}

***監視サービス@dealy :: nap 30 :: 30、WRITE:TLSv1ハンドシェイク、長さ= 75
監視サービス@dealy :: nap 30 :: 30、書き込み:SSLv2クライアントのhelloメッセージ、長さ= 101 @dealy
監視サービス:: READ、30 :: 30昼寝:不明-3.3アラート、長さ= 2
監視サービス@dealy :: 30 :: 30昼寝、RECV TLSv1のALERT:致命的な、握手_
監視サービス@ dealy :: nap 30 :: 30、closeSocket()監視サービス
@dealy :: nap 30 :: 30、例外処理:javax.net.ssl.SSLHan shakeException:致命的なアラートを受け取った:handshake_failure

私はset JAVA_OPTS="-Dhttps.protocols="TLSv1" -Djdk.tls.client.protocols="TLSv1" -Dcom.sun.net.ssl.checkRevocation=false -Ddeployment.security.TLSv1=true -Djavax.net.debug=ssl:handshake:verbose -Dsun.security.ssl.allowUnsafeRenegotiation=true -Djdk.tls.enableRC4CipherSuites=true -Ddeployment.security.TLSv1=true -Dhttps.cipherSuites=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

と私のJVMを開始した。しかし、まだエラーの乗り心地を得ることができませんでした。私はすでに多くの時間を費やしてきました。この問題を解決するのを手伝ってください。

+0

クライアントのtomcatインスタンスをJDK 1.7を使用するようにアップグレードできますか?私はJDK1.6がTLS1に問題があることを発見しました –

+0

いいえ、私はjdk 1.6をレガシーアプリケーションとしてアップグレードできません。 HTTPで通信が行われていますが、HTTPSで失敗しています – sss121522

答えて

0

私の問題の解決策を見つけました。 1.何が起こったのですか?デフォルトで のJava 6 TLSv1のprotocol.Theハンドシェイクメッセージのフォーマットはsslv2Clientハロー@dealy

で使用しているにもかかわらず、ハンドシェイクのためのSSlv2Client Helloメッセージを使用しています:: 30 :: 30昼寝、WRITE:SSLv2のクライアントハローメッセージ、長さ= 101

私のサーバーは、セキュリティ上の理由で無効にSSLv3と、

jdk.tls.disabledAlgorithms =のSSLv3

をjavaの8を使用しています私のクライアントはsslv2Clientハローメッセージを送ったとして

これは、TLSv1のプロトコルはバグとして報告通信.Itsのために選びだしたにもかかわらず、私のハンドシェイクメッセージの失敗の原因となった:あなたは、JVMでのSSLv3を無効にした場合

https://serverfault.com/questions/637880/disabling-sslv3-but-still-supporting-sslv2hello-in-apache

それまた、sslv2Clientを無効にするHelloメッセージのサポート

2.私は何をしましたか? apache httpClientは、デフォルトで通信に常にjvmの元のプロトコルスタックを使用します。なぜ、私のjvm引数がhttpclientで動作していないのですか?

したがって、次のコードを追加して、httpclient SSL通信をオーバーライドしました。

  SSLContext sslContext = SSLContexts.custom() 
      .useTLS() 
      .build(); 

     SSLConnectionSocketFactory f = new SSLConnectionSocketFactory(
      sslContext, 
      new String[]{"TLSv1"}, 
      null, 
      SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 


     HttpClient hc = HttpClients.custom() 
      .setSSLSocketFactory(f) 
      .build(); 

最後に、Apache HTTPクライアントは通信用のTLSv1形式のハンドシェイクメッセージを開始しました。

私は、これは

はありがとうと同じ問題に直面して誰かを助けることを願っています。

+0

'ALLOW_ALL_HOSTNAME_VERIFIER'はコードがすべての証明書を信頼できるようにしますが、これはお勧めしません。 –

+0

ピンインしてくれてありがとう! – sss121522

関連する問題