Java Keytool 是否允许 SAN 值具有通配 DNS 名称

Does Java Keytool allow SAN values to have wildcarded DNS names

根据 RFC 2818(第 3.1 节)RFC 2459 - 似乎允许将 DNS 名称条目列表作为 SAN 名称的一部分并涵盖多个域:

SubjectAlternativeName [
  DNSName: localhost
  DNSName: *.i.mydomain.net
  DNSName: *.mydomain.net
]

使用 Java keytool 应用程序 - 它似乎不允许 SAN 条目在 DNS 名称中使用通配符。有谁知道我是否可以使用一些技巧 (!) 来做到这一点?

我过去 运行 遇到过这个问题,并通过使用 OpenSSL 生成 CSR 并仅在必须时使用 keytool 来解决它(导入和导出证书和密钥)。

编辑:这是我所做的 tl;dr

有一个看起来像这样的 req.cfg 文件:

[req]
req_extensions = v3_req
[v3_req]
subjectAltName = @san
[san]
DNS.1 = *.mydomain.com
DNS.2 = mydomain.com

然后 运行 这个:

$ openssl req -new -newkey rsa:2048 -sha256 -nodes -out keypair.csr -keyout keypair.key -config req.cfg

现在您已经有了证书签名请求和私钥,您可以将 CSR 发送到 CA 或使用 OpenSSL 使用刚刚生成的 keypair.csr 自签名证书。无论您如何执行此操作,我们假设您获得了我们称之为 mycert.crt

的证书

您现在已经大功告成了,但棘手的部分是您现在需要先将您的证书密钥对转换为 PKCS12 密钥库,然后再尝试导入您的 JKS 密钥库。

openssl pkcs12 -export -name mycertname -in mycert.crt -inkey keypair.key -out keystore.p12
keytool -importkeystore -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias mycertname