自签名证书:DNSName组件必须以字母开头

zkr*_*tic 12 java wildcard-subdomain certificate self-signed keytool

有没有办法让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
Run Code Online (Sandbox Code Playgroud)

但我明白了 IOException: DNSName components must begin with a letter

显然,问题出*.example.com在SAN中,但我没有看到为example.com子域生成自签名证书的其他方法.

根据这个,应该是可以的.我的语法错误,keytool中的错误,或者我误解了什么?

顺便说一下,我正在使用JDK 1.8 update 60中的keytool

编辑我设法example.com通过指定生成所有子域的自签名证书CN=*.example.com,并将SAN留空.尽管如此,我将Omikron的答案视为已被接受(因为它是一个真正的答案,而不是绕过限制).

Omi*_*ron 20

Keytool在内部使用该类sun.security.x509.DNSName来检查输入.DNSName强制执行RFC 1034中指定的语法.引用它的Javadoc评论:

名称必须在RFC 1034指定的"首选名称语法"中.

首选名称语法是:

<domain> ::= <subdomain> | " "
<subdomain> ::= <label> | <subdomain> "." <label>
<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig-hyp> ::= <let-dig> | "-"
<let-dig> ::= <letter> | <digit>
<letter> ::= any one of the 52 alphabetic characters A through Z in
upper case and a through z in lower case
<digit> ::= any one of the ten digits 0 through 9
Run Code Online (Sandbox Code Playgroud)

因此,根据这种语法,域名必须以字母(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,并不强制实施这些限制.

  • @zkristic 如果你不喜欢SF,你可以从GitHub下载:https://github.com/kaikramer/keystore-explorer/releases (2认同)