2016-07-13 18 views
2

JavaアプリケーションのWebソケットサーバーにセキュアWebソケットを使用して接続するためのコードがあります。Webソケットサーバーに接続しようとしたときにX509TrustManagerの実装が利用できないというエラーが発生しました

private boolean openConnection(boolean tried) { 
    String sslFile = 
     ConfigMgr.getValue(Constants.SSL_CFG_NAME, "sslfile"); 
    String sslPassword = 
     ConfigMgr.getValue(Constants.SSL_CFG_NAME, "sslpassword"); 
    try { 
     System.setProperty("javax.net.ssl.trustStore", 
       //sslFile); 
     System.setProperty("javax.net.ssl.trustStorePassword", sslPassword); 
     System.out.println(System.getProperty("javax.net.ssl.trustStore")); 
     System.out.println(System.getProperty("javax.net.ssl.trustStorePassword")); 
    } catch (Exception e) { 
     if (!tried) { 
      logger.error("unable to get certificates", e); 
     } 
     return false; 
    } 
    try { 
     WebSocketContainer container = ContainerProvider 
       .getWebSocketContainer(); 
     container.connectToServer(this, new URI(websocketServer)); 
    } catch (Exception e) { 
     // only log error trying to connection to web application first 
     // time 
     if (!tried) { 
      logger.error("error while trying to connect daemon to websocket" 
        + " server", e); 
     } 
     return false; 
    } 
    return true; 
} 

私はprint文

System.setProperty("javax.net.ssl.trustStorePassword", sslPassword); 

System.out.println(System.getProperty("javax.net.ssl.trustStore")); 

をから見ることができる内容と正しいパスワードと証明書(この場合は.cer

-----BEGIN CERTIFICATE----- 
MIIDmTCCAoGgAwIBAgIEB/pKmDANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJV 
UzELMAkGA1UECBMCUEExGDAWBgNVBAcTD0ZvcnQgV2FzaGluZ3RvbjEXMBUGA1UE 
ChMOTWlrcm9zIFN5c3RlbXMxFzAVBgNVBAsTDk1pa3JvcyBTeXN0ZW1zMRUwEwYD 
VQQDEwxKYXNvbiBSaWNsZXMwHhcNMTYwNjIyMTcwOTQ0WhcNMTYwOTIwMTcwOTQ0 
WjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCUEExGDAWBgNVBAcTD0ZvcnQgV2Fz 
aGluZ3RvbjEXMBUGA1UEChMOTWlrcm9zIFN5c3RlbXMxFzAVBgNVBAsTDk1pa3Jv 
cyBTeXN0ZW1zMRUwEwYDVQQDEwxKYXNvbiBSaWNsZXMwggEiMA0GCSqGSIb3DQEB 
AQUAA4IBDwAwggEKAoIBAQCsha/dfnWIibmtySZuE8H+3AOa8/QuARKsFgmZJmWZ 
ZErjlzN6liUO1Q9pzYXoka69tiIOw0KDWwGAHCAK8mjNpdcs9XiYq3QMZjNAUhqP 
rRU5oDn9jwCwQnpepBhH6uiMaBcvrMsvLTaD4HvwoVyMROEhIWywBYMdHk86gcGr 
ALz+iMhE8017CAA2n/35fqwDjxeGxDgY3Ove/fTKoeA+ItKOwsYeFZUeej9omTz+ 
UcdXJ6fu312At/Sh7YZpgP3LsX+rMfdD9sHn80UTy46UoT5UNW0Me40+S47/oh4H 
VeOeR5XpcBPHnqbAJAvPAqD/sF9xbvhESwfoSkMB26drAgMBAAGjITAfMB0GA1Ud 
DgQWBBQ7YV0yIawkjCCp0crz52BGwMPHnzANBgkqhkiG9w0BAQsFAAOCAQEAdmwo 
8ZXZMxKzyfolVKj2UQBzkeSies133nRns0jFbkzm8N4lNtcWiShfLtlTQAuUZNMl 
JK7Eax+weLq7tNMZyBdLWse8E4oe8m3XY/Xe7oQGs2EzdlHVZk7JuDHU63mC33cz 
xvoNutE+y1Zonce9WaxACuNNMuxyYTVg6yqz/psjYE2YOajc1MmXjI38FkfmQ1bL 
ByeNEvnLT1IcQ0OmaSuk2ESj144y/EtkN9/GKFOTPjSRL3zIStNBytn7WNlFV/ch 
qaF/eOJRQMlHDosX40IrkHHIoc/pbTKYmjoreC/+biMKc0gUk+EN/uBrcJrVRFnl 
dXTNJe6/sNzvkTc/IA== 
-----END CERTIFICATE----- 

ar eが正しく設定されています。

私はcontainer.connectToServer(this, new URI(websocketServer));

javax.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection failed 
     at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:434) ~[tomcat7-websocket.jar:7.0.68] 
     at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:184) ~[tomcat7-websocket.jar:7.0.68] 
     at 
