我尝试为指向 127.0.0.1 的自定义本地域生成自签名证书:
# /etc/hosts
127.0.0.1 subdomain.domain.local
我已经使用
openssl
生成了一个自签名证书并记住过去一切都有效。但似乎自 Chrome 58 以来,使用自签名证书的限制要多得多。我的尝试以“ 您的连接不是私有(private)的 ”结束,并出现以下错误之一:
我很确定我在这个过程中遗漏了一些东西。拜托,任何人都可以提供处理替代名称的有效配置以及创建相应 CA 和证书的确切步骤,以便 Chrome 和 Firefox 可以处理我的本地自定义域吗?
最佳答案
TLDR
generate.sh
#!/usr/bin/env bash
find . \( -name "$1.*" -o -name "*.srl" \) -type f -delete
cp /usr/lib/ssl/openssl.cnf $1.cnf
python <(
cat << "END"
import sys
from ConfigParser import ConfigParser
from StringIO import StringIO
domain = sys.argv[1]
config = ConfigParser()
config.optionxform = lambda option: option
name = "{}.cnf".format(domain)
with open(name, "rb") as stream:
config.readfp(StringIO("[top]\n" + stream.read()))
config.set(" v3_ca ", "subjectKeyIdentifier", "hash")
config.set(" v3_ca ", "authorityKeyIdentifier", "keyid:always,issuer")
config.set(" v3_ca ", "basicConstraints", "critical, CA:TRUE, pathlen:3")
config.set(" v3_ca ", "keyUsage", "critical, cRLSign, keyCertSign")
config.set(" v3_ca ", "nsCertType", "sslCA, emailCA")
config.set(" v3_req ", "basicConstraints", "CA:FALSE")
config.set(" v3_req ", "keyUsage", "nonRepudiation, digitalSignature, keyEncipherment")
config.set(" v3_req ", "subjectAltName", "@alt_names")
config.remove_option(" v3_req ", "extendedKeyUsage")
config.add_section(" alt_names ")
config.set(" alt_names ", "DNS.1", domain)
config.set(" alt_names ", "DNS.2", "*.{}".format(domain))
config.set(" req ", "req_extensions", "v3_req")
with open(name, "wb") as stream:
config.write(stream)
END
) $1
tail -n +2 $1.cnf > $1.cnf.tmp && mv $1.cnf.tmp $1.cnf
echo "$1\n" | openssl genrsa -aes256 -out $1.ca.key 2048
chmod 400 $1.ca.key
openssl req -new -x509 -subj "/CN=$1" -extensions v3_ca -days 3650 -key $1.ca.key -sha256 -out $1.ca.crt -config $1.cnf
openssl genrsa -out $1.key 2048
openssl req -subj "/CN=$1" -extensions v3_req -sha256 -new -key $1.key -out $1.csr
openssl x509 -req -extensions v3_req -days 3650 -sha256 -in $1.csr -CA $1.ca.crt -CAkey $1.ca.key -CAcreateserial -out $1.crt -extfile $1.cnf
openssl x509 -in $1.crt -text -noout
./generate.sh example.com
Requires Python 2
All credits go to this excellent article by Fabian Lee.
使用 OpenSSL 创建受信任的 CA 和 SAN 证书
先决条件
作为先决条件,请确保已安装 SSL 软件包:
$ sudo apt install libssl1.0.0 -y
自定义openssl.cnf
第一步是抢
openssl.cnf
您的系统上可用的模板。在 Ubuntu 上,这可以在 /usr/lib/ssl/openssl.cnf
上找到。 .您可以在 /System/Library/OpenSSL/
中找到此信息在 MacOS 上,和 /etc/pki/tls
在 Redhat 变体上。export prefix="mydomain"
cp /usr/lib/ssl/openssl.cnf $prefix.cnf
$prefix.cnf
需要使用有关我们将要生成的证书的特定信息进行修改。下
[ v3_ca ]
部分,添加以下值。对于 CA,这意味着我们正在创建一个将用于 key 签名的 CA。[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:TRUE, pathlen:3
keyUsage = critical, cRLSign, keyCertSign
nsCertType = sslCA, emailCA
然后下
[ v3_req ]
部分,设置以下以及此证书的所有有效替代名称。[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
#extendedKeyUsage=serverAuth
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = mydomain.com
DNS.2 = *.dydomain.com
还要取消注释
[ req ]
下的以下行部分,以便使用 v3 扩展创建证书请求。req_extensions = v3_req
当我们生成每种类型的 key 时,我们指定了我们想要使用的扩展部分,这就是为什么我们可以共享
$prefix.cnf
用于创建 CA 和 SAN 证书。创建 CA 证书
现在我们将开始使用 OpenSSL 创建必要的 key 和证书。首先生成私有(private)/公共(public) RSA key 对:
openssl genrsa -aes256 -out ca.key.pem 2048
chmod 400 ca.key.pem
这使用基于 AES256 的密码对 key 文件进行编码。
然后我们需要创建自签名根 CA 证书。
openssl req -new -x509 -subj "/CN=myca" -extensions v3_ca -days 3650 -key ca.key.pem -sha256 -out ca.pem -config $prefix.cnf
您可以使用以下方法验证此根 CA 证书:
openssl x509 -in ca.pem -text -noout
这将显示根 CA 证书,以及
Issuer
和 Subject
将是相同的,因为这是自签名的。这被标记为 CA:TRUE
这意味着它将被识别为根 CA 证书;这意味着浏览器和操作系统将允许将其导入到其受信任的根证书存储中。Issuer: CN=myca
...
Subject: CN=myca
...
X509v3 Basic Constraints:
critical CA:TRUE, pathlen:3
X509v3 Key Usage:
critical Certificate Sign, CRL Sign
Netscape Cert Type:
SSL CA, S/MIME CA
创建由 CA 签署的服务器证书
现在创建了根 CA,我们切换到服务器证书。首先生成私有(private)/公共(public) RSA key 对:
openssl genrsa -out $prefix.key.pem 2048
我们没有在这个 key 上设置密码,仅仅是因为 CA 是更有值(value)的目标,我们总是可以重新生成服务器证书,但请随时采取这种额外的预防措施。
然后创建服务器证书签名请求:
openssl req -subj "/CN=$prefix" -extensions v3_req -sha256 -new -key $prefix.key.pem -out $prefix.csr
然后使用以下内容生成服务器证书:服务器签名请求、CA 签名 key 和 CA 证书。
openssl x509 -req -extensions v3_req -days 3650 -sha256 -in $prefix.csr -CA ca.pem -CAkey ca.key.pem -CAcreateserial -out $prefix.crt -extfile $prefix.cnf
$prefix.key.pem
是服务器私钥和 $prefix.crt
是服务器证书。验证证书:openssl x509 -in $prefix.crt -text -noout
这将显示证书和
Issuer
将是 CA 名称,而主题是前缀。这未设置为 CA,并且 Subject Alternative Name
字段包含浏览器认为有效的 URL。Issuer:
CN=myca
...
Subject:
CN=mydomain
...
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Subject Alternative Name:
DNS:mydomain.com, DNS:*.mydomain.com
浏览器评估
当您第一次使用带有 CA 签名的 SAN 证书将 Chrome 或 Firefox 指向站点时,它会抛出与自签名 SAN 证书相同类型的异常。这是因为根 CA 证书不被认为是签名证书的可信来源。
Chrome 合金
Linux
在 Linux 上,Chrome 管理自己的证书存储,您应该再次导入
ca.pem
进Authorities
.这现在应该使安全图标变成绿色。视窗
在 Chrome 设置 (
chrome://settings
) 中,搜索 certificates
然后点击 Manage Certificates
.在 Windows 上,这将打开 Windows 证书管理器,您应该导入 ca.pem
文件位于 Trusted Root Certification Authorities
标签。这相当于通过 mmc.exe
添加它,在 local user
受信任的根存储(不是计算机级别)。火狐
在 Firefox 选项中
about:preferences
, 搜索 certificates
然后点击 View Certificates
.转至 Authorities
选项卡并导入 ca.pem
.选中该框以使其信任网站,现在当您访问该页面时,锁定图标应变为绿色。关于google-chrome - 如何在 Linux Chrome 和 Firefox 上信任自签名本地主机证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50788043/