1.1 ssl命令系列前言
openssl命令的格式是”openssl command command-options args”,command部分有很多种命令,这些命令需要依赖于openssl命令才能执行,所以称为伪命令(pseudo-command),每个伪命令都有各自的功能,大部分command都可以直接man command查看命令的用法和功能。
1.2 openssl总指挥
以下是openssl支持的伪命令,常用命令或可能用的上的命令加粗加红显示了,这些命令的用户在后面的文章中会一一介绍。
[root@xuexi ~]# openssl --help
openssl:Error: '--help' is an invalid command.
# 支持的标准命令,即伪命令
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam dsa dsaparam ec
ecparam enc engine errstr
gendh gendsa genpkey genrsa
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand req
rsa rsautl s_client s_server
s_time sess_id smime speed
spkac ts verify version
x509
# 指定"dgst"命令时即单向加密支持的算法,实际上支持更多的算法,具体见dgst命令
Message Digest commands (see the `dgst' command for more details)
md2 md4 md5 rmd160
sha sha1
# 指定对称加密"enc"时支持的对称加密算法
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx idea
idea-cbc idea-cfb idea-ecb idea-ofb
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 seed seed-cbc seed-cfb
seed-ecb seed-ofb zlib
看上去非常复杂?其实不复杂,只是伪命令多点而已,而且很多伪命令经常用到的选项也就1到两个。
以下是各伪命令的选项”-passin”和”-passout”可能使用到的密码传递格式,“-passin”指的是传递解密时的密码,”-passout”指的是传递加密输出文件时的密码。如果不给定密码格式,将提示从终端输入。这一点在后面的文章中将不再细述。
例如,要加密某个密钥文件,使得每次使用该密钥文件都需要输入密码,则使用”-passout”指定加密密码,当使用被加密的密钥文件时需要解密,使用”-passin”传递解密密码。
格式一:pass:password :password表示传递的明文密码
格式二:env:var :从环境变量var获取密码值
格式三:file:filename :filename文件中的第一行为要传递的密码。若filename同时传递给"-passin"和"-passout"选项,则filename的第一行为"-passin"的值,第二行为"-passout"的值
格式四:stdin :从标准输入中获取要传递的密码
常用Openssl命令
申请证书
SSL常用于身份验证、数据加密等应用中,要使用SSL,我们密码有自己的证书。数字证书一般要向专业的认证公司(如VeriSign)申请,并且都是收费的,某些情况下,我们只是想使用加密的数据通信,而不在乎认证,这时就可以自己制作一个证书,自己制作一个证书,有两种方式,一种是Self Signed,另一种是自己制作一个CA,然后由这个CA,来发布我们需要的证书。下面分别介绍这两个方法。
生成Self Signed证书
# 生成一个key,你的私钥,openssl会提示你输入一个密码,可以输入,也可以不输,
# 输入的话,以后每次使用这个key的时候都要输入密码,安全起见,还是应该有一个密码保护
> openssl genrsa -des3 -out selfsign.key 4096
# 使用上面生成的key,生成一个certificate signing request (CSR)
# 如果你的key有密码保护,openssl首先会询问你的密码,然后询问你一系列问题,
# 其中Common Name(CN)是最重要的,它代表你的证书要代表的目标,如果你为网站申请的证书,就要添你的域名。
> openssl req -new -key selfsign.key -out selfsign.csr
# 生成Self Signed证书 selfsign.crt就是我们生成的证书了
> openssl x509 -req -days 365 -in selfsign.csr -signkey selfsign.key -out selfsign.crt
# 另外一个比较简单的方法就是用下面的命令,一次生成key和证书
> openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
生成自己的CA (Certificate Authority)
CA是证书的发布者,CA可以发布其他人的证书,把CA的证书加入系统信任的根证书后,由CA发布的证书也被系统所信任,所以,CA的key是必须小心保护的,一般都要加密保护,并且限制为root权限读写。
复制代码
# 生成CA的key
> openssl genrsa -des3 -out ca.key 4096
# 生成CA的证书
> openssl req -new -x509 -days 365 -key ca.key -out ca.crt
# 生成我们的key和CSR这两步与上面Self Signed中是一样的
> openssl genrsa -des3 -out myserver.key 4096
> openssl req -new -key myserver.key -out myserver.csr
# 使用ca的证书和key,生成我们的证书
# 这里的set_serial指明了证书的序号,如果证书过期了(365天后),
# 或者证书key泄漏了,需要重新发证的时候,就要加1
> openssl x509 -req -days 365 -in myserver.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out myserver.crt
查看证书
# 查看KEY信息
> openssl rsa -noout -text -in myserver.key
# 查看CSR信息
> openssl req -noout -text -in myserver.csr
# 查看证书信息
> openssl x509 -noout -text -in ca.crt
# 验证证书
# 会提示self signed
> openssl verify selfsign.crt
# 因为myserver.crt 是幅ca.crt发布的,所以会验证成功
> openssl verify -CAfile ca.crt myserver.crt
去掉key的密码保护
有时候每次都要输入密码太繁琐了,可以把Key的保护密码去掉
> openssl rsa -in myserver.key -out server.key.insecure
不同格式证书的转换
一般证书有三种格式:
PEM(.pem) 前面命令生成的都是这种格式,
DER(.cer .der) Windows 上常见
PKCS#12文件(.pfx .p12) Mac上常见
# PEM转换为DER
> openssl x509 -outform der -in myserver.crt -out myserver.der
# DER转换为PEM
> openssl x509 -inform der -in myserver.cer -out myserver.pem
# PEM转换为PKCS
> openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt -certfile ca.crt
# PKCS转换为PEM
> openssl pkcs12 -in myserver.pfx -out myserver2.pem -nodes
测试证书
Openssl提供了简单的client和server工具,可以用来模拟SSL连接,做测试使用。
# 连接到远程服务器
> openssl s_client -connect www.google.com.hk:443
# 模拟的HTTPS服务,可以返回Openssl相关信息
# -accept 用来指定监听的端口号
# -cert -key 用来指定提供服务的key和证书
> openssl s_server -accept 443 -cert myserver.crt -key myserver.key -www
# 可以将key和证书写到同一个文件中
> cat myserver.crt myserver.key > myserver.pem
# 使用的时候只提供一个参数就可以了
> openssl s_server -accept 443 -cert myserver.pem -www
# 可以将服务器的证书保存下来
> openssl s_client -connect www.google.com.hk:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > remoteserver.pem
# 转换成DER文件,就可以在Windows下直接查看了
> openssl x509 -outform der -in remoteserver.pem -out remoteserver.cer
计算MD5和SHA1
# MD5 digest
> openssl dgst -md5 filename
# SHA1 digest
> openssl dgst -sha1 filename