生成适用于 Firefox 和 Chrome 的 SAN SSL 证书

生成适用于 Firefox 和 Chrome 的 SAN SSL 证书

我正在尝试生成一个 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,因此我可以执行以下操作来帮助调试:

  1. 以任何合理的方式将“-Djavax.net.debug=all”添加到您的执行环境中。我将其添加到我的应用程序setenv.sh文件中。

    这将生成日志条目,让您查看 ssl 握手的详细信息,例如整个证书链是否包含在 serverHello 消息中。

  2. 使用此 openssl 命令的变体来查看 openssl 如何处理证书

    $ openssl s_client -connect <address>:<port> -debug \
       -cert <client_cert_file> -key <client_key_file> -CAfile cacert.pem
    

相关内容