无效的自签名SSL证书-“缺少主题备用名称”


96

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

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

证书错误站点的证书链(net :: ERR_CERT_COMMON_NAME_INVALID)出现问题。

我怎样才能解决这个问题?


33
这怎么不是编程问题.....它是关于自签名证书的信息,它是创建堆栈的一部分。,,谢谢Brad
Sweet Chilly Philly

1
CN=www.example.com可能是错误的。主机名总是放在SAN中。如果它存在于CN中,那么它也必须存在于SAN中(在这种情况下,您必须列出两次)。有关更多规则和原因,请参阅如何与证书颁发机构签署证书签名请求如何使用openssl创建自签名证书?您还需要将自签名证书放置在适当的信任库中。
jww

@jww-这不是该问题的重复项,因为您不必使用openssl创建证书,因此可以使用其他工具来创建它。
布拉德·帕克斯

1
@BradParks-Hmmm ...该问题被标记为OpenSSL,接受的答案使用OpenSSL。我重新打开并删除了OpenSSL标记。
jww

Answers:


104

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

-sha256 -extfile v3.ext

v3.ext像这样的文件在哪里,用%%DOMAIN%%与您使用的相同名称替换Common Name。更多信息在这里在这里。请注意,通常您会将Common Nameand 设置为%%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%%

注意:可在此处找到解决此问题并创建完全受信任的ssl证书以在Chrome,Safari和Java客户端中使用的脚本。

另一个注意事项:如果您要做的只是在查看自签名证书时阻止chrome抛出错误,则可以通过使用特殊的命令行选项启动Chrome来告诉Chrome忽略所有网站的所有SSL错误,如此处所述在超级用户上


2
不确定所使用的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 将该文件保存到同一文件夹中的文件中。
布拉德·帕克斯

1
在尝试了所有方法之后,我放弃了chrome,并继续使用其他浏览器。几天后,今天我检查了铬,它可以正常工作!!!Chrome可能有一个错误,他们已将其修复。您的主题替代名称丢失方法有效!!!!只需在浏览器中将证书添加到受信任的根证书下即可。
塔里克

35
我越来越unknown option -extfile。我该如何解决?
Nick Manning

2
@NickManning-也许您extfile在错误的openssl命令中使用了指令?而不是用于中openssl req -new ...,而是用于中openssl x509 -req ...。至少有人这样说的,这在我对另一个如何完全生成这些证书的类似问题的回答中的示例中
Brad Parks

2
“为openssl提供一个额外的参数”专门针对哪个命令?这里涉及多个步骤,这个答案是太含糊:ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/...
user145400

34

以下解决方案适用于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

2
这很棒!正是我所需要的,它也跳过了诸如公司名称和州之类的烦人提示。
coredumperror

2
我尝试了一些替代解决方案,但这是唯一对我有用的解决方案。谢谢!!
Mirko

1
您可以从命令行传递主题:openssl req ... -subj“ /C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com”
JaroslavZáruba

您是如何导入chrome的?这里不basicConstraints = CA:true失踪吗?
woodz

19

Bash脚本

我创建了一个bash脚本,以使其更易于生成在Chrome中有效的自签名TLS证书。

经过测试Chrome 65.x,它仍然可以正常工作。安装新证书后,请确保重新启动Chrome。

chrome://restart



其他资源

另一个值得一试的(更强大)的工具是CloudFlare的cfssl工具包:


2
您应该在此处添加脚本并对其进行说明。
jww

好像不错的脚本。但是脚本不能(直接)提供关于OP问题的真正答案。也许也可以解释他的问题。
bshea

4

我只是使用-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)来生成证书,而无需提示。


2
不适用于。chrome似乎无法通过这种方式识别SAN
2015年

使用此命令在OpenSSL 1.1.0b上出现“提出证书申请的问题”。
瑞克(Rick)

对我来说(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
斯捷潘Havránek

3

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


它也可以在新版Chrome的Windows 10上运行。尽管我必须将.pem文件从默认的Windows \ system32文件夹复制到另一个文件夹,因为Nginx无法访问该文件夹。
vatavale,

2
  • 在您的主目录中复制您的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


1

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

[alt_names] DNS.1 = domainname.com

用您自己的域更改domainname.com。


0

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

用这里写的所有内容都无法重新生成。

更新

有机会确认我的方法今天有效:)。如果对您不起作用,请确保您正在使用此方法

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!


0

这是创建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框上,获取openssl.exe的最佳位置是从“ c:\ Program Files \ Git \ usr \ bin \ openssl.exe”


0

如果要运行服务器本地主机,则需要设置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
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.