openssl是linux默认安装的实现了SSL/TLS协议和几乎所有加密算法的工具包,功能十分强大而且是开源的。openssl包括libcrypto、libssl,libcrypt实现加密算法,libssl是基于会话的TLS/SSL的库。本文主要是openssl的基本使用手册(CenterOS 7)
一、查看openssl安装的版本
# openssl version -a
二、有时候为了测试不同的openssl的版本,需要安装指定版本的openssl
# wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz
# tar -zxvf openssl-1.1.0h.tar.gz
# cd openssl-1.1.0h
# ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl enable-ec_nistp_64_gcc_128
# make
# make install
# mv /usr/bin/openssl /usr/bin/bak.openssl
# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
如果升级了openssl,需要将新版的openssl的库文件加入到系统的动态链接共享库中。
可以通过ldd命令查看命令所调用的库文件
# ldd $(which openssl) 或 ldd /usr/bin/openssl
# echo "/usr/local/openssl/lib/" >> /etc/ld.so.conf
# ldconfig
# ldconfig -p | grep libssl
# ldconfig -p | grep libcrypt
自己编译安装的openssl是不带根证书的,即ca-certificate,可以下载第三方的最新的PEM格式的可信证书库。
# wget --no-check-certificate https://curl.haxx.se/ca/cacert.pem
下载之后使用 -CAfile 存放路径/cacert.pem
如果想通过默认方式使用之前预安装在linux系统内的根证书的话,要把根证书copy到新版本的openssl的安装目录里。
cp /etc/pki/tls/certs/* /usr/local/openssl/certs
ln -s /usr/local/openssl/certs/ca-bundle.crt /usr/local/openssl/cert.pem
三、摘要算法
# openssl dgst -help
# echo "1234567890" >> dgst_test
# openssl dgst -md5 dgst_test
# openssl dgst -sha1 dgst_test
# openssl dgst -sha256 dgst_test
# openssl dgst -sha512 dgst_test
# openssl dgst -sha512 -hex -out dgst_test_sha512 dgst_test
# cat dgst_test_sha512
# man openssl
# md5sum dgst_test
# sha1sum dgst_test
# sha256sum dgst_test
# sha512sum dgst_test
四、对称加密
# openssl enc -help
# echo "hello world" >> test_enc
# openssl enc -e -aes128 -a -k 123456789 -in test_enc -out test_enc_aes128_1
# openssl enc -e -aes128 -a -k 123456789 -in test_enc -out test_enc_aes128_2
# openssl enc -e -aes128 -a -k 123456789 -in test_enc -out test_enc_aes128_3
# openssl enc -e -aes128 -a -k 123456789 -in test_enc -out test_enc_aes128_4
# openssl enc -d -aes128 -a -pass pass:123456789 -in test_enc_aes128_1
# echo "123456789" >> passwd_enc_aes128
# openssl enc -d -aes128 -a -pass file:passwd_enc_aes128 test_enc_aes128_2 -in test_enc_aes128_2
# openssl enc -d -aes128 -a -pass stdin test_enc_aes128_3 -in test_enc_aes128_3
# 123456789
# pw = 123456789
# export pw
# openssl enc -d -aes128 -a -pass env:pw -in test_enc_aes128_4
# openssl enc -e -aes128 -a -pass pass:123456789 -in test_enc -p
# openssl enc -e -aes128 -a -pass pass:123456789 -in test_enc -P
以上指令-aes128可以换成其它对称算法
五、RSA非对称加密
1、生成私钥
# openssl genrsa -out test_un_enc_prikey 1024
# openssl genrsa -aes256 -passout pass:1234567890 -out test_enc_prikey 2048
读取私钥对应的公钥信息
# openssl rsa -in test_un_enc_prikey -pubout -text
私钥机密与不加密之间相互转换
# openssl rsa -in test_enc_prikey -passin pass:1234567890 -out test_un_enc_prikey
# openssl rsa -in test_un_enc_prikey -aes256 -passout pass:1234567890 -out test_enc_prikey
2、私钥格式转换
使用genrsa的私钥默认的格式是pkcs1-PEM的。
pem格式与der格式转换
# openssl rsa -in test_rsa_prikey -outform der -out prikey.der
# openssl rsa -in prikey.der -inform der -text
# openssl rsa -in prikey.der -inform der -outform pem -out prikey.pem
pkcs8与pkcs1(默认)格式转换
# openssl pkcs8 -help
# openssl pkcs8 -topk8 -in prikey.pem -inform pem -outform pem -nocrypt -out pkcs8_prikey.pem
# openssl pkcs8 -in pkcs8_prikey.pem -nocrypt -out prikey.pem
der格式与pkcs格式转换
openssl pkcs8 -topk8 -in prikey.der -inform der -outform pem -out dertoprikey.pem
3、生成公钥
公钥根据私钥生成
# openssl rsa -pubout -in prikey.pem -out pubkey.pem
# openssl rsa -in prikey.pem -RSAPublicKey_out -out pubkey2.pem
4、公私钥解密
# echo "abcdefghijklmnopqrstuvwxyz1234567890" >> file1
# openssl rsautl -encrypt -inkey pubkey.pem -pubin -in file1 -out enc.file1
# openssl rsautl -decrypt -inkey prikey.pem -in enc.file1 -out file11
六、DSA 非对称加密 DSA只能用于签名,不能用于加密
1、直接生成密钥
# openssl dsaparam -genkey -out dsa_1024_prikey.pem 1024
# openssl dsaparam -genkey -out dsa_2048_prikey.pem 2048
# openssl dsaparam -genkey
对未加密的私钥加密
openssl dsa -in dsa_2048_prikey.pem -out dsa_enc_2048_prikey.pem -des3 -passout pass:123456
2、利用参数生成加密密钥
# openssl dsaparam -out dsa_2048_param.pem 2048
# openssl dsaparam -in dsa_2048_param.pem -text -noout
# openssl gendsa -out dsa_des3_2048_prikey.pem -des3 -passout pass:123456 dsa_2048_param.pem
3、使用dsa提取公钥
# openssl dsa -pubout -in dsa_2048_prikey.pem -out dsa_2048_pubkey.pem
# openssl dsa -in dsa_2048_pubkey.pem -pubin -text
七、ECDSA非对称加密
生成 ecdsa 私钥,ecdsa通过选择一个椭圆曲线(-name)来设置密钥位数,如secp256k1(prime256v1) 就是生成 256位的ECDSA密钥。
# openssl ecparam -list_curves
# openssl ecparam -genkey -name secp256k1 -out ecprikey.pem
# openssl ec -in ecprikey.pem -text
# openssl ecparam -genkey -name prime256v1 -out ecprikey_enc.pem -param_enc explicit
提取ecdsa公钥
# openssl ec -in ecprikey.pem -pubout -out ecpubkey.pem
# openssl ec -in ecpubkey.pem -pubin -text
八、数字签名
数字签名用于身份认证,使用非对称算法。一般都是先摘要再进行签名,如果直接使用私钥加密文件,黑客根据不同的文件加密结果寻找规律,增加私钥被破解的风险。而文件被摘要之后就没有了规律,可规避这类风险。SHA1 和 MD5 都已经不安全了,建议使用 SHA256 或更高位数的算法,考虑到效率问题,建议使用SHA256 算法。
# echo "username:passwd" >> sign_test
1、RSA签名
# openssl dgst -sign prikey.pem -sha256 -out sha256_rsa_sign.test sign_test
# openssl dgst -verify pubkey.pem -sha256 -signature sha256_rsa_sign.test sign_test
2、DSA签名
# openssl dgst -sign dsa_2048_prikey.pem -sha256 -out sha256_dsa_sing.test sign_test
# openssl dgst -verify dsa_2048_pubkey.pem -sha256 -signature sha256_dsa_sing.test sign_test
3、ECDSA签名
# openssl dgst -sign ecprikey.pem -sha256 -out sha256_ecdsa_sign.test sign_test
# openssl dgst -verify ecpubkey.pem -sha256 -signature sha256_ecdsa_sign.test sign_test
九、s_client测试
# openssl s_client -help
1、测试链接信息
# openssl s_client -connect www.taobao.com:443 -msg
# openssl s_client -connect www.baidu.com:443 -msgfile filename
2、测试服务器端所支持的协议
# openssl s_client -connect www.taobao.com:443 -tls1
# openssl s_client -connect www.taobao.com:443 -tls1_1
# openssl s_client -connect www.taobao.com:443 -tls1_2
3、测试服务器端所支持的密码套件
# openssl s_client -connect www.taobao.com -cipher ECDHE-RSA-AES128-GCM-SHA256
4、测试服务器端是否包含SNI
TLS的SNI扩展是为了在同一个IP(IP + port)上支持多张证书。TLS客户端使用这个扩展发送希望访问的主机名,而服务器使用该扩展来选择用以响应的正确证书。SNI支持了虚拟安全托管。
# openssl s_client -connect www.taobao.com:443 -servername www.taobao.com
5、测试服务器端是否支持会话复用
# openssl s_client -connect www.taobao.com:443 -reconnect
# openssl s_client -connect www.taobao.com:443 -reconnect 2>/dev/null |grep -i 'new\|reused'
6、显示服务器端安装的证书链
# openssl s_client -connect www.taobao.com:443 -showcerts
7、测试OCSP stapling
# openssl s_client -connect www.taobao.com:443 -status
8、测试服务器端是否存在心脏出血漏洞
# openssl s_client -connection www.taobao.com:443 -tlsextdebug