為了賬號安全,請及時綁定郵箱和手機立即綁定

SSL證書服務器名稱是如何解析的/我可以使用keytools添加其他名稱嗎?

/ 猿問

SSL證書服務器名稱是如何解析的/我可以使用keytools添加其他名稱嗎?

qq_笑_17 2019-06-21 17:46:42

SSL證書服務器名稱是如何解析的/我可以使用keytools添加其他名稱嗎?

為了清楚起見,這些問題的措辭可能是不同的,但它們都與同一問題有關。

SSL證書服務器名稱是如何解析的?

為什么瀏覽器似乎使用證書的cn字段,而Java的機制似乎只關注“Subject Alternative Name”?

是否可以使用KeyTool向SSL證書添加其他名稱?如果沒有,那么使用OpenSSL代替OpenSSL是一個好的選擇嗎?

只是一些背景:我需要一個主服務器來使用HTTPS與多個服務器進行通信。顯然,我們不想為每個服務器購買SSL證書(可能有很多),所以我想使用自簽名證書(我一直在使用KeyTool來生成它們)。在我將證書添加到操作系統中后,瀏覽器(IE和Chrome)很高興地接受連接為受信任的。但是,即使在將證書添加到Java的仙人掌之后,Java仍然不會接受信任的連接,并拋出以下異常:

引發原因:java.security.cert.CertificateException:在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)com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509 TrustManagerImpl.java:250)com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Clien tHandshaker.java:1185).

我發現我可以讓Java信任實現我自己的HostNameVerifier的證書,我從這里復制了該證書:com.sun.jbi.internal.security.https.DefaultHostnameVerifier只是為了測試(順便說一下,作為參數傳遞給HostnameVerifier的主機名是正確的,所以我認為它應該被接受)。

我一直使用證書字段cn作為主機名(通常是IP地址)。

有人能告訴我,如果我做錯了什么,并指出我的正確方向嗎?


查看完整描述

3 回答

?
富國滬深

應如何進行主機名驗證的定義為RFC 6125,這是最近出現的,它將實踐推廣到所有的協議中,并取代了RFC 2818,這是HTTPS特有的。(我甚至不確定Java 7是否使用了RFC 6125,這可能是最近才使用的。)

從…RFC 2818(3.1節):

如果存在dNSName類型的SubtAltName擴展,則必須將其用作標識。否則,必須使用證書主題字段中的(最特定的)公共名稱字段。雖然使用通用名稱是現有的做法,但不贊成使用該名稱,并鼓勵證書頒發機構使用dNSName。

[...]

在某些情況下,URI被指定為IP地址而不是主機名。在這種情況下,IPAddress SubtAltName必須存在于證書中,并且必須與URI中的IP完全匹配。

本質上,您所遇到的具體問題來自于您使用的是CN中的IP地址,而不是主機名。有些瀏覽器可能會工作,因為并不是所有的工具都嚴格遵循這個規范,特別是因為RFC 2818中的“最特定”沒有明確定義(參見RFC 6215中的討論)。

如果你用keytool在Java 7中,keytool具有包含主題可選名稱的選項(請參閱文檔中的-ext):你可以用-ext san=dns:www.example.com-ext san=ip:10.0.0.1.

編輯:

您可以在OpenSSL中通過更改openssl.cnf(據我所知,如果您不想編輯全局配置,它將選擇當前目錄中的副本,或者可以使用OPENSSL_CONF環境變量)。

設置以下選項(請先在括號中找到適當的部分):

[req]req_extensions = v3_req[ v3_req ]subjectAltName=IP:10.0.0.1# or subjectAltName=DNS:www.example.com

這里還有一個很好的技巧來使用環境變量(而不是在配置文件中修復它):http://www.crsr.net/Notes/SSL.html


查看完整回答
反對 回復 2019-06-21
?
DIEA

這種情況下,在證書中使用IP地址將是一個更大的問題。可能更改IP地址是DNS的用途。通過使用動態DNS服務和使用具有該名稱的證書(或任何解決該動態名稱的CNAME),您更有可能解決問題

查看完整回答
反對 回復 2019-06-21
?
守著星空守著你

請注意,您可以在另一臺機器上使用Java 7中的keyTool,并在以后復制密鑰存儲庫(您不必運行Java 7)。或者,我已經為使用OpenSSL編輯了我的答案。盡管如此,從長遠來看,您可能會發現使用主機名而不是IP地址更靈活(無論如何,使用SAN是個好主意)

查看完整回答
反對 回復 2019-06-21

添加回答

回復

舉報

0/150
提交
取消
意見反饋 幫助中心 APP下載
官方微信
上海时时乐平台