2012-01-05 91 views
26

我正在使用openssl創建自簽名證書。我得到這個錯誤與我生成的證書: javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:沒有主題備選名稱存在如何將主題名稱添加到ssl證書?

有誰知道如何指定「主題替代名稱」,而創建一個證書? 這是我要生成一個密鑰:

sudo $JAVA_HOME/bin/keytool -genkey -dname "CN=192.168.x.xxx, OU=I, O=I, L=T, ST=On, C=CA" -alias tomcat -validity 3650 -keyalg RSA -keystore /root/.keystore -keypass abcd -storepass abcd 

生成一個密鑰:

openssl s_client -connect 192.168.x.xxx:8443 2>/dev/null 

請幫幫忙!謝謝!

+0

可能重複[?如何SSL證書服務器名稱解析/我可以添加使用密鑰工具替代名稱]( http://stackoverflow.com/questions/8443081/how-are-ssl-certificate-server-names-resolved-can-i-add-alternative-names-using) – Bruno 2012-01-05 15:13:06

+0

@藍寶石:我不明白你的問題。主題備用名稱不是X.509證書中的必需擴展名。因此,如果您擁有沒有它的證書,則沒有問題。那麼你如何得到這個異常? – Cratylus 2012-01-06 19:15:26

+0

@ user384706你可以看看這個問題嗎?即使我對爲什麼拋出這個錯誤感到困惑。 [http://stackoverflow.com/questions/8759956/failed-to-create-service-exception-javax-xml-ws-webserviceexception/8760118#8760118] – Sapphire 2012-01-06 19:17:37

回答

37

儘管this question更具體地說是關於Subject Alt中的IP地址。名稱和命令類似(使用主機名稱的DNS條目和IP地址的IP條目)。

要引用自己:

如果您使用keytool,爲Java 7, keytool有一個選項 包括主題備用名稱(見-ext文檔 表中的):你可以使用-ext SAN = DNS:www.example.com或-ext SAN = IP:10.0.0.1

請注意,您只需要Java 7中的keytool使用此命令。一旦你準備好了你的密鑰庫,它應該可以與以前的Java版本一起工作。

(這個答案的其餘部分也提到了如何與OpenSSL的做到這一點,但它似乎並沒有被你使用的是什麼。)

+0

我無法更改爲Java7。有沒有辦法繞過我的Java代碼中的主題替代名稱檢查? – Sapphire 2012-01-05 16:04:40

+3

不要避免這種檢查。正如我所說的,你只需要Java 7就可以使用這個'keytool'命令。一旦完成,您應該能夠使用Java 6(或更低版本)安裝的JKS文件(它甚至不必位於同一臺計算機上)。或者,您可以使用OpenSSL生成這個(自簽名)證書(命令和設置可能更復雜一些):您可以將使用OpenSSL生成的PEM密鑰/證書變爲.p12文件並直接使用它從Java作爲使用密鑰庫類型「PKCS12」的密鑰庫。你也可以使用主機名而不是IP地址:你可以脫離CN。 – Bruno 2012-01-05 16:16:24

+0

我使用了一個主機名,而不是像你所建議的,我得到了這個:沒有找到與myhostname.com匹配的名字。 – Sapphire 2012-01-05 16:36:44

12

IP和DNS可以用keytool附加參數指定'-ext SAN = dns:abc.com,ip:1.1.1.1'

示例: keytool -genkeypair -keystore keystore -dname「CN =測試,OU =未知,O =未知,L =未知,ST =未知,C =未知「-keypass keypwd -storepass storepass -keyalg RSA -alias unknown -ext SAN = dns:test.abc.com,ip:1.1.1.1

+3

請注意,上述命令不會**創建​​CSR。 Java的keytool以密鑰存儲區中的自簽名證書的形式創建密鑰對,SAN屬性將進入該自簽名證書。如果要發佈具有SAN屬性的CSR,則需要將相同的-ext參數傳遞給'keytool -certreq'。有趣的是,keytool的自我記錄幫助確實不包括-ext選項,儘管keytool確實處理了-ext。 – avarvit 2016-12-08 10:03:06

+0

@avarvit這意味着我可以在CSR中添加altNames,即使這些未使用調用'-genkeypair'。從CSR獲取證書時會發生什麼?密鑰工具導入它並鏈接到正確的私鑰?這是一種將altName添加到錯過它的證書的可能方式嗎? – eppesuig 2017-04-21 07:47:42

+0

感謝您添加完整的示例 – Tom 2018-01-31 16:26:36