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