如何将 OpenSSL 用于具有自定义 CA 和适当 SAN 设置的自签名证书?

How to use OpenSSL for self-signed certificates with custom CA and proper SAN settings?

我 运行 偶尔翻阅这个主题,试图记住这是如何完成的,然后再次找到所有不完整的答案(使用配置文件,oneliners,忽略我们真的想使用自定义 CA创建完整的证书链等)。许多答案将 SAN 应用于证书请求,但在签名命令中搞砸了 SAN...

我想做什么?

  1. 创建自定义 CA
  2. 创建证书申请。
  3. 签署证书申请。
  4. 创建链文件
  5. Firefox/Chrome 中的其他步骤(是的,Chrome 需要 SAN)

(是的,请不要在一个命令中执行所有操作,我希望我的 CA 驻留在另一台机器上) (是的,这对其他人来说可能又是不完整的。但这正是我每年需要 1-2 次的,当我的 DEV 环境中的一个简单的自签名证书,我只是通过配置信任,是不够的) (是的,如果您不是一个人请求和签署证书的人,您可能想要实施额外的验证步骤)

让我们假设,我们想在我们的 LAN 中为我们的新 server/host 设置一个自签名证书,其中 Let's Encrypt 对我们来说不是一个选项,例如FRITZ!Box,域:fritz.box,https://fritz.box,IPv4:192.168.1.1

1.1 为您的 CA 生成私钥

openssl genrsa -aes256 -out patrickca.key 4096

关于 -aes128 或 -aes256:https://security.stackexchange.com/q/14068

1.2生成CA证书(根证书)

openssl req -new -key patrickca.key -x509 -out patrickca.crt -days 3650

2。创建您的 domain/server 证书请求

openssl req -new -nodes -newkey rsa:4096 -keyout fritzbox.key -out fritzbox.req -batch -subj "/C=DE/ST=Hamburg/L=Hamburg/O=Patrick CA/OU=router/CN=fritz.box" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:fritz.box,IP:192.168.1.1"))

3。签署证书请求

openssl x509 -req -in fritzbox.req -CA patrickca.crt -CAkey patrickca.key -CAcreateserial -out fritzbox.crt -days 3650 -sha256 -extfile <(printf "subjectAltName=DNS:fritz.box,IP:192.168.1.1")

4。构建一个链文件(您可能希望在您的组织过程中有一个额外的中间证书)

cat fritzbox.key > fritzboxchain.pem 
cat fritzbox.crt >> fritzboxchain.pem
cat patrickca.crt >> fritzboxchain.pem 

如果这不仅仅是一个示例,您可以将此文件导入您的 FRITZ!Box。

5。 Firefox 和 Chrome 中的其他步骤(我目前不使用其他浏览器,我的组织中没有其他人使用)

如果您的浏览器显示有关您的 https 证书的警告消息,您当然想确认您知道自己在做什么。

您可能希望将其设置为永久例外。

但是:请将步骤1.2的CA证书导入为可信CA。 (在 05/2020 中,Firefox 设置 CN= 应该就足够了,因为 Chrome 你可能有 SAN 问题,如果它仍然没有,除了你的自签名证书)