How to add subject alernative name to ssl certs?
我正在使用openssl创建自签名证书。 我生成的证书出现此错误:
javax.net.ssl.SSLHandshakeException:
java.security.cert.CertificateException: No subject alternative names
present
有谁知道在创建证书时如何指定"主题备用名称"?
这就是我生成密钥库的方式:
1
| 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 |
生成密钥:
1
| openssl s_client -connect 192.168.x.xxx:8443 2>/dev/null |
请帮忙! 谢谢!
-
SSL证书服务器名称如何解析的可能重复项/是否可以使用keytool添加备用名称?
-
// @蓝宝石:我不明白你的问题。 X.509证书中的使用者备用名称是NOT的必需扩展名。因此,如果您有一个没有此证书的证书,则没有问题。 那么,您如何获得此例外?
-
@ user384706您能看看这个问题吗? 就连Im都对它为什么引发此错误感到困惑。 [stackoverflow.com/questions/8759956/
-
@Sapphire:在另一个线程中回复
-
可接受的答案是Java。 为此,请使用以下答案:security.stackexchange.com/a/91556
-
为了回应2012年初的@Cratylus评论,Chrome现在不再接受"通用名称",而需要使用" SAN"字段。 (在短期内,配置更改可以恢复为旧的行为。该设置最终将被删除,从而强制采用SAN。)
尽管此问题更具体地与主题替代中的IP地址有关。 名称,命令是相似的(使用DNS条目作为主机名,使用IP条目作为IP地址)。
引用我自己:
If you're using keytool, as of Java 7, keytool has an option to
include a Subject Alternative Name (see the table in the documentation
for -ext): you could use -ext san=dns:www.example.com or -ext
san=ip:10.0.0.1
请注意,您只需要Java 7的keytool来使用此命令。 一旦准备好密钥库,它就可以与Java的早期版本一起使用。
(此答案的其余部分还提到了如何使用OpenSSL进行此操作,但这似乎并不是您所使用的。)
-
我无法更改为Java7。有没有办法绕过我的Java代码中的subjectalternativename检查?
-
不要避免此检查。就像我说的那样,您只需要Java 7即可使用此keytool命令。完成后,您应该可以在Java 6(或更低版本)安装中使用JKS文件(它甚至不必在同一台计算机上)。或者,您可以使用OpenSSL生成此(自签名)证书(命令和设置可能会更复杂):您可以将用OpenSSL生成的PEM密钥/证书转换为.p12文件,并直接从使用密钥库类型PKCS12将Java作为密钥库。您也可以使用主机名代替IP地址:您可以摆脱CN。
-
我改用了主机名,就像您建议的那样,我得到了:找不到与myhostname.com匹配的名称。
-
好吧,您需要使用配置为与该IP地址匹配的主机名(在DNS或主机文件中)。如果您不熟悉这些概念,那么听起来像在某个地方安装Java 7可能是您最简单的解决方案。
-
我用" myip myhostname"更新了/ etc / hosts文件,并在证书中使用了myhostname。
IP和DNS都可以使用keytool附加参数-ext SAN=dns:abc.com,ip:1.1.1.1指定
例:
1
| keytool -genkeypair -keystore <keystore> -dname"CN=test, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown" -keypass <keypwd> -storepass <storepass> -keyalg RSA -alias unknown -ext SAN=dns:test.abc.com,ip:1.1.1.1 |
-
请注意,以上命令不会创建CSR。 Java的keytool在密钥存储区中以自签名证书的形式创建一个密钥对,并且SAN属性进入该自签名证书。如果要发布具有SAN属性的CSR,则需要将相同的-ext参数传递给keytool -certreq。有趣的是,尽管keytool可以正常处理-ext,但keytool的自文档帮助不包含-ext选项。
-
@avarvit这意味着即使不使用调用-genkeypair的altName,我也可以在CSR中添加它们。从带有此CSR的CA收到证书时会发生什么? Woule keytool导入它并链接到正确的私钥?这是将altName添加到错过它的证书中的一种可能的方式吗?
-
感谢您添加完整的示例
生成CSR时,可以再次指定-ext属性以将其插入CSR
1
| keytool -certreq -file test.csr -keystore test.jks -alias testAlias -ext SAN=dns:test.example.com |
此处的完整示例:如何使用keytool使用SAN创建CSR