创建自签名CA并颁发服务器证书

创建自签名Certificate Authority

1. 创建根私钥用于签署证书

openssl genpkey -algorithm RSA -out rootCA.key -aes256
  • genpkey 生成私钥
  • -algorithm RSA 指定所使用的算法为RSA(常用的公钥加密算法)
  • -out *.key 指定输出文件的名称和路径
  • -aes256 指定使用AES-256加密算法对私钥进行加密,意味着每次使用时都要输入加密信息,包括服务器重启
    • 在可信安全环境或要使用自动化脚本的情况下,可以不使用

2. 使用根私钥创建CA根证书

openssl req -key rootCA.key -new -x509 -out rootCA.crt -days 3650
  • req 用于生成证书请求(Certificate Signing Request, CSR)或自签名证书
  • -key *.key 指定要使用的用来签署生成的证书的私钥文件
  • -new 表示要生成一个新的证书请求或证书
    • 在使用了-x509选项指示直接生成自签名证书时-new可以省略,但为保持清晰建议保留
  • -x509 指示openssl生成一个自签名X.509证书而不是证书请求
    • 在使用req生成自签名证书时,-x509是必需选项
  • -days 指定证书的有效期,按天计

使用自签名CA签署服务器证书

1. 创建用于服务器下发证书的私钥

openssl genpkey -algorithm RSA -out server.key -aes256
  • 解释同CA根私钥
  • 该私钥可以与多个证书签署关联,适用于服务器面向多用户的情况

2. 生成证书签署请求CSR

openssl req -new -key server.key -out new.csr -config *.cnf -extensions v3_ext
  • 解释同CA根证书创建
  • 这里不使用-x509req默认生成证书请求
    • -x509决定着req是生成请求还是生成证书
  • -config表示在生成证书时使用配置文件

3. 使用根证书签署服务器证书

openssl x509 -req -in new.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out new.crt -days 3650 -extfile *.cnf -extensions v3_ext
  • x509 openssl工具集中用于处理和管理X.509个数的数字证书
    • 功能包括:查看证书、证书格式转换、生成自签名证书、从CSR生成证书、检查证书有效性等
  • -req 表示输入的是一个CSR,用现有的CSR生成证书
  • -in *.csr 指定输入的CSR文件,文件包含证书的签名请求
  • -CA *.crt 指定用于签名的根证书文件,该证书会被用来验证生成的服务器证书
  • -CAkey *.key 指定根证书的私钥文件,用于对新的服务器证书进行签名
  • -CAcreateserial 表示如果没有现有的序列号文件,openssl会自动创建一个新的序列号文件,序列号文件用于唯一标识证书
  • -out *.crt 指定生成的服务器证书文件名和路径
  • -days 指定生成证书的有效期

4. 验证证书链

openssl verify -CAfile rootCA.crt new.crt
  • verify openssl的验证命令,用于检查证书的有效性
  • -CAfile *.crt 指定CA根证书文件,用于验证要验证的签名证书
  • *.crt 要验证的服务器证书,检查该证书是否由指定的CA签发并且验证该证书链是否完整
  • 如果验证成功会输出OK

5. (可选)生成的*.crt服务器证书能够满足大多数需求,有些情况下需要按需进行格式等的转换

6. 后续处理

  • 清理CSR证书签署请求
  • 保存生成的证书和私钥,ubuntu下证书一般在/etc/ssl/certs/,私钥保存在安全位置/etc/ssl/private/

服务器证书的使用

  • 访问服务器的客户端浏览器:手动导入创建的自签名CA证书(.crt)
  • 想让系统上的命令行工具、服务等信任自签名的CA证书须执行sudo update-ca-certificates

openssl.cnf文件示例

[ req ]
default_bits        = 2048
distinguished_name  = req_distinguished_name
req_extensions      = v3_ext

[ req_distinguished_name ]
C  = CN
ST = HLJ
L  = HRB
O  = HIT
OU = CS
CN = i.cnblogs.com

[ v3_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = i.cnblogs.com
DNS.2 = i.csdn.com
IP.1 = 127.0.0.15
IP.2 = 192.168.2.11
  • 注意当前openssl中要求必须启动SAN,即有上述subjectAltNamealt_names部分
posted @ 2024-12-16 20:27  Twinblade_i  阅读(239)  评论(0)    收藏  举报