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

Pat*_*ick 2 linux openssl certificate ca x509

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

我想做的事?

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

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

问候帕特里克

Pat*_*ick 10

让我们假设,我们想为我们局域网内的新服务器/主机设置一个自签名证书,其中 Let's Encrypt 不是我们的选择,例如 FRITZ!Box,域:fritz.box,https://fritz。框,IPv4:192.168.1.1

1.1 为您的 CA 生成私钥

openssl genrsa -aes256 -out patrickca.key 4096
Run Code Online (Sandbox Code Playgroud)

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

1.2 生成CA证书(根证书)

openssl req -new -key patrickca.key -x509 -out patrickca.crt -days 3650
Run Code Online (Sandbox Code Playgroud)

2. 创建您的域/服务器证书请求

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"))
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

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

cat fritzbox.key > fritzboxchain.pem 
cat fritzbox.crt >> fritzboxchain.pem
cat patrickca.crt >> fritzboxchain.pem 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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