我正在尝试生成一个 SSL 证书,该证书由我自己的 CA 签名后可用于多个域。
我的 openssl 配置文件如下所示:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = DE
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Berlin
localityName = Locality Name (eg, city)
localityName_default =
organizationName = Organization Name (eg, company)
organizationName_default =
commonName = Common Name (eg, your domain)
commonName_default = example.com
commonName_max = 64
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = example.com
DNS.2 = a.example.com
DNS.3 = b.example.com
生成的 CSR 如下所示:
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=DE, ST=Berlin, CN=example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Alternative Name:
DNS:example.com, DNS:a.example.com, DNS:b.example.com
Signature Algorithm: sha1WithRSAEncryption
...
但是在 apache 上安装这个之后,浏览器(chrome 和 firefox)似乎都看不到或尊重 SAN。example.com
由于通用名称而有效,但两个子域名却不行。
我做错了什么?我该如何解决这个问题?
(我在这里简化了示例。通配符证书不是一种选择)
答案1
您已发布所有相关内容除了来自 CA 的实际签名证书的详细信息。我猜您的 CA 出于某种原因删除或忽略了您请求中的 SAN 字段。使用 openssl 检查应该很容易。
openssl x509 -in my.crt -text
假设签名证书中确实缺少 SAN 字段,您必须弄清楚您的 CA 为何要删除或忽略这些字段。我不太熟悉如何运行基于 openssl 的 CA,但我知道早期版本的 Windows CA 需要调整注册表才能支持 SAN。
答案2
我正在调试一个类似的问题,另外还需要客户端证书。我在 Linux 上使用 tomcat,因此我可以执行以下操作来帮助调试:
以任何合理的方式将“-Djavax.net.debug=all”添加到您的执行环境中。我将其添加到我的应用程序
setenv.sh
文件中。这将生成日志条目,让您查看 ssl 握手的详细信息,例如整个证书链是否包含在 serverHello 消息中。
使用此 openssl 命令的变体来查看 openssl 如何处理证书
$ openssl s_client -connect <address>:<port> -debug \ -cert <client_cert_file> -key <client_key_file> -CAfile cacert.pem