java - 自签名证书 : DNSName components must begin with a letter

标签 java certificate keytool self-signed wildcard-subdomain

有没有办法让 java 的 keytool 在 SAN(Subject Alternative Name)中生成带有通配符的自签名证书?我正在使用此命令生成 keystore :

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 be begin with a letter

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

根据 this ,应该是可以的。是我的语法错误、keytool 中的错误,还是我误解了什么?

顺便说一句,我使用的是 JDK 1.8 update 60 的 keytool

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

最佳答案

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

The name MUST be in the "preferred name syntax," as specified by 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 扩展。

但你可以使用 KeyStore Explorer去做这个。它基本上是带有 GUI 的 keytool,并且不强制执行这些限制。


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

关于java - 自签名证书 : DNSName components must begin with a letter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33827789/

相关文章:

java - 在哪里可以找到 CTR 或 GCM 分组密码模式的 Java/Kotlin 实现?

java - 在列表与集合中搜索元素的复杂性

java - 使用 json 时应该使用哪些 jar 库

ssl - 证书中的 Hashicorp Vault SSL 主题备用名称

certificate - 使用我的 CA 签署证书

java - keytool 错误 bash : keytool: command not found

keytool - 在 NixOS 中使用 keytool 将证书添加到 jre cacert

java - 如何使用maven多模块springboot告诉spring从自定义目录加载资源

Python套接字ssl连接

java - 创建证书时 IP 地址作为主机名 (CN)? (HTTPS 主机名错误 : should be <ipAddress>)