我從具有有效證書和域的站點的簡單SSLSocket(Java 8 u45)連接獲取證書驗證錯誤。在線程 「主」 javax.net.ssl.SSLPeerUnverifiedExceptionSSLSession未通過身份驗證
String hostName = "www.velocityfrequentflyer.com";
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) factory.createSocket(hostName, 443);
SSLSession session = sslsocket.getSession();
java.security.cert.Certificate certicates[] = session.getPeerCertificates();
X509Certificate cert = (X509Certificate) certicates[0]; //the peer certificate
System.out.println("cert.getIssuerDN().getName(): " + cert.getIssuerDN().getName());
System.out.println("cert.getSubjectDN().getName(): " + cert.getSubjectDN().getName());
例外:在sslconnecting.Sslconnecting同行未被認證 在sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:431) 。主要(Sslconnecting.java:33)
看着OpenSSL everthing的證書似乎是爲了包括www。前綴和我嘗試過這個網站的每個瀏覽器都很滿意證書。
openssl s_client -showcerts -connect www.velocityfrequentflyer.com:443 | openssl x509 -noout -text | less
採用X509v3擴展: 採用X509v3主題備用名稱: DNS:www.velocityfrequentflyer.com
有趣的是這個作品,如果我改變主機velocityfrequentflyer.com已我來說真的難住了。
有沒有辦法在沒有JAVA的情況下調用getPeerCertificates進行檢查?
我已經嘗試使用具有相同結果的TrustAll SocketFactory。
編輯1:
加入startHandshake()後,它似乎它的握手本身失敗:(全SSL調試:http://pastebin.com/ZKnjrGPR)
異常線程 「main」 javax.net .ssl.SSLHandshakeException:收到致命警報:handshake_failure at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl。 recvAlert(未知Sou RCE) 在sun.security.ssl.SSLSocketImpl.readRecord(來源不明) 在sun.security.ssl.SSLSocketImpl.performInitialHandshake(來源不明) 在sun.security.ssl.SSLSocketImpl.startHandshake(來源不明) 在陽光下.security.ssl.SSLSocketImpl.startHandshake(來源不明) 在sslconnecting.Sslconnecting.main(Sslconnecting.java:33)
編輯2.
原來的網站需要不安全的密碼套件RC4 ? java.security配置設置爲不使用它們。
jdk.tls.disabledAlgorithms = SSLv3的,RC4
然而只要RC4被允許握手完成。它仍然不能解釋爲什麼握手沒有www。字首。
好奇。嘗試在getSession()之前調用'startHandshake()'。它應該沒有任何區別,但... – EJP
感謝您的建議,它給了我更多的追蹤路徑。 – AlbertoK