跳到主要内容

常用 OpenSSL 命令

基本命令

生成私钥

生成一个 2048 位的 RSA 私钥。

openssl genrsa -out private.key 2048

如果是 ECC 算法,一个常用的曲线是 prime256v1(也称为 secp256r1)。使用以下命令生成 ECC 私钥:

openssl ecparam -name prime256v1 -genkey -out ec_private.key

提取公钥

openssl rsa -in private.key -pubout -out public.key

ECC 算法下提取公钥大同小异。

openssl ec -in ec_private.key -pubout -out ec_public.key

生成证书请求(CSR)

openssl req -new -key private.key -out certificate.csr

生成自签名证书

使用CSR生成自签名证书,有效期10年。

openssl x509 -req -days 3650 -in certificate.csr -signkey private.key -out certificate.crt

如果是一步到位,不用CSR直接生成自签名证书。

openssl req -new -x509 -key private.key -out certificate.crt -days 3650

SAN(Subject Alternative Name)

近年来,浏览器和客户端对 SSL/TLS 证书的处理策略有所变化。特别是,一些浏览器开始要求证书使用 Subject Alternative Name(SAN)字段,而不仅仅是 Common Name。

SAN 字段可以包含多个域名,这样就可以用一张证书,为多个域名提供 SSL 服务。

生成 SAN 配置文件

[ req ]
prompt = no
distinguished_name = dn
req_extensions = req_ext

[ dn ]
commonName = 192.168.1.100

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
IP.1 = 192.168.1.100

如果alt_names中有多个域名,比如

[ alt_names ]
DNS.1 = example.com
DNS.2 = www.example.com
IP.1 = 192.168.1.100

这时候Common Name里写那个主要的域名就可以了,比如example.com。 浏览器会先看alt_names里的域名,如果没有找到,再去看Common Name里的域名。不过现代浏览器已经逐渐不再使用Common Name了,所以这个字段可以随便写。(by ChatGPT)

另外,distinguished_name里还可以写一些其他的信息,比如国家、地区、组织、单位等等。

[ dn ]
countryName = <country_or_region_code> # ISO 3166格式的国家名,比如 CN
stateOrProvinceName = <state_or_province> # 比如 Beijing
localityName = <city_or_locality> # 比如 Beijing
organizationName = <organization_name> # 比如 Example Inc
organizationalUnitName = <organizational_unit_name> # 比如 IT Department
commonName = <common_name> # 应与 alt_names 下的某个 SAN 匹配

基于 SAN 配置文件生成证书请求(CSR)

把上面的配置文件命名为san.cnf,然后执行下面的命令。

openssl req -new -key private.key -out certificate.csr -config san.cnf

使用 SAN 配置文件生成自签名证书

openssl x509 -req -days 3650 -in certificate.csr -signkey private.key -out certificate.crt -extensions req_ext -extfile san.cnf
  • -extfile指定配置文件
  • -extensions指定使用配置文件中的哪一块配置,就是中括号里的那个名字,这里是req_ext

检查证书信息

检查证书内容

openssl x509 -in certificate.crt -text -noout

检查CSR内容

openssl req -in certificate.csr -text -noout

检查私钥内容

openssl rsa -in private.key -check
# or for ECC
openssl ec -in ec_private.key -check

证书格式转换

PEM 转 DER

openssl x509 -in certificate.crt -outform der -out certificate.der

DER 转 PEM

openssl x509 -in certificate.der -inform der -out certificate.crt

一般用 x509 命令生成的证书是 PEM 格式的。 PEM格式证书的开头是-----BEGIN CERTIFICATE-----,结尾是-----END CERTIFICATE-----

打包公钥和证书到 PKCS#12 文件

openssl pkcs12 -export -in certificate.crt -inkey private.key -out certificate.p12
  • -inkey private.key 指定私钥文件。
  • -in certificate.crt 指定您的公钥证书。
  • -certfile intermediate.crt 指定中间证书(如果有)。 如果您的证书链不包含中间证书,可以省略-certfile选项。