我尝试为指向127.0.0.1的自定义本地域生成自签名证书:
# /etc/hosts
127.0.0.1 subdomain.domain.local
我很确定我在这个过程中错过了什么。请,谁能提供有效的配置,以处理替代名称,以及确切的步骤,以创建相应的CA和证书,以便Chrome和Firefox可以处理我的本地自定义域?
>
创建文件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
需要Python 2
$ sudo apt install libssl1.0.0 -y
第一步是获取系统上可用的openssl.cnf
模板。在Ubuntu上,可以在/usr/lib/ssl/openssl.cnf
中找到。您可以在MacOS上的/system/library/openssl/
和Redhat Variants上的/etc/pki/Tls
中找到这一点。
export prefix="mydomain"
cp /usr/lib/ssl/openssl.cnf $prefix.cnf
$prefix.cnf
需要用我们将要生成的证书的特定信息来修改。
在[v3_ca]
部分下,添加以下值。对于CA来说,这表示我们正在创建一个用于密钥签名的CA。
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:TRUE, pathlen:3
keyUsage = critical, cRLSign, keyCertSign
nsCertType = sslCA, emailCA
[ 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_extensions = v3_req
当我们生成每种类型的密钥时,我们会指定要使用的扩展部分,这就是为什么我们可以共享$prefix.cnf
来创建CA证书和SAN证书。
现在我们将开始使用OpenSSL创建必要的密钥和证书。首先生成私有/公共RSA密钥对:
openssl genrsa -aes256 -out ca.key.pem 2048
chmod 400 ca.key.pem
这将使用基于AES256的密码短语对密钥文件进行编码。然后我们需要创建自签名根CA证书。
openssl req -new -x509 -subj "/CN=myca" -extensions v3_ca -days 3650 -key ca.key.pem -sha256 -out ca.pem -config $prefix.cnf
openssl x509 -in ca.pem -text -noout
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后,我们切换到服务器证书。首先生成私有/公共RSA密钥对:
openssl genrsa -out $prefix.key.pem 2048
我们没有在这个密钥上加密码短语,仅仅是因为CA是更有价值的目标,并且我们总是可以重新生成服务器证书,但是请放心采取这种额外的预防措施。
然后创建服务器证书签名请求:
openssl req -subj "/CN=$prefix" -extensions v3_req -sha256 -new -key $prefix.key.pem -out $prefix.csr
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
openssl x509 -in $prefix.crt -text -noout
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
当您第一次将Chrome或Firefox指向带有CA签名的SAN证书的站点时,它将抛出与自签名SAN证书相同类型的异常。这是因为根CA证书不是已签名证书的可信源。
在Chrome设置(Chrome:/settings
)中,搜索证书
并单击管理证书
。在Windows上,这将打开Windows证书管理器,您应该在受信任的根证书颁发机构
选项卡上导入ca.pem
文件。这相当于通过mmc.exe
在本地用户
受信任根存储(不是计算机级别)中添加它。
我正试图将我的计算机配置为信任用于测试网站的自签名证书。然而,我在Firefox上遇到了一些问题。Chrome和IE都没问题。 我做了以下几点。 使用OpenSSL创建2048位pem rsa密钥和crt 从密钥和crt文件创建pfx文件 使用MMC将pfx导入到服务器上的个人证书存储中 将IIS配置为使用站点的证书 在客户端PC上 null 我还尝试将证书直接添加到Firefox的权限列表中。它
我已经为我的服务器生成了自我签名的证书。然后用设置->安全->安装添加到Android中。 据我所知,在我将证书添加到受信任的列表中之后,它应该可以很好地工作。我是不是漏掉了什么?其思路是通过Android系统添加证书,无需修改应用程序代码。 顺便说一句,我使用进行网络连接。也许我应该启用连接?
当我们过渡到使用已购买的.dev域进行本地开发时,我正在使用以下代码生成证书: 证书在Mac OSX上运行良好,添加到钥匙链访问后,但在ubuntu上,我使用任何浏览器都遇到了问题。
正如标题所说。我开始向站点添加服务工作者,为了使他们工作,他们需要有效的SSL证书。我已经有一段时间让我的本地开发服务器通过https提供一个自签名的证书,尽管Chrome给出了“不安全”的消息,直到现在我才忽略了这个消息。我在这里看到过很多类似的问题(使用localhost),但没有任何与我的设置(在localhost上使用虚拟主机)匹配的问题,而且我尝试过的问题都没有奏效。 我将描述我的设置:
MarkFisher.Local使用了无效的安全证书。证书不是来自受信任的源。错误代码:MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY 我已按此答案中的建议将设置为。此外,转到首选项>隐私与安全>查看证书,我可以看到我的证书在“授权”选项卡中,并且我已经在“编辑信任”对话框中选中了“此证书可以标识网站”。这个原来没有检查 然而,Firefox拒绝接受该证