2015-08-17 76 views
0

我從具有有效證書和域的站點的簡單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。字首。

+0

好奇。嘗試在getSession()之前調用'startHandshake()'。它應該沒有任何區別,但... – EJP

+0

感謝您的建議,它給了我更多的追蹤路徑。 – AlbertoK

回答

0

又很奇怪。

如果握手失敗,我預計getSession()將引發相同的異常,因爲如果需要AFAIK它會調用startHandshake()

它看起來像對方不會說TLSv1.2或可能想要RC4。

我建議你通過HandshakeCompletionListener獲得同行證書,而不是你現在這樣做。這樣,將會失敗的是套接字上的第一個I/O,而不是getPeerCertificate().在監聽器中,如果您不喜歡對等證書,則可以關閉套接字。

+0

乾杯,現在執行。我想我只需要允許RC4密碼,因爲那裏仍然有服務器在使用它。 – AlbertoK