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


82

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

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

但是,在将此证书导入到受信任的根证书颁发机构之后,NET::ERR_CERT_COMMON_NAME_INVALIDChrome在主域及其所有子域中出现了错误,例如:https://sub1.myserver.nethttps://myserver.net

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

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

通用名称字段中有什么错误导致此错误?


也花了很多时间尝试解决此问题。见我在这里回答stackoverflow.com/questions/42816218/...
亚历克斯·瓦西列夫

Answers:


20

正如Rahul所说,这是常见的Chrome和OSX错误。我过去也遇到过类似的问题。实际上,当我在测试本地站点上的工作时,我终于厌倦了两次点击(是的,我知道这并不多)。

对于此问题的可能解决方法(使用Windows),我将使用许多可用的自签名证书实用程序之一

推荐步骤:

  1. 创建一个自签名证书
  2. 将证书导入Windows证书管理器
  3. 在Chrome证书管理器中导入证书
    注意:一旦Google解决了该错误,第3步将解决遇到的问题...考虑到时间过长,在可预见的将来没有ETA。**

    尽管我更喜欢将Chrome用于开发中,我最近发现自己是Firefox Developer Edition。没有这个问题。

    希望这可以帮助 :)

您链接到的错误是A)仅对OS X有效,并且B)与后缀为“。”的域有关,而这两个域均不适用于@Zed。
菲利普(Philip)

嗯,那是哪个链接?
Thomas.Donnelly

铬臭虫的链接(98627)
菲利普

无论我建议的修复如何,在Windows上也可以使用,因为我已经使用了很多次。
Thomas.Donnelly

“尽管我更喜欢使用Chrome进行开发,但最近我发现自己使用了Firefox Developer Edition。它没有这个问题。” 我在这里不能同意更多


26

解决方法是添加用作“ subjectAltName”(X509v3使用者备用名称)的域名。这可以通过更改您的OpenSSL配置(/etc/ssl/openssl.cnf在Linux上)并修改该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在生成新证书时不要忘记使用该开关。(另请参见如何使用OpenSSL使用SubjectAltName生成自签名证书?


1
的使用subjectAltName = @alt_names完全解决了我的问题。我以前通过提供DNS身份将其绑定到我的域CN=*.example.com。设置DNS.1 = example.comDNS.2 = *.example.com完成窍门。(对我而言)奇怪的是,这一切都工作到〜2017-03-17,并在一天后停止(运行了很多Windows udates)。没有什么打破了我在Linux上,虽然,这只是浏览器火狐的Windows
bossi

@bossi:不幸的是,我在Chrome / Ubuntu上遇到此问题。cert没什么特别的,它只有一个主机,一个DN(内部GitLab存储库)。
Pawel Kraszewski

它工作了大约一周左右,服务器上没有任何变化。由于上下大小写不匹配(证书为大写,Chrome将地址改为小写),因此另外2台服务器开始发出怒吼
Pawel Kraszewski

2
@bossi我敢打赌您的Windows版本是beta版本,对吗?Chrome浏览器已弃用没有subjectAltName 自Chrome 58(目前处于测试版)开始的证书。这让我很难受,因为我不仅没有看到任何有关它的信息,而且错误名称非常具有误导性(不是通用名称无效!),我与你相反。对我而言,这只是在Linux上发生的,所以我花了数小时试图在那里修复本地证书存储。
Tobias J

2
@TobyJ 58.0.3029.19 beta (64-bit)。我已经用正确的subjectAltName-s重新生成了证书树,并且现在一切正常。我同意,错误消息非常容易引起误解,因为它不是CommonName无效的。如果消息显示“证书缺少适当的内容subjectAltName,那么每个人都会感到更加高兴。
Pawel Kraszewski

17

创建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为我工作。


2
中有一个错字DNS.1 = *.myserver.net。应该是 DNS.2 = *.myserver.net。对我来说很好。
Artem Stepin

2
如果您在Windows上,则可以通过使用以admin身份运行的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
George

我写了CN = localhost,DNS.1 = localhost,DNS.2 = * .localhost:8080,它对我不起作用。我还要改变什么?
Esqarrouth

14

您的通配符*.example.com没有覆盖根域example.com,但将覆盖在任何变种-domain如www.example.comtest.example.com

首选方法是像Fabian的“答案”中那样建立主题替代名称,但请记住,Chrome当前要求将“通用名称”另外列为主题替代名称之一(如其答案中已正确说明)。我最近发现了这个问题,因为我的example.comSANwww.example.com和具有通用名称test.example.com,但是NET::ERR_CERT_COMMON_NAME_INVALID从Chrome收到了警告。我必须生成一个新的证书签名请求,example.com同时使用通用名称其中一个SAN。然后Chrome完全信任该证书。而且,不要忘记将根证书作为用于识别网站的可信机构导入到Chrome中。


如果阅读此书的任何人都使用Pantheon进行托管,那么当您将证书上载到他们的平台时,他们似乎会重新构建与您的证书相关联的通用名称。您必须针对它们提供的自定义静态IP进行测试,以查看证书的通用名称在设置过程中是否保持不变。
serraosays

1
辉煌!“您的通配符* .example.com不覆盖根域example.com,但将覆盖子域(例如www.example.com或test.example.com)上的任何变体。” 就我而言,这正是问题所在。此修复程序是简单地包括DNS.1 = example.comDNS.2 = *.example.com[alt_names]openssl.cnf
本·约翰逊


1

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

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

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


0

如果您对此错误感到厌倦。您可以使Chrome不会表现得像这样。我并不是说这是最好的方法,只是说这是一种方法。

解决方法是,可以创建Windows注册表项,以允许Google Chrome浏览器使用服务器证书的commonName来匹配主机名(如果证书缺少subjectAlternativeName扩展名),只要该证书成功验证并链接到本地​​安装的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 Registry Editor版本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


0

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

  1. 具有以下选项的在线证书工具站点:
    • 通用名称:添加系统的“ 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示例将证书添加到节点应用...
    • 添加const https = require('https'); const fs = require('fs');到server.js文件的顶部
    • return app.listen(PORT, () => { ... });在server.js文件底部注释掉
    • 在下面添加 https.createServer({ key: fs.readFileSync('./cert.key','utf8'), cert: fs.readFileSync('./cert.crt','utf8'), requestCert: false, rejectUnauthorized: false }, app).listen(PORT)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.