【问题标题】:Invalid self signed SSL cert - "Subject Alternative Name Missing"自签名 SSL 证书无效 - “缺少主题备用名称”
【发布时间】:2021-08-13 20:23:33
【问题描述】:

最近,Chrome 已停止使用我的自签名 SSL 证书,并认为它们不安全。当我查看 DevTools | Security 选项卡中的证书时,我可以看到它说

主题备用名称缺少此站点的证书 不包含包含域的主题备用名称扩展 名称或 IP 地址。

证书错误 网站的证书链存在问题 (net::ERR_CERT_COMMON_NAME_INVALID)。

我该如何解决这个问题?

【问题讨论】:

  • 这不是一个编程问题......它是关于自签名证书的,它是创建堆栈的一部分。,,谢谢布拉德
  • CN=www.example.com 可能是错误的。主机名始终位于 SAN 中。如果它出现在 CN 中,那么它也必须出现在 SAN 中(在这种情况下您必须列出两次)。有关更多规则和原因,请参阅 How do you sign Certificate Signing Request with your Certification AuthorityHow to create a self-signed certificate with openssl? 您还需要将自签名证书放在适当的信任库中。
  • @jww - 这不是那个问题的重复,因为您不必使用 openssl 创建证书,您可以使用其他工具创建它。
  • @BradParks - 嗯...问题被标记为 OpenSSL,并且接受的答案使用 OpenSSL。我重新打开并删除了 OpenSSL 标记。

标签: google-chrome ssl https pkix


【解决方案1】:

要解决此问题,您需要在创建证书时向openssl 提供一个额外的参数,基本上

-sha256 -extfile v3.ext

其中v3.ext 是这样的文件,%%DOMAIN%% 替换为与Common Name 相同的名称。更多信息 hereover here。请注意,通常您会将Common Name%%DOMAIN%% 设置为您尝试为其生成证书的域。因此,如果它是 www.mysupersite.com,那么您可以同时使用它。

v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = %%DOMAIN%%

注意:解决此问题的脚本和create fully trusted ssl certs for use in Chrome, Safari and from Java clients can be found here

另一个注意事项:如果您想要做的只是阻止 Chrome 在查看自签名证书时抛出错误,您可以告诉 Chrome 忽略所有 SSL使用特殊命令行选项as detailed here on SuperUser

启动所有站点的错误

【讨论】:

  • 不确定您使用的是哪个版本的 XAMPP,但如果您在该文件中查找包含“openssl x509”的行,您应该能够将上述内容添加到该行的末尾在文件中。例如,makecert.bat 的这个版本在第 9 行,最终将是:bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext。当然,您仍然需要将v3.ext 保存到同一文件夹中的文件中。
  • 我在尝试了一切之后放弃了 chrome 并继续使用另一个浏览器。几天后,今天我用 chrome 检查了它,它可以工作!!! Chrome 可能有一个错误,他们修复了它。 您的 Subject Alternative Name Missing 方法有效!!!! 只需在浏览器中添加受信任的根证书下的证书即可。
  • 我收到unknown option -extfile。我该如何解决这个问题?
  • @NickManning - 也许你在错误的 openssl 命令中使用了extfile 指令?它不是在openssl req -new ... 中使用,而是在openssl x509 -req ... 中使用。至少 someone here said 是这样,从 the example I have in another answer to a similar question of how to fully generate these certs 看来是这样的
  • "supply an extra parameter to openssl" 具体到哪个命令?涉及多个步骤,这个答案太模糊:ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/…
【解决方案2】:

通过更改 v3.ext 文件的 DNS.1 值,我能够摆脱 (net::ERR_CERT_AUTHORITY_INVALID)

[alt_names] DNS.1 = 域名.com

将 domainname.com 更改为您自己的域。

