2017-08-21 28 views
1

クライアント認証が有効なサーバーにHttpClient経由でHTTP POSTをポストしようとしています。メッセージを投稿しながら、ここに私は自分のキーストアでそれを実行すると、私のコード投稿メッセージが表示されているときに「Unrecognized Windows Sockets error:0:recv failed」と表示されました

public class Send2Remote { 

private static String sslMode = null; 
private static String clientKeyStore = null; 
private static String clientStoreType = null; 
private static String clientStorePW = null; 

private static String trustKeyStore = null; 
private static String trustStoreType = null; 
private static String trustStorePW = null; 

public Send2Remote(String sslmode, String clientKS, String clientST, String clientTPW, 
     String trustKS, String trustST, String trustSPW) { 
    sslMode = sslmode; 
    clientKeyStore = clientKS; 
    clientStoreType = clientST; 
    clientStorePW = clientTPW; 

    trustKeyStore = trustKS; 
    trustStoreType = trustST; 
    trustStorePW = trustSPW; 
} 

private final class X509HostnameVerifierImplementation implements X509HostnameVerifier { 
    @Override 
    public void verify(String host, SSLSocket ssl) throws IOException { 
    } 

    @Override 
    public void verify(String host, X509Certificate cert) throws SSLException { 
    } 

    @Override 
    public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException { 
    } 

    @Override 
    public boolean verify(String s, SSLSession sslSession) { 
     return true; 
    } 
} 

public String post(String uRL, List<NameValuePair> formparams) {   
    SSLContext sslContext = null; 
    KeyManagerFactory kmf = null; 
    TrustManagerFactory tmf = null; 
    KeyStore ks = null; 
    KeyStore tks = null; 
    try {   
     sslContext = SSLContext.getInstance(sslMode); 
     kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 

     ks = KeyStore.getInstance(clientStoreType); 
     tks = KeyStore.getInstance(trustStoreType); 

     ks.load(new FileInputStream(clientKeyStore), clientStorePW.toCharArray()); 
     tks.load(new FileInputStream(trustKeyStore), trustStorePW.toCharArray()); 

     kmf.init(ks, clientStorePW.toCharArray()); 
     tmf.init(tks); 

     sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

    } catch (NoSuchAlgorithmException | CertificateException | IOException | KeyStoreException | UnrecoverableKeyException | KeyManagementException e1) { 
     Log4j.log.error("Error occurred: " + e1.getClass() + ":" + e1.getMessage() + ", Full Stacktrace: " + new Gson().toJson(e1.getStackTrace())); 
     return null; 
    } 

    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
      sslContext, new X509HostnameVerifierImplementation()); 

    Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder 
      .<ConnectionSocketFactory> create().register("https", sslsf) 
      .build(); 

    PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(
      socketFactoryRegistry); 
    CloseableHttpClient httpclient = HttpClients.custom() 
      .setConnectionManager(cm).build(); 

    HttpPost httppost = new HttpPost(uRL); 

    UrlEncodedFormEntity uefEntity; 
    String returnCode = null; 
    try { 
     uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); 
     httppost.setEntity(uefEntity); 

     CloseableHttpResponse response = httpclient.execute(httppost); 
     try { 
      HttpEntity entity = response.getEntity(); 
      if (entity != null) { 
       returnCode = EntityUtils.toString(entity, "UTF-8"); 
      } 
     } finally { 
      response.close(); 
     } 
    } catch (ClientProtocolException e) { 
     Log4j.log.error("Error occurred: " + e.getClass() + ":" + e.getMessage() + ", Full Stacktrace: " + new Gson().toJson(e.getStackTrace())); 
     return null; 
    } catch (UnsupportedEncodingException e1) { 
     Log4j.log.error("Error occurred: " + e1.getClass() + ":" + e1.getMessage() + ", Full Stacktrace: " + new Gson().toJson(e1.getStackTrace())); 
     return null; 
    } catch (IOException e) { 
     Log4j.log.error("Error occurred: " + e.getClass() + ":" + e.getMessage() + ", Full Stacktrace: " + new Gson().toJson(e.getStackTrace())); 
     return null; 
    } finally { 
     try { 
      httpclient.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      close(httpclient); 
     } 
    } 
    return returnCode; 
} 

public void close(Closeable io) { 
    if (io != null) { 
     try { 
      io.close(); 
     } catch (IOException ignore) { 
     } 
    } 
} 

} 

で、私は例外だ

class javax.net.ssl.SSLHandshakeException:java.net.SocketException: Unrecognized Windows Sockets error: 0: recv failed 

、サーバー管理者は、私に彼のログ

[2017/8/21 20:10:16:477 CST] 000000f7 SystemOut  O WebContainer : 20, WRITE: TLSv1.2 Handshake, length = 96 
[2017/8/21 20:10:16:477 CST] 000000f7 SystemOut  O WebContainer : 20, waiting for close_notify or alert: state 1 
[2017/8/21 20:10:16:477 CST] 000000f7 SystemOut  O WebContainer : 20, Exception while waiting for close java.net.SocketException: Unrecognized Windows Sockets error: 0: recv failed 
[2017/8/21 20:10:16:477 CST] 000000f7 SystemOut  O %% Invalidated: [Session-18, SSL_ECDHE_RSA_WITH_AES_256_CBC_SHA384] 
[2017/8/21 20:10:16:477 CST] 000000f7 SystemOut  O WebContainer : 20, SEND TLSv1.2 ALERT: fatal, description = handshake_failure 
[2017/8/21 20:10:16:477 CST] 000000f7 SystemOut  O WebContainer : 20, WRITE: TLSv1.2 Alert, length = 80 
[2017/8/20 20:10:16:477 CST] 000000f7 SystemOut  O WebContainer : 20, Exception sending alert: java.net.SocketException: Unrecognized Windows Sockets error: 0: socket write error 
[2017/8/20 20:10:16:477 CST] 000000f7 SystemOut  O WebContainer : 20, called closeSocket() 
[2017/8/20 20:10:16:477 CST] 000000f7 SystemOut  O WebContainer : 20, handling exception: javax.net.ssl.SSLHandshakeException: java.net.SocketException: Unrecognized Windows Sockets error: 0: recv failed 

Serverの一部を与えました私はお互いの証明書を自分の信頼キーストアに追加したので、お互いを信頼するという問題ではありません。しかし、私はこの問題も解決できる他のスレッドを見つけることができません。

+0

:これを行うには、これは以下の JVMオプションを設定に追加しますか? – Rizwan

+0

@Rizwan 9443、サーバー管理者によると – user6309529

+0

証明書と証明書チェーンが既にサーバー側で信頼できる部分として追加されているかどうかを確認することはできますか? Webコンテナにアクセスしようとしていますか? – Rizwan

答えて

0

おそらくこれが問題を引き起こす可能性があります:IPv4とIPv6の両方が

サーバーを有効にしていますか?

原因:

Java仮想マシン(JVM)はIPv4とIPv6の両方がWindowsサーバ上で有効になっているときに、オペレーティングシステムレベルでソケットを開いたり、閉じ問題を抱えていることができます。

考えられる修正:可能であれば

JVMは、IPv4の上で実行する必要があります。あなたがSSL経由で接続しようとしているポート
-Djava.net.preferIPv4Stack = trueを

+0

私はサーバー管理者に尋ねて、この行を起動引数に入れて再起動しましたが、同じ問題が続いています – user6309529

+0

@ user6309529サーバーとの接続を開くクライアントマシンに同じ引数を入れます。 – Rizwan

+0

まだ追加されていますが、これまでと同じですが、悲しい – user6309529

関連する問題