一、总览
# 生成密钥
$ openssl genrsa ...
# 密钥相关操作,如:查看、去掉密码等
$ openssl rsa ...
# “签名请求证书”相关操作,如:生成、查看等
$ openssl req ...
# “证书”相关操作,如:生成、查看等
$ openssl x509 ...
# 计算哈希值
$ openssl md5 ...
$ openssl sha1 ...
二、常用场景
1、创建密钥对
# 创建私钥
$ openssl genrsa -out rsa_1024_priv.pem 1024
# 根据私钥得到公钥
$ openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem
2、自签名
# 1.生成私钥
$ openssl genrsa -des3 -out server.key 1024
# 2.从秘钥中删除 Passphrase
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
# 3.生成 CSR (Certificate Signing Request)
$ openssl req -new -key server.key -out server.csr
# 4.生成自签名证书
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
3、私有 CA 签名
# 1.创建 CA 私钥
$ openssl genrsa -des3 -out ca.key 4096
# 2.生成 CA 的自签名证书
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt
# 3.生成需要颁发证书的私钥
$ openssl genrsa -des3 -out server.key 4096
# 4.生成要颁发证书的证书签名请求,证书签名请求当中的 Common Name 必须区别于 CA 的证书里面的 Common Name
$ openssl req -new -key server.key -out server.csr
# 5.用 2 创建的 CA 证书给 4 生成的 签名请求 进行签名
$ openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
4、苹果推送证书相关操作
(1)创建申请证书 CSR
(2)然后生成证书并下载,拿到 .cer
,并将 .cer
导入 Keychain
(3)从 Keychain 中,把证书及其私钥分别导出为 cert.p12
和 key.p12
(4)使用 OpenSSL 操作
# 从 p12 格式证书中提取证书,不包含私钥,并输出为 pem 格式
$ openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
# 从 p12 格式私钥中,提取私钥,不包含证书,并输出为 pem 格式
$ openssl pkcs12 -nocerts -out key.pem -in key.p12
# 去掉私钥密码
$ openssl rsa -in key.pem -out key.unencrypted.pem
# 将 pem 格式的 证书 和 未加密私钥 拼接成一个新的 pem
$ cat cert.pem key.unencrypted.pem > ck.pem
5、计算文件哈希值
# 计算文件 MD5 值
$ openssl md5 myfile.txt
# 计算文件 SHA1 值
$ openssl sha1 myfile.txt
# 计算文件 SHA256 值
$ openssl sha1 -sha256 myfile.txt
6、证书校验
验证一个证书是否是某一个 CA 签发,文件格式必须为 PEM
# 验证一个证书是否是某一个CA签发,文件格式必须为 PEM
$ openssl verify -CAfile cafile.pem apache.crt
7、模拟客户端访问
s_client
常用参数:
连接相关参数:
-connect host:port - 要连接的位置(默认为 localhost:4433)
-proxy host:port - 连接 HTTP 代理
显示相关参数:
-msg - 显示协议消息
-showcerts - 显示证书链中的所有证书
证书相关参数:
-cert arg - 要使用的证书文件,假定为 PEM 格式
-certform arg - 证书格式(PEM 或 DER)默认 PEM
-key arg - 要使用的私钥文件,如果未指定,则在 cert 文件中。
-keyform arg - 密钥格式(PEM 或 DER)默认 PEM
-pass arg - 私钥文件密码
-CApath arg - CA 的 PEM 格式目录
-CAfile arg - CA 的 PEM 格式文件
(1)验证服务器是否使用合法 CA 颁发的 HTTPS 证书
# 模拟一个 ssl 客户端访问 ssl 服务器
$ openssl s_client -connect 192.168.20.51:443
(2)验证服务器是否使用自签名 CA 颁发的 HTTPS 证书
# 模拟一个 ssl 客户端访问 ssl 服务器,看证书是否 ca.crt 签发
$ openssl s_client -connect test.com:28082 -CAfile ca.crt
(3)双向 HTTPS 验证
启用双向 HTTPS 验证时,通过此方法指定客户端证书
# 如果服务端要求客户端提供证书 则在加上 -cert 和-key参数 比如
$ openssl s_client -connect 192.168.20.51:443 -cert client.crt -key client.key
三、格式转换
1、DER
与 PEM
的相互转化
用 -outform
-inform
指定 DER
还是 PEM
格式。例如:
# PEM 转为 DER
$ openssl x509 -in cert.pem -inform PEM -out cert.cer -outform DER
# DER 转为 PEM
$ openssl x509 -in cert.cer -inform DER -out cert.pem -outform PEM
2、PKCS#12(p12)/pfx
与 PEM
的相互转换
# 从 cert.p12 中提取 私钥,不包含证书,私钥不加密,输出为 PEM 格式
$ openssl pkcs12 -nocerts -nodes -in cert.p12 -out privatekey.pem
# 从 cert.p12 中,只输出 client 证书,不输出私钥,输出为 PEM 格式
$ openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
# 将密钥与证书合成为 cert.p12
$ openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12
四、其他
查看信息
# 查看私钥信息
$ openssl rsa -noout -text -in server.key
# 查看签名请求信息
$ openssl req -noout -text -in server.csr
# 查看ca的私钥信息
$ openssl rsa -noout -text -in ca.key
# 查看证书信息
$ openssl x509 -noout -text -in ca.crt
# 查看一个证书吊销列表信息
$ openssl crl -text -in xx.crl
# 查看一个证书的额外信息
$ openssl x509 -purpose -in cacert.pem
# 查看一个公钥的信息
$ openssl rsa -noout -text -pubin -in apache.pub
(完)