为 *.localhost (“通配符”)生成自签名证书的正确方法是什么

Pol*_*her 1 ssl https openssl google-chrome

我一生都无法让 chrome 使用通配符证书(“*.localhost”)

这就是我正在做的生成所述证书的操作。

首先我生成我的 ca

openssl genrsa -out priv/cert/ca.key 2048
openssl req -new -x509 -nodes -subj "/C=US/O=_Development \
CA/CN=Development certificates" -key priv/cert/ca.key -sha256 \
-days 3650 -out priv/cert/ca.crt
Run Code Online (Sandbox Code Playgroud)

然后我生成我的本地主机

openssl genrsa -out priv/cert/localhost.key 2048
openssl req -new -subj "/C=US/O=Local Development/CN=*.localhost" -key \
priv/cert/localhost.key -out priv/cert/localhost.csr
Run Code Online (Sandbox Code Playgroud)

然后我制作我的 ext 文件

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names
[req]
req_extensions = req_ext
[req_distinguished_name]
commonName_default = localhost
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.localhost
DNS.2 = foo.localhost
DNS.3 = localhost
Run Code Online (Sandbox Code Playgroud)

然后我签字。

openssl x509 -req \
    -in priv/cert/localhost.csr \
    -extfile priv/cert/localhost.ext \
    -CA priv/cert/ca.crt \
    -CAkey priv/cert/ca.key \
    -CAcreateserial \
    -out priv/cert/localhost.crt \
    -days 365 \
    -sha256
Run Code Online (Sandbox Code Playgroud)

在信任我的 crt 并在本地导航到 localhost 或 foo.localhost 后,我​​得到所有绿色,但如果我说 bar.localhost 通配符不起作用,我会在 chrome 上得到 NET::ERR_CERT_COMMON_NAME_INVALID 。

我在这里缺少什么。我已经解决了主题备用名称问题,我已经排除了通过 foo 运行 SAN 的可能性。从我读到的内容来看,通用名称甚至不再重要。我不知所措。

Ste*_*ich 5

TL;DR:浏览器不会接受*.localhost证书。

后缀被视为顶级域 (TLD),并且不允许在 TLD 正下方使用通配符*.localhostlocalhost其背后的想法基本上是,没有任何一个组织真正拥有类似的 TLD com,因此允许证书*.com将是相当危险的。因此*.localhost不会被接受,而*.foo.localhost会。

有关这方面的更多信息,请参阅Nginx 和 Chrome 的通配符 *.localhost SSL能否为二级域颁发通配符 SSL 证书?