自签名证书: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.comexample.com

据此,这应该是可能的。是语法错误,keytool中的错误,还是我误解了什么?

顺便说一句,我使用的是JDK 1.8更新60中的keytool。

编辑我设法通过 keytool 为所有子域生成自签名证书,方法是指定 ,并将 SAN 留空。尽管如此,我还是会把Omikron的答案保留为被接受(因为这是一个实际的答案,而不是绕过限制)。example.comCN=*.example.com


答案 1

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

该名称必须采用 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

因此,根据这种语法,域名必须以字母(A-Z,a-z)开头。

较新的 RFC(例如 RFC 2181RFC 1123)正在放宽这些限制,因此这可以被视为 Java 中的一个错误。已经有几个相关的错误报告:


https://bugs.openjdk.java.net/browse/JDK-8016345 https://bugs.openjdk.java.net/browse/JDK-8007706

所以,答案是否定的,目前没有办法使用keytool创建通配符SAN扩展。

但是,您可以使用密钥库资源管理器来执行此操作。它基本上是带有GUI的keytool,并且不强制执行这些限制。


更新:此问题已在 Java 15 中修复:https://bugs.openjdk.java.net/browse/JDK-8186143


答案 2

推荐