2017-03-07 10 views
1

SNIを使用して証明書を提供するリモートサーバに接続しようとしています。コンパイルしてJava 7を使用してコードを実行するときにサーバーが終了していることに気付きました。サーバはHTTPクライアントとJava 7を使用して接続を終了します

以下は、この前提をテストするためのコードです。私はJavaのバージョンを切り替えてコードを実行し、異なる結果を得る。

public static void getRequest() throws IOException, NoSuchAlgorithmException, KeyManagementException { 
    String url = "https://sorry i can not share the exact url because of privacy concerns"; 

    HttpClient client = getClientInstance(); 
    HttpGet request = new HttpGet(url); 

    HttpResponse response = client.execute(request); 

    System.out.println("Response Code : " 
      + response.getStatusLine().getStatusCode()); 

    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

    StringBuffer result = new StringBuffer(); 
    String line = ""; 
    while ((line = rd.readLine()) != null) { 
     result.append(line); 
    } 
    System.out.println("####### the result is"); 
    System.out.println(result.toString()); 
} 

private static org.apache.http.client.HttpClient getClientInstance() throws KeyManagementException, NoSuchAlgorithmException { 
    RequestConfig defaultRequestConfig = RequestConfig.copy(RequestConfig.DEFAULT) 
      .setConnectTimeout(60 * 1000) 
      .setSocketTimeout(60 * 1000) 
      .setConnectionRequestTimeout(60 * 1000) 
      .build(); 

    return HttpClientBuilder.create().setDefaultRequestConfig(defaultRequestConfig).build(); 
} 

誰かがこのような問題を経験して修正しましたか?私は最終的な修正がJava 8を使用することであることを知っているが、デバッグしていたコードベース全体が膨大であり、Java 7ではうまく動作しない依存関係があるため、現在の時間制約内でできることではない。

スローされる例外は次のとおりです。

*** ClientHello, TLSv1 
RandomCookie: GMT: 1472095425 bytes = { 254, 51, 194, 246, 77, 6, 185, 8, 224, 187, 85, 225, 133, 128, 122, 1, 245, 13, 230, 239, 156, 93, 164, 184, 251, 159, 111, 60 } 
Session ID: {} 
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_SHA, TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_MD5, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 
Compression Methods: { 0 } 
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] 
Extension server_name, server_name: [host_name: lasclev.org] 
*** 
main, WRITE: TLSv1 Handshake, length = 169 
main, handling exception: java.net.SocketException: Connection reset 
main, SEND TLSv1 ALERT: fatal, description = unexpected_message 
main, WRITE: TLSv1 Alert, length = 2 
main, Exception sending alert: java.net.SocketException: Broken pipe 
main, called closeSocket() 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:196) 
    at java.net.SocketInputStream.read(SocketInputStream.java:122) 
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:442) 
    at sun.security.ssl.InputRecord.read(InputRecord.java:480) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359) 

また、先に行ったSSL Labsテストのスクリーンショットもあります。 SSL Labs test fragment

答えて

2

TLSv1のあなたは、それがサポートされているプロトコルを示していますSSLLabsレポートの一部を示さなかったが、私はこのサーバーが唯一のTLSv1.2または多分TLSv1.2とTLSv1.1をサポートしています賭けではなく、 .0。特に、PCI DSSの対象となる決済取引を扱うシステムは、BEASTへの過度の反応(明らかにNVDでは4.3のままであるが、それは受け入れられない)のため、TLSv1.0(「Early TLS」とも呼ばれる)の使用を禁止されている。この場合、サーバは、はアラート70を送信するか、71または40をリセット(または閉じる)するだけでよいはずです。 Java7(JSSE)クライアントは、デフォルトでTLSv1.2またはTLSv1.1を実行しません。

  • が適切ににSSLConnectionSocketFactory.setSSLSocketFactoryを構成し、または

  • 作成します - 私は4.5を持っている - しかし、私はあなたがいずれかのことができると思い

    それはHttpClientをのバージョンに依存してもよいです.useSystemProperties(true)を入力し、sysprop https.protocolsを適宜​​またはTLSv1.1,TLSv1.2javax.net.HttpsURLConnectionでも使用されます)に設定しますが、これは望ましくないその他の項目に影響する可能性があります(useSystemPropertiesのjavadocを参照)

+0

あなたが言っていることは完全に意味がありますが、それは私にとってはうまくいきませんでした。リモートサーバーは、私が制御できなかったものです。時間の制約のために、私は 'Runtime.getRuntime()。exec'を使ってcurlを使うことで、これに対して厄介な回避策を作りました。 – ivanorone

関連する問題