一尘不染

如何使用 OpenSSL 生成自签名 SSL 证书?

javascript

我正在向嵌入式 Linux 设备添加 HTTPS 支持。我尝试使用以下步骤生成自签名证书:

openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem

这可行,但我遇到了一些错误,例如,谷歌浏览器:

这可能不是您要找的网站!
该站点的安全证书不受信任!

我错过了什么吗?这是构建自签名证书的正确方法吗?


阅读 163

收藏
2022-02-18

共1个答案

一尘不染

截至 2022 年,OpenSSL ≥ 1.1.1,以下命令可满足您的所有需求,包括主题备用名称 (SAN)

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout example.key -out example.crt -subj "/CN=example.com" \
  -addext "subjectAltName=DNS:example.com,DNS:www.example.net,IP:10.0.0.1"

在 OpenSSL ≤ 1.1.0 的旧系统上,例如 Debian ≤ 9 或 CentOS ≤ 7,需要使用更长版本的此命令:

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout example.key -out example.crt -extensions san -config \
  <(echo "[req]"; 
    echo distinguished_name=req; 
    echo "[san]"; 
    echo subjectAltName=DNS:example.com,DNS:www.example.net,IP:10.0.0.1
    ) \
  -subj "/CN=example.com"

任一命令都会创建一个证书,该证书是

  • 对(子)域example.comwww.example.net(SAN)有效,
  • 也适用于 IP 地址10.0.0.1(SAN),
  • 相对强劲(截至 2022 年)和
  • 有效期为3650几天(~10 年)。

生成以下文件:

  • 私钥:example.key
  • 证书:example.crt

所有信息都在命令行中提供。没有让您烦恼的交互式输入。没有配置文件你必须弄乱。所有必要的步骤都由单个 OpenSSL 调用执行:从生成私钥到自签名证书。


备注 #1:加密参数

由于证书是自签名的,需要用户手动接受,所以使用短过期或弱密码是没有意义的。

将来,您可能希望为 RSA 密钥使用更多4096位,并使用比 更强的哈希算法sha256,但截至 2022 年,这些都是合理的值。它们足够强大,同时受到所有现代浏览器的支持。

备注#2:参数“ -nodes

从理论上讲,您可以省略-nodes参数(这意味着“没有 DES 加密”),在这种情况下example.key将使用密码进行加密。但是,这对于服务器安装几乎没有用处,因为您要么必须将密码也存储在服务器上,要么必须在每次重新启动时手动输入。

2022-02-18