生成CSR
# 1. 生成新的CSR和私钥(-nodes 参数指示私钥不需要使用密码加密,domain.key 是生成的私钥,domain.csr 是生成的CSR)
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
# 2. 使用已有私钥生成CSR(domain.key 是已经存在的私钥)
openssl req -key domain.key -new -out domain.csr
# 3. 使用已有证书生成新的CSR(domain.crt 是已经存在的证书, domain.key 是已经存在的私钥)
openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csr
生成SSL证书
# 1. 生成自签名证书(-x509 指示创建自签名证书, -days 365 指定证书的有效期是365天)
openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt
# 2. 根据已有私钥生成自签名证书 (domain.key 是已经存在的私钥)
openssl req -key domain.key -new -x509 -days 365 -out domain.crt
# 3. 根据已有私钥和CSR生成自签名证书(domain.key 是已经存在的私钥, domain.csr 是已经存在的CSR)
openssl x509 -signkey domain.key -in domain.csr -req -days 365 -out domain.crt
查看证书
# 1. 查看校验CSR
openssl req -text -noout -verify -in domain.csr
# 2. 查看自签名证书
openssl req -text -noout -verify -in domain.csr
# 3. 查看CA签名的证书(ca.crt 是CA的证书)
openssl verify -verbose -CAFile ca.crt domain.crt
私钥
# 1. 创建私钥(-des3 需要输密码加密私钥)
openssl genrsa -des3 -out domain.key 2048
# 2. 验证私钥
openssl rsa -check -in domain.key
# 3. 验证证书、CSR和私钥一致(openssl md5 这三个命令的输出一样)
openssl rsa -noout -modulus -in domain.key
openssl md5 openssl x509 -noout -modulus -in domain.crt
openssl md5 openssl req -noout -modulus -in domain.csr
# 4. 加密私钥
openssl rsa -des3 -in domain.key -out encrypted-domain.key
# 5. 解密私钥
openssl rsa -in encrypted-domain.key -out domain.key
证书格式
# 1. PEM 转 DER
openssl x509 -in domain.crt -outform der -out domain.der
# 2. DER 转 PEM
openssl x509 -inform der -in domain.der -out domain.crt
# 3. PEM 转 PKCS7(把 domain.crt ca-chain.crt 放到一个文件中)
openssl crl2pkcs7 -nocrl -certfile domain.crt -certfile ca-chain.crt -out domain.p7b
# 4. PKCS7 转 PEM(domain.crt 中包含了两个证书)
openssl pkcs7 -in domain.p7b -print_certs -out domain.crt
# 5. 把私钥和证书打包成PKCS12
# 该命令会提示输入密码,留空不设置。
openssl pkcs12 -inkey domain.key -in domain.crt -export -out domain.pfx
# 如果有多级CA证书
cat domain.crt intermediate.crt [intermediate2.crt] ... rootCA.crt > cert-chain.txt openssl pkcs12 -inkey domain.key -in cert-chain.txt -export -out domain.pkcs12
# keytool是java工具,把PKCS12转成keystore,用于java软件,jetty,tomcat等。
keytool -importkeystore -srckeystore domain.pfx -srcstoretype PKCS12 -destkeystore keystore
# 使用keytool创建keystore
keytool -keystore keystore -alias jetty -genkey -keyalg RSA -sigalg SHA256withRSA
# 6. 把PKCS12转成PEM
openssl pkcs12 -in domain.pfx -nodes -out domain.combined.crt
# 7. P7B 转 PFX/P12
# 7.1. 提取 P7B 文件中的证书链
# -print_certs 输出证书链
# -in P7B 文件
# -out 输出文件路径(PEM格式)
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
# 7.2. 转换
# -name 设置Entry名称【可选】
# -in pem格式证书/证书链
# -inkey pem格式的私钥文件
# -out 输出文件路径
openssl pkcs12 -export -name xxx -in cert.cer -inkey private.key -out out.pfx
证书操作
# 1. 查看证书指纹
# -sha256 计算sha256指纹【可替换为-sha1计算sha1的指纹】
openssl x509 -fingerprint -sha256 -noout -in certificate.pem
SMIME相关操作
# 1. 转换为 PKCS7 格式
openssl smime -pk7out -inform der -in smime.p7m -out result.pem
# 2. 校验并提取P7M文件中的内容
# -noverify 不进行验证,如果需要验证,则需要指定 -CAfile 等参数
openssl smime -verify -inform der -in smime.p7m -out result.json -noverify
OCSP 查询操作
参考资料: https://doc.primekey.com/ejbca/ejbca-operations/ejbca-ca-concept-guide/protocols/ocsp
# POST 请求
openssl ocsp -issuer Test-CA.pem -CAfile Test-CA.pem -cert Test.pem -req_text -url http://localhost:8080/ejbca/publicweb/status/ocsp
# GET 请求
# 1. 创建 请求文件
openssl ocsp -noverify -no_nonce -reqout ocsp.req -issuer Test-CA.pem -cert Test.pem -url "http://ocsp.wt.trustasia.com/xxx" -header "HOST"="ocsp.wt.trustasia.com" -text
# 2 发送 get 请求
# -H "Content-Type: application/ocsp-request"
# --header "Host: ocsp.wt.trustasia.com"
curl -v -o ocsp.resp --url http://ocsp.wt.trustasia.com/xxx/`base64 -i ocsp.req`
# 3. 解析结果文件
openssl ocsp -noverify -text -respin ocsp.resp