常用 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
选项。