Keytool 主题备用名称

Keytool 主题备用名称

我正在尝试获取适合我们内部 Jira/Confluence 部署的证书。人们以不同的方式访问它们,无论是通过主机名还是 FQDN。我使用 Java 7 的 keytool,因此我可以访问服务器备用名称功能:

-ext san=dns:jira

...然后我把它交给...

jira.example.com

...作为生成证书时的 CN。然后我生成签名请求,将 CSR 交给我们的 Win2k8r2 PKI 以certreq获取密钥签名并将密钥重新导入密钥库。

现在,当我按照上面所说的进行设置时,我的浏览器(Chrome、Firefox、Safari)似乎认为这jira是唯一有效的名称,即使我检查证书时 CN 显示的的是 FQDN。

如果我放弃,ext它将使用 CN,即 FQDN。

当我有多个ext语句时,它只使用最后一个,并且我尝试使用各种标点符号将多个条目串联DNS:foo在一起ext

我遇到的另一个角度是设置 Web 服务器以对 FQDN 执行 301。我对此也满意,但我只能使用 Tomcat,因此“切换到 Apache/nginx”对我来说不起作用。似乎是我见过的唯一一份关于 Tomcat 的类似操作的文档,但它已经有 3 年历史了,对我来说已经过时了。他们有没有将这个功能添加到 Tomcat6 中?

答案1

我意识到这个问题已经很老了,但是对于任何可能觉得它有用的人来说,我会提到对我有用的方法:

  • 使用 CN 输入一些人类友好的名称,如“我们很酷的 JIRA 服务器”;-)
  • 像这样输入 san:-ext san=dns:jira,dns:jira.example.com

顺便说一句,如果你愿意,你也可以添加 IP 地址。我个人在我的开发电脑上使用以下地址:

keytool -certreq ... -file server.csr -keystore server.keystore ... -ext san=dns:localhost,dns:myComputerName,ip:127.0.0.1,ip:::1

注意:我使用 java8 keytool;我希望这也适用于 java7 keytool,但我还没有测试过

答案2

要验证 CSR 是否嵌入了 SAN 主体备用名称,请使用 keytool 打印 CSR:

keytool -printcertreq -file test.csr

如果成功了,你将会得到类似这样的结果:

#1: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  DNSName: test.example.com
  DNSName: test
]

注意 - 为了获得如上所述的两个条目(test.example.com 和 test),您必须创建 CSR,如“明天的”答案中所述“-ext san=dns:test.example.com,dns:test”。

不要遵循误导性的 keytool 文档 [{-ext ext}*],它表明可以在命令行中传递零个或多个“-ext”条目:

-ext san=dns:test.example.com -ext san=dns:test

这不起作用,您只会获得最后一个扩展 DNS 条目 (san=dns:test)。

答案3

使用以下方式生成多域名证书OpenSSL然后keytool将密钥和证书转换为 Java Keystore 以用于 Tomcat。以下示例生成自签名证书,它应该很容易适应“真实”证书。

按照上面链接中的指南生成 openssl.cnf,然后运行以下命令:

# Generates a self-signed certificate + key, omit if you already have one
openssl req -config openssl.cnf -x509 -days 3650 -newkey rsa:2048 \
   -out self-signed-certificate.pem -keyout pub-sec-key.pem
# Remove passphrase from key
openssl rsa -in pub-sec-key.pem -out new.key
# Generate PKCS12 keystore
openssl pkcs12 -export -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES \
   -export -in self-signed-certificate.pem -inkey new.key -name alias \
   -out keystore.p12
# Convert PKCS12 to JKS
keytool -importkeystore -destkeystore keystore.jks -deststoretype JKS \
   -srcstoretype PKCS12 -srckeystore keystore.p12

注意别名上例中的值为-name。这是您必须传递给 的证书的名称tomcat

为了完整起见,我将介绍如何通过 SAN 颁发证书与证书颁发机构合作:

SAN                     = email:copy

...

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName=${ENV::SAN}
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

运行此命令来生成包含 SAN(未经测试)的密钥 + CSR:

SAN="DNS: domain1.example.com, DNS: domain2.example.com" openssl req \
   -config /path/to/openssl.conf \
   -subj "/C=XX/ST=XX/L=xxx/O=My Org/OU=My OU/CN=main.example.com" \
   -newkey rsa:2048 -out file.csr -keyout out.key \
   -infiles /path/to/csr/file.csr

运行此命令来颁发证书:

SAN="DNS: domain1.example.com, DNS: domain2.example.com" openssl ca \
   -config /path/to/openssl.conf -policy policy_anything \
   -subj "/C=XX/ST=XX/L=xxx/O=My Org/OU=My OU/CN=main.example.com" \
   -infiles /path/to/csr/file.csr

答案4

对于多个 SAN 条目,keytool 的正确命令行是:

-ext san=dns:test.example.com,dns:test

相关内容