我正在尝试生成一个SSL证书,由我自己的CA签名后,将为多个域的工作。
我的opensslconfiguration文件如下所示:
[ 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工作由于通用名称,这两个子域名不。
我究竟做错了什么? 我怎样才能解决这个问题?
(我在这里简化了这个例子,通配证书不是一个选项)
您已经发布了所有相关内容, 除了来自您的CA的实际签名证书的详细信息。 我猜你的CA由于某种原因剥离或忽略了请求中的SAN字段。 应该很容易检查openssl。
openssl x509 -in my.crt -text
假设签署的证书中确实缺lessSAN字段,则必须弄清楚为什么您的CA正在剥离或忽略这些字段。 我对运行基于openssl的CA并不熟悉,但我知道Windows CA的早期版本需要registry调整来支持SAN。
我正在debugging类似的问题,另外还需要客户端证书。 我在Linux上使用tomcat,所以我可以执行以下操作来帮助debugging:
将“-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