OpenSSL 除了提供一个开发库之外,还包括了一些常用的命令,这里简单介绍其使用方式。
安装
一般在 Linux 发行版本中已经安装了 OpenSSL ,可以通过 openssl version
查看其版本号,通过 -a
参数查看详细的编译参数;也可以通过如下方式从源码安装:
$ ./config -fPIC no-shared --prefix=/usr/local --openssldir=/usr/local/ssl
$ make
# make install
其中各个参数介绍如下:
shared
生成动态库,默认会生成静态库;no-shared
只生成静态库,也就是生成libssl.a
以及libcrypto.a
两个库文件;-fPIC
生成位置无关代码,用来防止在静态库连接到动态库的时候报错;--openssldir=OPENSSLDIR
安装目录,默认是/usr/local/ssl
;--prefix=PREFIX
设置lib
include
bin
目录的前缀,默认为OPENSSLDIR
目录。
生成秘钥
通过 openssl 可以生成一个秘钥(私钥),可以通过这个秘钥将公钥提取出来,严格来说,为了安全需要对秘钥进行对称加密,这样类似 Nginx 之类的插件需要交互输入密码。
----- 生成、查看未加密的秘钥文件
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem
------ 查看私钥具体参数以及秘钥文件内容,通过-noout关闭私钥打印
openssl rsa -in private.pem -text
openssl rsa -in private.pem -text -noout
------ 对秘钥加密或者直接生成
openssl rsa -in private.pem -des3 -passout 'pass:YourPassHere' -out private_des.pem
openssl genrsa -out private_des.pem -des3 -passout 'pass:YourPassHere' 1024
openssl rsa -in private_des.pem -text -noout -passin 'pass:YourPassHere'
------ 检查秘钥文件是否合法
openssl rsa -in private.pem -check
查看公钥
利用上述生成的秘钥可以生成公钥。
----- 通过私钥生成公钥,然后查看,等价于直接查看文件内容
openssl rsa -in private.pem -pubout -out public.pem
openssl rsa -pubin -in public.pem
----- 查看公钥信息,但是不查看文件内容
openssl rsa -pubin -in public.pem -text -noout
查看证书
----- 请求信息
openssl req -noout -text -in cert.csr
----- 私钥信息
openssl rsa -text -noout -passin 'pass:YourPassHere' -in key.pem
----- 证书信息
openssl x509 -noout -text -in cert.pem
生成证书
这里采用自签发的证书,需要生成根证书,并分别向服务端和客户端颁发对应的证书,这样可以作双向认证。
mkdir pki/{CA,SVR,CLI} -p
自签名证书
自签 CA 证书,有如下的三种方式,简单介绍。
服务端私钥和证书。
----- 生成服务端私钥
openssl genrsa -out key.pem 2048
----- 生成证书请求文件
openssl req -new -key key.pem -out server.csr \
-subj "/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization/OU=MyGroup/CN=MyServer"
----- 使用根证书签发服务端证书
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ../CA/cacert.pem \
-CAkey ../CA/cakey.pem -CAserial ca.csr -CAcreateserial \
-in server.csr -out cert.pem
----- 使用CA证书验证server端证书
openssl verify -CAfile ../CA/cacert.pem cert.pem
客户端私钥和证书。
----- 生成客户端私钥
openssl genrsa -out key.pem 2048
----- 生成证书请求文件
openssl req -new -key key.pem -out client.csr \
-subj "/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization/OU=MyGroup/CN=MyClient"
----- 使用根证书签发客户端证书
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ../CA/cacert.pem \
-CAkey ../CA/cakey.pem -CAserial ../SVR/ca.csr -in client.csr -out cert.pem
----- 使用CA证书验证客户端证书
openssl verify -CAfile ../CA/cacert.pem cert.pem
也可以对私钥进行加密。
----- 通过AES256解密保护私钥
openssl genrsa -aes256 -out keysec.pem -passout pass:123456 2048
openssl req -new -key keysec.pem -out clientsec.csr \
-subj "/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization/OU=MyGroup/CN=MyClient" \
-passin pass:123456
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ../CA/cacert.pem \
-CAkey ../CA/cakey.pem -CAserial ../SVR/ca.csr -in clientsec.csr \
-out certsec.pem -passin pass:123456
----- 去除私钥中的密码保护
openssl rsa -in pki/CLI/keysec.pem -out pki/CLI/keyplain.pem -passin pass:123456
其它。
----- 查看证书的内容
openssl x509 -in SVR/cert.pem -text -noout
可以通过 gencert.sh 脚本生成相关证书文件。
服务端 客户端
OpenSSL 提供了 Server 和 Client 的相关工具,可以用来模拟客户端以及服务端进行测试。
openssl s_server -accept 44330 -CAfile pki/CA/cacert.pem \
-key pki/SVR/key.pem -cert pki/SVR/cert.pem -state
openssl s_client -connect 127.0.0.1:44330 -CAfile pki/CA/cacert.pem \
-key pki/CLI/key.pem -cert pki/CLI/cert.pem -state
如下是常用的参数。
-connect 指定服务器的地址以及端口,默认是localhost:443
-key 私钥文件的路径
-cert 证书文件的路径
-CAfile 根证书文件的路径
-showcerts 显示服务器的证书信息
-state 在SSL交互过程中的各种信息
-verify 根证书校验的深度
-debug 打印调试信息
-accept 监听的端口号
-ciphersuites 指定TLSv1.3版本的安全套件,通过:分割
-cipher 指定TLSv1.2版本以下的安全套件
-tls1_3 明确使用TLSv1.3版本,或者tls1_2 tls1_1 tls1
-num_tickets <N> 在TLSv1.3的Server中Post-Handshake阶段发送几个tickets
-reconnect <N> 尝试重新连接,可以用来测试会话复用
-keylogfile <FILE> 将链接的MasterSecret信息保存到文件中