为域和子域创建自签名证书 - NET :: ERR_CERT_COMMON_NAME_INVALID

时间:2014-12-04 12:53:06

标签: ssl dns openssl windows-7-x64

我按照this教程在Windows上创建签名SSL证书用于开发目的,并且它适用于我的一个域(我使用hosts文件来模拟dns)。然后我发现我有很多子域名,为每个子域名创建证书会很麻烦。所以我尝试在Common字段中使用通配符创建证书,如serverfault中的一些答案所示。像这样:

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

但是,在将此证书导入受信任的根证书颁发机构后,我在Chrome中遇到NET::ERR_CERT_COMMON_NAME_INVALID错误,主要域及其所有子域名,例如:https://sub1.myserver.net和{{ 1}}。

  

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

     

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

Common Name字段中是否出现导致此错误的错误?

8 个答案:

答案 0 :(得分:24)

解决方法是添加您使用的域名" 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?

答案 1 :(得分:19)

正如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。没有这个问题。

    希望这有助于:)

答案 2 :(得分:11)

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

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

答案 3 :(得分:11)

创建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适用于我。

答案 4 :(得分:5)

我认为这可能是Chrome中的一个错误。长期存在类似的问题: See this.

尝试使用其他浏览器。我认为应该可以正常工作。

答案 5 :(得分:1)

对于遇到此问题并想承担进行测试风险的每个人,都有一个解决方案:在Chrome中进入隐身模式,您可以打开“高级”,然后单击“继续到some.url”

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

当然,这不适用于在生产环境中使用网站的人,该错误指示网站安全存在问题。

答案 6 :(得分:0)

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

  

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

     

数据类型:Boolean [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 \政策\谷歌\铬]   " EnableCommonNameFallbackForLocalAnchors" = DWORD:00000001   转到文件>另存为   文件名:any_filename.reg   保存类型:所有文件

     

选择文件的首选位置

     

点击保存

     

双击保存的文件以运行

     

在注册表编辑器警告

上单击是

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

答案 7 :(得分:0)

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

  1. 在线certificate tools网站,具有以下选项:
    • 公用名:添加系统的“ localhost”和IP,例如192.168.1.12
    • 主题备用名称:添加“ DNS” =“ localhost”和“ IP” = <your ip here, e.g. 192.168.1.12>
    • “ CRS”下拉选项设置为“自签名”
    • 所有其他选项均为默认设置
  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中没有更多错误