我发现本文这是我用来生成 CA 证书的:
openssl genrsa -des3 -out myCA.key 2048
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem
我将其命名为“MyCert”
我用它来签署我为 localhost 生成的证书(这是 ChatGPT 的输出)
$ openssl req -newkey rsa:2048 -nodes -keyout localhost.key -out localhost.csr
$ openssl x509 -req -in localhost.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out localhost.crt -days 365 -sha256
我已将 CA 证书添加到系统(我使用 Fedora):
sudo cp myCA.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
我重新启动了服务器,当访问https://localhost
出现此错误:
NET::ERR_CERT_COMMON_NAME_INVALID
Subject: localhost
Issuer: MyCert
我做错了什么?我对 CA 证书使用了默认字段:
CN = MyCert
O = Default Company Ltd
L = Default City
C = pl
并且本地主机证书具有以下字段:
CN = localhost
C = pl
如何正确创建 CA 证书并为 Fedora 上的 Apache 签署证书?
答案1
这对我有用:
- 生成CA证书。
openssl req -x509 -new -nodes -newkey rsa:2048 -keyout myCA.key \
-sha256 -days 1825 -out myCA.crt -subj /CN='localhost ca'
- 生成服务器证书请求。请注意,除了设置之外,
CN=localhost
我们还设置了subjectAlternativeName
,localhost
因为:
2000 年 5 月发布的 RFC 2818 弃用 HTTPS 证书中的通用名称 (CN) 字段进行主题名称验证。相反,它建议使用“DNS 名称”类型的“主题备用名称”扩展 (SAN)。參考
(请注意,用于识别主机的 commonName 已被弃用24 年前。
openssl req -newkey rsa:2048 -nodes -keyout localhost.key -out localhost.csr \
-subj /CN=localhost -addext subjectAltName=DNS:localhost
- 签署证书请求以创建证书。请注意使用,
-copy_extensions copy
以便我们将subjectAlternativeName
请求中的复制到证书中。
openssl x509 -req -in localhost.csr -copy_extensions copy \
-CA myCA.crt -CAkey myCA.key -CAcreateserial -out localhost.crt -days 365 -sha256
- 将 CA 证书添加到信任库。
sudo cp myCA.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
我正在通过使用以下方式设置一个简单的启用 TLS 的服务器来测试证书球童.我从这个开始Caddyfile
:
{
http_port 8080
}
:8443 {
respond "this is a test"
tls localhost.crt localhost.key
}
进而:
caddy run
现在我们可以看到curl
信任该证书:
$ curl https://localhost:8443
this is a test
如果我从信任库中删除 CA 证书:
sudo rm /etc/pki/ca-trust/source/anchors/myCA.crt
sudo update-ca-trust
然后我们会看到curl
失败:
$ curl https://localhost:8443
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.