Keytool 服务器备用名称

Taw*_*awm 10 tomcat ssl-certificate fqdn jira keytool

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

-ext san=dns:jira
Run Code Online (Sandbox Code Playgroud)

……我把它交给……

jira.example.com
Run Code Online (Sandbox Code Playgroud)

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

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

如果我删除ext它,它将使用作为 FQDN 的 CN。

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

我遇到的另一个角度是设置 Web 服务器对 FQDN 执行 301。我对此也很好,但我坚持使用 Tomcat,所以“切换到 Apache/nginx”对我不起作用。似乎是我遇到的唯一一个用 Tomcat 做类似事情的文档,但它已经 3 岁了,对我来说已经结束了。他们是否已将该功能添加到 Tomcat6?

小智 22

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

  • 使用 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
Run Code Online (Sandbox Code Playgroud)

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


fue*_*ero 2

OpenSSL使用和不使用生成多域证书,keytool然后将密钥和证书转换为 Java 密钥库以与 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
Run Code Online (Sandbox Code Playgroud)

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

为了完整起见,我将介绍如何与证书颁发机构一起使用 SAN 颁发证书:

SAN                     = email:copy

...

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName=${ENV::SAN}
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
Run Code Online (Sandbox Code Playgroud)

运行此命令以生成包含 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
Run Code Online (Sandbox Code Playgroud)

运行此命令以颁发证书:

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
Run Code Online (Sandbox Code Playgroud)