【讨论】:

    【解决方案3】:

    我只是使用-subj 参数添加机器IP 地址。所以只用一个命令就解决了。

    sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -sha256 -subj '/CN=my-domain.com/subjectAltName=DNS.1=192.168.0.222/' -keyout my-domain.key -out my-domain.crt
    

    您可以添加其他属性,如 C、ST、L、O、OU、emailAddress 以生成证书而无需提示。

    【讨论】:

    • 不适用。似乎 chrome 无法以这种方式识别 SAN
    • 我在使用此命令的 OpenSSL 1.1.0b 上遇到“提出证书请求的问题”。
    • 对我来说(Windows)的语法略有不同:openssl.exe req -x509 -sha256 -newkey rsa:2048 -keyout certificate.key -out certificate.crt -days 365 -nodes -subj "/CN=my.domain.com" -addext "subjectAltName=DNS:my.domain.com" IIS 然后需要*.pfx 格式:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
    【解决方案4】:

    问题

    正如其他人所提到的,发生NET::ERR_CERT_COMMON_NAME_INVALID 错误是因为生成的证书不包含 SAN (subjectAltName) 字段。

    RFC2818 自 2000 年 5 月以来已弃用回退到 commonName 字段。自版本 58 起,Chrome 已强制使用 subjectAltName 字段(请参阅Chrome 58 deprecations .

    OpenSSL 接受x509v3 configuration files 向证书添加扩展配置(请参阅subjectAltName 字段了解配置选项)


    Bash 脚本

    我创建了一个self-signed-tls bash script,其中包含简单的选项,以便轻松生成证书颁发机构并使用 OpenSSL 签署 x509 证书(在 Chrome 中使用 subjectAltName 字段有效)

    脚本将引导您完成一系列问题以包含必要的信息(包括subjectAltName 字段)。您可以参考README.md 了解更多详细信息和自动化选项。

    安装新证书后一定要重启 chrome。

    chrome://restart
    

    其他资源

    • Docker 文档中有一个 great straightforward example,用于创建自签名证书颁发机构并使用 OpenSSL 签署证书。
    • cfssl 也是一个非常强大的工具,被广泛使用,值得一试。
    • mkcert 是一个用 GoLang 编写的工具。它看起来简单易用,非常适合本地开发。

    【讨论】:

    • 你应该在这里添加脚本并解释一下。
    • 看起来不错的脚本。但是脚本并没有(直接)提供关于 OP 问题的真正答案。也许解释一下他的问题是什么。
    【解决方案5】:

    以下解决方案适用于 chrome 65 (ref) -

    创建一个 OpenSSL 配置文件(例如:req.cnf)

    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    prompt = no
    [req_distinguished_name]
    C = US
    ST = VA
    L = SomeCity
    O = MyCompany
    OU = MyDivision
    CN = www.company.com
    [v3_req]
    keyUsage = critical, digitalSignature, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = www.company.com
    DNS.2 = company.com
    DNS.3 = company.net
    

    创建引用此配置文件的证书

    openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
     -keyout cert.key -out cert.pem -config req.cnf -sha256
    

    【讨论】:

    • 这太棒了!正是我需要的,它也跳过了公司名称和州等令人讨厌的提示。
    • 我尝试了一些替代解决方案,但这是唯一对我有用的解决方案。谢谢!!
    • 您可以从命令行传递主题:openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company。 com"
    • 你是如何导入到 chrome 中的?这里不是没有basicConstraints = CA:true吗?
    • 如何获取 cert.crt 文件?我需要它和我的网络服务器的 cert.key。
    【解决方案6】:

    MAC 上 从 chrome 版本 67.0.3396.99 开始,我的自签名证书停止工作。

    用这里写的所有内容进行再生都没有用。

    更新

    有机会确认我的方法今天有效:)。如果它对您不起作用,请确保您使用的是这种方法

    v3.ext
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = <specify-the-same-common-name-that-you-used-while-generating-csr-in-the-last-step>
    $
    

    从这里复制 https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

    结束更新

    只有在系统删除我的证书并将其添加本地时才能看到绿色安全> 钥匙扣。 (如果有 - 先放下它​​)。 不确定它是否重要,但在我的情况下,我通过 chrome 下载了证书,并验证了创建日期是今天 - 所以它是我刚刚创建的那个。

    希望对花一天时间的人有所帮助。

    永远不要更新 chrome!

    【讨论】:

      【解决方案7】:
      • 在您的主目录中复制您的 OpenSSL 配置:

        cp /System/Library/OpenSSL/openssl.cnf ~/openssl-temp.cnf
        

        或在 Linux 上:

        cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
        
      • 将主题备用名称添加到openssl-temp.cnf,在[v3_ca] 下:

        [ v3_ca ]
        subjectAltName = DNS:localhost
        

        localhost 替换为您要为其生成证书的域。

      • 生成证书:

        sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
            -config ~/openssl-temp.cnf
            -keyout /path/to/your.key -out /path/to/your.crt
        

      然后您可以删除openssl-temp.cnf

      【讨论】:

        【解决方案8】:

        这是创建 Chrome 信任的 IP 证书的一种非常简单的方法。

        ssl.conf 文件...

        [ req ]
        default_bits       = 4096
        distinguished_name = req_distinguished_name
        req_extensions     = req_ext
        prompt             = no
        
        [ req_distinguished_name ]
        commonName                  = 192.168.1.10
        
        [ req_ext ]
        subjectAltName = IP:192.168.1.10
        

        当然,192.168.1.10 是我们希望 Chrome 信任的本地网络 IP。

        创建证书:

        openssl genrsa -out key1.pem
        openssl req -new -key key1.pem -out csr1.pem -config ssl.conf
        openssl x509 -req -days 9999 -in csr1.pem -signkey key1.pem -out cert1.pem -extensions req_ext -extfile ssl.conf
        rm csr1.pem
        

        在 Windows 上,将证书导入所有客户端计算机上的受信任根证书存储区。在 Android 手机或平板电脑上下载证书进行安装。现在 Chrome 将信任 Windows 和 Android 上的证书。

        在 windows dev box 上,获取 openssl.exe 的最佳位置是“c:\Program Files\Git\usr\bin\openssl.exe”

        【讨论】:

        • 妈的,战了一个月,你救了我,终于拿到绿锁了
        【解决方案9】:

        我在获取在 macos/Chrome 上工作的自签名证书时遇到了很多问题。最后我找到了 Mkcert,“一个简单的零配置工具,可以使用您想要的任何名称制作本地受信任的开发证书。” https://github.com/FiloSottile/mkcert

        【讨论】:

        • 它也适用于我的新 Chrome 中的 Windows 10。虽然我不得不将 .pem 文件从默认的 Windows\system32 文件夹复制到另一个文件夹,因为 Nginx 无法访问这个文件夹。
        【解决方案10】:

        如果你想运行你的服务器本地主机,你需要设置CN = localhostDNS.1 = localhost

        [req]
        default_bits = 2048
        default_md = sha256
        distinguished_name = req_distinguished_name
        prompt = no
        prompt = no
        x509_extensions = v3_req
        
        [req_distinguished_name]
        C = BR
        CN = localhost
        emailAddress=contact@example.com
        L = Sao Paulo
        O = example.com
        OU = example.com
        ST = Sao Paulo
        
        [v3_req]
        authorityKeyIdentifier = keyid, issuer
        basicConstraints = CA:FALSE
        extendedKeyUsage = serverAuth
        keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
        subjectAltName = @alt_names
        
        [alt_names]
        DNS.1 = localhost
        

        【讨论】:

          【解决方案11】:

          2021 年 6 月更新 - Windows 10 - Chrome v91 答案是 here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-01-18
            • 1970-01-01
            • 2020-11-13
            • 1970-01-01
            相关资源
            最近更新 更多