【问题标题】:Creating self signed certificate for domain and subdomains - NET::ERR_CERT_COMMON_NAME_INVALID为域和子域创建自签名证书 - NET::ERR_CERT_COMMON_NAME_INVALID
【发布时间】:2015-02-02 08:46:52
【问题描述】:

我遵循this 教程在 Windows 上创建签名 SSL 证书以用于开发目的,它对我的​​一个域非常有效(我正在使用主机文件来模拟 dns)。然后我发现我有很多子域,为每个子域创建一个证书会很麻烦。因此,我尝试按照 serverfault 的一些答案中的建议在 Common 字段中使用通配符创建证书。像这样:

Common Name: *.myserver.net/CN=myserver.net

但是,在将此证书导入受信任的根证书颁发机构后,我在 Chrome 中收到 NET::ERR_CERT_COMMON_NAME_INVALID 错误,对于主域及其所有子域,例如:https://sub1.myserver.nethttps://myserver.net

此服务器无法证明它是 myserver.net;它的安全证书 来自 *.myserver.net/CN=myserver.net。

这可能是由于配置错误或攻击者拦截了您的连接造成的。

Common Name 字段中是否存在导致此错误的错误?

【问题讨论】:

标签: ssl dns openssl windows-7-x64


【解决方案1】:

我认为这可能是 chrome 中的一个错误。很久以前有一个类似的问题: See this.

在其他浏览器中尝试。我认为它应该可以正常工作。

