爲了清楚起見,這些可能被視爲單獨的問題,但它們都與相同的問題有關。如何解析SSL證書服務器名稱/我可以使用keytool添加替代名稱嗎?
如何解決SSL證書服務器名稱?
爲什麼瀏覽器似乎使用證書的CN字段,但Java的機制似乎只看「主題替代名稱」?
是否可以使用keytool向SSL證書添加替代名稱? 如果沒有,是使用openSSL而不是一個好的選擇?
只是一點點背景:我需要一個主服務器來與使用HTTPS的多個服務器進行通信。顯然,我們不想爲每臺服務器購買SSL證書(可能有很多),所以我想使用自簽名證書(我一直在使用keytool來生成它們)。在操作系統中添加可信的證書後,瀏覽器(IE和Chrome)很高興地將連接接受爲可信。然而,即使添加了證書與Java的cacerts中之後,Java的仍然不會爲信任接受連接,並拋出以下異常:
產生的原因:java.security.cert.CertificateException:沒有主題備用名稱 本 at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:142) at sun.security.util.HostnameChecker.match(HostnameChecker.java:75) at com.sun.net.ssl.internal.ssl。 X509TrustManagerImpl.checkIdentity(X509T rustManagerImpl.java:264) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted( X509TrustManagerImpl.java:250) 在com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(CLIEN tHandshaker.java:1185) ...... 14多個
我發現我可以信任的Java實現的證書我自己的HostNameVerifier,我從這裏複製:com.sun.jbi.internal.security.https.DefaultHostnameVerifier只是爲了測試(順便說一下,作爲HostnameVerifier的參數傳遞的主機名是正確的,所以我認爲它應該被接受)。
我一直在使用證書字段CN作爲主機名(通常是IP地址)。
有人可以告訴我,如果我做錯了什麼,並指出我在正確的方向嗎?
鏈接已損壞。 – axiopisty
選擇您的替代方案:http://grepcode.com/search?query=DefaultHostnameVerifier&n= – Renato