自签名证书:DNSName组件必须以字母开头
有没有办法让java的keytool在SAN中使用通配符生成自签名证书(主题备用名称)? 我正在使用此命令生成密钥库:
keytool -genkey -alias tomcat -storetype JKS -keyalg RSA -keysize 2048 -ext san=dns:*.example.com -keystore "path/to/my/keystore.jks" -validity 3650
但我得到IOException: DNSName components must begin with a letter
显然,问题是SAN中的*.example.com
,但我没有看到为example.com
子域生成自签名证书的其他方法。
据此,它应该是可能的。 这是我的语法错误,keytool中的错误,还是我误解了什么?
顺便说一句,我正在使用JDK 1.8 update 60中的keytool
编辑我设法通过指定CN=*.example.com
,并将SAN留空,通过keytool为所有example.com
子域生成自签名证书。 尽管如此,我会将Omikron的答案视为已被接受(因为它是一个真正的答案,而不是绕过限制)。
Keytool在内部使用类sun.security.x509.DNSName
来检查输入。 DNSName强制执行RFC 1034中指定的语法。 引用它的Javadoc评论:
名称必须在RFC 1034指定的“首选名称语法”中。
首选名称语法是:
::= | " " ::=
因此,根据这种语法,域名必须以字母(AZ,az)开头。
较新的RFC(例如RFC 2181 , RFC 1123 )正在放宽这些限制,因此这可以被视为Java中的一个错误。 已经有几个相关的错误报告:
https://bugs.openjdk.java.net/browse/JDK-8016345
https://bugs.openjdk.java.net/browse/JDK-8007706
所以,答案是否定的,目前无法使用keytool创建通配符SAN扩展。
但您可以使用KeyStore Explorer执行此操作。 它基本上是带有GUI的keytool,并不强制实施这些限制。