【讨论】:

    【解决方案2】:

    正如 Rahul 所说,这是一个常见的 Chrome 和 OSX 错误。我过去也有类似的问题。事实上,在测试本地站点的工作时,我终于厌倦了额外点击 2 [是的,我知道这不是很多]。

    至于 [使用 Windows] 解决此问题的可能方法,我会使用众多 self signing certificate utilities available 之一。

    推荐步骤:

    1. Create a Self Signed Cert
    2. Import Certificate into Windows Certificate Manager
    3. 在 Chrome 证书管理器中导入证书
      注意:第 3 步将解决遇到的问题一次 Google 解决了该错误...考虑到时间已经过时在可预见的未来没有 ETA。**

      尽管我更喜欢使用 Chrome 进行开发,但我最近发现自己在 Firefox Developer Edition。没有这个问题。

      希望这会有所帮助:)

    【讨论】:

    • 您链接到的错误是 A) 仅对 OS X 有效,并且 B) 涉及带有尾随“.”的域,这两者都不适用于 @Zed。
    • 嗯,那是哪个链接?
    • 铬错误 (98627) 的链接
    • 不管我建议的修复方法在 Windows 上也适用,因为我已经使用过很多次了。
    • “尽管我更喜欢使用 Chrome 进行开发,但我最近发现自己使用的是 Firefox 开发者版。它没有这个问题。”在这里不能同意更多..
    【解决方案3】:

    解决方法是将您使用的域名添加为“subjectAltName”(X509v3 主题备用名称)。这可以通过更改您的 OpenSSL 配置(Linux 上的 /etc/ssl/openssl.cnf)并修改 v3_req 部分来完成,如下所示:

    [ v3_req ]
    
    # Extensions to add to a certificate request
    
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = myserver.net
    DNS.2 = sub1.myserver.net
    

    有了这个,不要忘记在生成新证书时使用-extensions v3_req 开关。 (另见How can I generate a self-signed certificate with SubjectAltName using OpenSSL?

    【讨论】:

    • subjectAltName = @alt_names 的使用完全解决了我的问题。我之前通过CN=*.example.com 将DNS 身份绑定到我的域。设置DNS.1 = example.comDNS.2 = *.example.com 就可以了。奇怪的事情(对我来说)是它一直工作到 ~2017-03-17 并在一天后停止(运行了大量的 Windows 更新)。 没有什么在 Linux 上对我造成影响,这只是 Chrome 上的 FirefoxWindows 上。
    • @bossi:不幸的是,我在 Chrome/Ubuntu 上遇到了这个问题。并且 cert 没有什么花哨的,单主机,单 DN(内部 GitLab 存储库)。
    • 大约一周前它工作了,服务器上没有任何变化。由于大小写不匹配,其他 2 台服务器开始咆哮(证书为大写,Chrome 将地址丢弃为小写)
    • @bossi 我敢打赌你的 Windows 版本在 beta 轨道上,对吧? Chrome 已弃用没有 subjectAltName as of Chrome 58 的证书,该证书目前处于测试阶段。这让我很难受,因为我不仅没有看到任何有关它的信息,而且错误名称非常具有误导性(它不是无效的通用名称!)我与你相反;它只发生在我的 Linux 上,所以我花了几个小时试图修复我的本地证书存储。
    • @TobyJ 58.0.3029.19 beta (64-bit) 是。我已经用正确的subjectAltName-s 重新生成了证书树,现在一切正常。我同意,错误消息非常具有误导性,因为它不是CommonName 无效。如果消息显示“证书缺少正确的subjectAltName,每个人都会更高兴。
    【解决方案4】:

    您的通配符*.example.com 确实覆盖根域example.com,但将覆盖域上的任何变体,例如www.example.comtest.example.com

    首选方法是在Fabian's Answer 中建立主题备用名称,但请记住,Chrome 目前要求将通用名称另外列为主题备用名称之一(正如他的回答中正确演示的那样)。我最近发现了这个问题,因为我的 SAN 具有 www.example.comtest.example.com 的通用名称 example.com,但收到了来自 Chrome 的 NET::ERR_CERT_COMMON_NAME_INVALID 警告。我必须生成一个新的证书签名请求,其中example.com 作为公用名其中一个 SAN。然后 Chrome 完全信任该证书。并且不要忘记将根证书作为识别网站的受信任机构导入 Chrome。

    【讨论】:

    • 如果阅读本文的任何人使用 Pantheon 进行托管,当您将证书上传到他们的平台时,他们似乎会重新构建与您的证书关联的通用名称,从而产生此问题。您必须针对他们为您提供的自定义静态 IP 进行测试,以查看证书的公用名在设置过程中是否保持不变。
    • 太棒了! “您的通配符 *.example.com 不涵盖根域 example.com,但将涵盖子域上的任何变体,例如 www.example.com 或 test.example.com。”这正是我的问题所在。修复只是在openssl.cnf 中的[alt_names] 下包含DNS.1 = example.comDNS.2 = *.example.com
    【解决方案5】:

    Chrome 58 有dropped support for certificates without Subject Alternative Names

    接下来,这可能是您遇到此错误的另一个原因。

    【讨论】:

    • 本指南帮助我在 Mac OSX 上创建了一个自签名证书:alexanderzeitler.com/articles/…
    • 尽管错误未提及主题替代名称,但这解决了我的问题。谢谢!
    【解决方案6】:

    如果您厌倦了这个错误。你可以让 Chrome 不这样做。我并不是说这是最好的方式,只是说这是一种方式。

    作为一种解决方法,可以创建一个 Windows 注册表项,以允许 Google Chrome 在证书缺少 subjectAlternativeName 扩展时使用服务器证书的 commonName 来匹配主机名,只要它成功验证并链接到本地- 已安装 CA 证书。

    数据类型:布尔值 [Windows:REG_DWORD] Windows 注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome Windows/Mac/Linux/Android 首选项名称:EnableCommonNameFallbackForLocalAnchors 值:0x00000001 (Windows), true(Linux), true (Android), (Mac) 要创建 Windows 注册表项,只需按照以下步骤操作:

    打开记事本 将以下内容复制并粘贴到记事本中 Windows 注册表编辑器 5.00 版

    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome] "EnableCommonNameFallbackForLocalAnchors"=dword:00000001 转到文件 > 另存为 文件名:any_filename.reg 保存类型:所有文件

    选择文件的首选位置

    点击保存

    双击保存的文件运行

    在注册表编辑器警告上单击“是”

    在 Symantec 支持页面上找到此信息: https://support.symantec.com/en_US/article.TECH240507.html

    【讨论】:

      【解决方案7】:

      创建openssl.conf 文件:

      [req]
      default_bits = 2048
      default_keyfile = oats.key
      encrypt_key = no
      utf8 = yes
      distinguished_name = req_distinguished_name
      x509_extensions = v3_req
      prompt = no
      
      [req_distinguished_name]
      C = US
      ST = Cary
      L = Cary
      O  = BigCompany
      CN = *.myserver.net
      
      [v3_req]
      keyUsage = critical, digitalSignature, keyAgreement
      extendedKeyUsage = serverAuth
      subjectAltName = @alt_names
      
      [alt_names]
      DNS.1 = myserver.net
      DNS.2 = *.myserver.net
      

      运行这个命令:

      openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout app.key -out app.crt  -config openssl.conf
      

      输出文件 app.crtapp.key 为我工作。

      【讨论】:

      • DNS.1 = *.myserver.net 中有错字。应该是DNS.2 = *.myserver.net。对我来说效果很好。
      • 如果您在 Windows 上,这可以通过使用以管理员身份运行的 cmd 和以下位置使用 git 安装的 openssl 来完成:“C:\Program Files\Git\usr\bin\openssl.exe " req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout app.key -out app.crt -config openssl.conf
      • 我写了 CN = localhost, DNS.1 = localhost, DNS.2 = *.localhost:8080 但它对我不起作用。我还应该改变什么?
      • 我无法让它工作。 (Chrome 仍然说证书不受信任。)我想知道为什么它说 default_keyfile = oats.key
      【解决方案8】:

      对于遇到这种情况并愿意接受风险进行测试的每个人,有一个解决方案:在 Chrome 中进入隐身模式,您将能够打开“高级”并单击“继续访问 some.url” .

      如果您需要检查一些您自己维护的网站并且只是作为开发人员进行测试(并且当您尚未配置适当的开发证书时),这会很有帮助。

      当然,这不适用于在生产中使用网站的人,如果此错误表明网站安全存在问题。

      【讨论】:

        【解决方案9】:

        在为本地开发和测试创建 PWA 时,提供的答案对我(Chrome 或 Firefox)不起作用。请勿用于生产!我能够使用以下内容:

        1. 在线certificate tools 站点具有以下选项:
          • Common Names:添加系统的“localhost”和 IP,例如192.168.1.12
          • 主题备用名称:添加“DNS”=“localhost”和“IP”=<your ip here, e.g. 192.168.1.12>
          • “CRS”下拉选项设置为“Self Sign”
          • 所有其他选项均为默认值
        2. 下载所有链接
        3. 通过双击将.p7b证书导入Windows并选择“安装”/OSX?/Linux?
        4. 为节点应用添加了证书...使用 Google 的 PWA example
          • const https = require('https'); const fs = require('fs'); 添加到 server.js 文件的顶部
          • 注释掉 server.js 文件底部的 return app.listen(PORT, () => { ... });
          • 在下面添加https.createServer({ key: fs.readFileSync('./cert.key','utf8'), cert: fs.readFileSync('./cert.crt','utf8'), requestCert: false, rejectUnauthorized: false }, app).listen(PORT)

        我在 Chrome 或 Firefox 中没有更多错误

        【讨论】:

        • 这适用于我的 Angular 应用程序。谢谢詹姆斯。
        猜你喜欢
        • 2017-08-06
        • 1970-01-01
        • 2015-09-13
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 2019-07-21
        • 2021-01-11
        相关资源
        最近更新 更多