如何正确创建 CA 证书并签署 SSL/TLS 证书以供 Apache 在本地主机中使用?

如何正确创建 CA 证书并签署 SSL/TLS 证书以供 Apache 在本地主机中使用?

我发现本文这是我用来生成 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

这对我有用:

  1. 生成CA证书。
openssl req -x509 -new -nodes -newkey rsa:2048 -keyout myCA.key \
  -sha256 -days 1825 -out myCA.crt -subj /CN='localhost ca'
  1. 生成服务器证书请求。请注意,除了设置之外,CN=localhost我们还设置了subjectAlternativeNamelocalhost因为:

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
  1. 签署证书请求以创建证书。请注意使用,-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
  1. 将 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.

相关内容