我无法发表评论,因此我添加了一个单独的答案。我尝试为NGINX创建自签名证书,这很容易,但当我想将其添加到Chrome白名单时遇到了问题。我的解决方案是创建一个根证书,并使用它签署一个子证书。
这是一个好习惯,因为您只需创建一次即可重用。
[ req ]
default_bits = 2048
prompt = no
distinguished_name=req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
countryName=UA
stateOrProvinceName=root region
localityName=root city
organizationName=Market(localhost)
organizationalUnitName=roote department
commonName=market.localhost
emailAddress=root_email@root.localhost
[ alternate_names ]
DNS.1 = market.localhost
DNS.2 = www.market.localhost
DNS.3 = mail.market.localhost
DNS.4 = ftp.market.localhost
DNS.5 = *.market.localhost
[ v3_req ]
keyUsage=digitalSignature
basicConstraints=CA:true
subjectKeyIdentifier = hash
subjectAltName = @alternate_names
下一个用于您的子证书的配置文件将被称为config_ssl.cnf。
[ req ]
default_bits = 2048
prompt = no
distinguished_name=req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
countryName=UA
stateOrProvinceName=Kyiv region
localityName=Kyiv
organizationName=market place
organizationalUnitName=market place department
commonName=market.localhost
emailAddress=email@market.localhost
[ alternate_names ]
DNS.1 = market.localhost
DNS.2 = www.market.localhost
DNS.3 = mail.market.localhost
DNS.4 = ftp.market.localhost
DNS.5 = *.market.localhost
[ v3_req ]
keyUsage=digitalSignature
basicConstraints=CA:false
subjectAltName = @alternate_names
subjectKeyIdentifier = hash
第一步 - 创建根密钥和证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -key ca.key -out ca.crt -days 365 -config config_ssl_ca.cnf
第二步是创建子密钥并生成CSR - 证书签名请求文件。因为我们的想法是通过根证书签署子证书并获得正确的证书。
openssl genrsa -out market.key 2048
openssl req -new -sha256 -key market.key -config config_ssl.cnf -out market.csr
在Linux终端中执行以下命令。echo 00 > ca.srl
touch index.txt
ca.srl 文本文件包含下一个要使用的十六进制序列号。 必须存在且包含有效的序列号。
最后一步,创建另一个配置文件并将其命名为config_ca.cnf。
[ ca ]
default_ca = my_ca
[ my_ca ]
serial = ./ca.srl
database = ./index.txt
new_certs_dir = ./
certificate = ./ca.crt
private_key = ./ca.key
default_md = sha256
default_days = 365
policy = my_policy
copy_extensions = copy
[ my_policy ]
countryName = match
stateOrProvinceName = supplied
organizationName = supplied
commonName = market.localhost
organizationalUnitName = optional
commonName = supplied
你可能想知道,为什么这么难,为什么我们必须创建一个新的配置文件来通过根证书签署子证书。答案很简单,因为子证书必须有一个SAN块 - Subject Alternative Names。
如果我们使用“openssl x509”工具签署子证书,根证书将删除子证书中的SAN字段。
因此,我们使用“openssl ca”而不是“openssl x509”来避免删除SAN字段。我们创建了一个新的配置文件,并告诉它复制所有扩展字段copy_extensions = copy。
openssl ca -config config_ca.cnf -out market.crt -in market.csr
程序会向您询问2个问题:
- 签署证书?回答“Y”
- 1 个证书请求已认证,确认提交吗?回答“Y”
在终端中,您可以看到一个带有“数据库”一词的句子,它表示您通过命令“touch”创建的文件index.txt。该文件将包含您使用“openssl ca”工具创建的所有证书的信息。
要检查证书是否有效,请使用以下命令:
openssl rsa -in market.key -check
如果你想看到CRT里面的内容:openssl x509 -in market.crt -text -noout
如果您想了解CSR内部情况:
openssl req -in market.csr -noout -text
alternate_names
部分的配置文件,并使用-config
选项传递它。同时,在通用名称(CN)中放置DNS名称被IETF和CA/Browser论坛弃用(但不被禁止)。在CN中的任何DNS名称也必须存在于SAN中。无法避免使用SAN。请参见下面的答案。 - jww.com
,而是.org
。 - Yu Jiaao