cored.web.CoreWebSocket.openConnection(CoreWebSocket.java:278) [cored.jar:3.0.10.160712122615] 
     at cored.web.CoreWebSocket.establishConnection(CoreWebSocket.java:1150) [cored.jar:3.0.10.160712122615] 
     at 
cored.web.CoreWebSocket.access$100(CoreWebSocket.java:85) [cored.jar:3.0.10.160712122615] 
     at 
cored.web.CoreWebSocket$2.execute(CoreWebSocket.java:138) [cored.jar:3.0.10.160712122615] 
     at utils.AThread.run(AThread.java:51) 
[utils.jar:3.0.10.160712122615] 
    Caused by: java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: General SSLEngine problem 
     at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$WrapperFuture.get(AsyncChannelWrapperSecure.java:511) ~[tomcat7-websocket.jar:7.0.68] 
     at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:379) ~[tomcat7-websocket.jar:7.0.68] 
     ... 6 more 
    Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem 
     at sun.security.ssl.Handshaker.checkThrown(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.SSLEngineImpl.writeAppRecord(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.SSLEngineImpl.wrap(Unknown Source) ~[?:1.8.0_92] 
     at javax.net.ssl.SSLEngine.wrap(Unknown Source) ~[?:1.8.0_92] 
     at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$WebSocketSslHandshakeThread.run(AsyncChannelWrapperSecure.java:371) ~[tomcat7-websocket.jar:7.0.68] 
    Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem 
     at sun.security.ssl.Alerts.getSSLException(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.SSLEngineImpl.fatal(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker.fatalSE(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker.fatalSE(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker.processLoop(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker$1.run(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker$1.run(Unknown Source) ~[?:1.8.0_92] 
     at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker$DelegatedTask.run(Unknown Source) ~[?:1.8.0_92] 
     at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$WebSocketSslHandshakeThread.run(AsyncChannelWrapperSecure.java:397) ~[tomcat7-websocket.jar:7.0.68] 
    Caused by: java.security.cert.CertificateException: No X509TrustManager implementation available 
     at sun.security.ssl.DummyX509TrustManager.checkServerTrusted(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker.processLoop(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker$1.run(Unknown Source) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker$1.run(Unknown Source) ~[?:1.8.0_92] 
     at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_92] 
     at sun.security.ssl.Handshaker$DelegatedTask.run(Unknown Source) ~[?:1.8.0_92] 
     at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$WebSocketSslHandshakeThread.run(AsyncChannelWrapperSecure.java:397) ~[tomcat7-websocket.jar:7.0.68] 

を実行すると、以下のエラーが印刷されます私のコードを実行したときしかし、私はそれはまた、Tomcatのウェブサーバ上で使用していないがありますされているので、私が使用しています.cerファイルが破損していないことを知っています問題。

No X509TrustManager implementation availableのエラーは何か起こっている可能性がありますか?

答えて

5

.cerファイルはトラストストアの有効なタイプではありません。システム変数javax.net.ssl.trustStoreTypeを使用してタイプを設定することができます。デフォルトではJKSに設定されていますが、PKCS12なども使用できます。

JKSファイルを作成し、.cerファイルを含める必要があります。私は私がすべき `.cer`種類にシステム変数との信頼ストアを設定している場合

keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
+0

のでJKSの使用に.cerファイルをインポートするにはtrusttoreにも

System.setProperty("javax.net.ssl.trustStore", "path/to/truststore"); System.setProperty("javax.net.ssl.trustStorePassword", truststorepassword); 

をパスワードを設定元気? '.cer'を使用する必要があり、セキュリティ上の懸念があるため、回避策を見つけることができません。 – jgr208

+0

JDKで受け入れられるKeyStoreファイルタイプではないため、 '.cer'ファイル自体を使用することはできません。あなたは '.cer'の内容をJKSファイルに含める必要があります。セキュリティレベルは同じです。単なるフォーマット変換の問題です。 .cer – pedrofb

+0

ありがとうございました。私があきらめてここに来なければならないまで、約3日間私を連れて行きました。 – jgr208

関連する問題