强大的安全套接字层密码库。

补充说明

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。在 OpenSSL 被曝出现严重安全漏洞后,发现多数通过 SSL 协议加密的网站使用名为 OpenSSL 的开源软件包。由于这是互联网应用最广泛的安全传输方法,被网银、在线支付、电商网站、门户网站、电子邮件等重要网站广泛使用,所以该漏洞影响范围广大。

OpenSSL 有两种运行模式:交互模式和批处理模式。

直接输入 openssl 回车进入交互模式,输入带命令选项的 openssl 进入批处理模式。

OpenSSL 整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL 协议库以及应用程序。

OpenSSL 的目录结构自然也是围绕这三个功能部分进行规划的。

对称加密算法

OpenSSL 一共提供了 8 种对称加密算法,其中 7 种是分组加密算法,仅有的一种流加密算法是 RC4。这 7 种分组加密算法分别是 AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES 使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是 128 位,其它算法使用的则是 64 位。事实上,DES 算法里面不仅仅是常用的 DES 算法,还支持三个密钥和两个密钥 3DES 算法。

非对称加密算法

OpenSSL 一共实现了 4 种非对称加密算法,包括 DH 算法、RSA 算法、DSA 算法和椭圆曲线算法(EC)。DH 算法一般用户密钥交换。RSA 算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA 算法则一般只用于数字签名。

信息摘要算法

OpenSSL 实现了 5 种信息摘要算法,分别是 MD2、MD5、MDC2、SHA(SHA1)和 RIPEMD。SHA 算法事实上包括了 SHA 和 SHA1 两种信息摘要算法,此外,OpenSSL 还实现了 DSS 标准中规定的两种信息摘要算法 DSS 和 DSS1。

密钥和证书管理

密钥和证书管理是 PKI 的一个重要组成部分,OpenSSL 为之提供了丰富的功能,支持多种标准。
首先,OpenSSL 实现了 ASN.1 的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及 CRL 等数据对象的 DER、PEM 和 BASE64 的编解码功能。OpenSSL 提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的 DER 编解码功能。并实现了私钥的 PKCS#12 和 PKCS#8 的编解码功能。OpenSSL 在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。

在此基础上,OpenSSL 实现了对证书的 X.509 标准编解码、PKCS#12 格式的编解码以及 PKCS#7 的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。

事实上,OpenSSL 提供的 CA 应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。

实例

1、使用 openssl 生成密码
几乎所有 Linux 发行版都包含 openssl。我们可以利用它的随机功能来生成可以用作密码的随机字母字符串。

openssl rand -base64 10# nU9LlHO5nsuUvw==

nU9LlHO5nsuUvw==
2、消息摘要算法应用例子
用 SHA1 算法计算文件 file.txt 的哈西值,输出到 stdout:

# openssl dgst -sha1 file.txt

用 SHA1 算法计算文件 file.txt 的哈西值,输出到文件 digest.txt:

# openssl sha1 -out digest.txt file.txt

用 DSS1(SHA1) 算法为文件 file.txt 签名,输出到文件 dsasign.bin。签名的 private key 必须为 DSA 算法产生的,保存在文件 dsakey.pem 中。

# openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt

用 dss1 算法验证 file.txt 的数字签名 dsasign.bin,验证的 private key 为 DSA 算法产生的文件 dsakey.pem。

# openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

用 sha1 算法为文件 file.txt 签名,输出到文件 rsasign.bin,签名的 private key 为 RSA 算法产生的文件 rsaprivate.pem。

# openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

用 sha1 算法验证 file.txt 的数字签名 rsasign.bin,验证的 public key 为 RSA 算法生成的 rsapublic.pem。

# openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

3、对称加密应用例子
对称加密应用例子,用 DES3 算法的 CBC 模式加密文件 plaintext.doc,加密结果输出到文件 ciphertext.bin。

# openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin

用 DES3 算法的 OFB 模式解密文件 ciphertext.bin,提供的口令为 trousers,输出到文件 plaintext.doc。注意:因为模式不同,该命令不能对以上的文件进行解密。

# openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers

用 Blowfish 的 CFB 模式加密 plaintext.doc,口令从环境变量 PASSWORD 中取,输出到文件 ciphertext.bin。

# openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD

给文件 ciphertext.bin 用 base64 编码,输出到文件 base64.txt。

# openssl base64 -in ciphertext.bin -out base64.txt

用 RC5 算法的 CBC 模式加密文件 plaintext.doc,输出到文件 ciphertext.bin,salt、key 和初始化向量 (iv) 在命令行指定。

# openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29

4、Diffie-Hellman 应用例子
使用生成因子 2 和随机的 1024-bit 的素数产生 D0ffie-Hellman 参数,输出保存到文件 dhparam.pem

# openssl dhparam -out dhparam.pem -2 1024

从 dhparam.pem 中读取 Diffie-Hell 参数,以 C 代码的形式,输出到 stdout。

# openssl dhparam -in dhparam.pem -noout -C

5、DSA 应用例子应用例子
生成 1024 位 DSA 参数集,并输出到文件 dsaparam.pem。

# openssl dsaparam -out dsaparam.pem 1024

使用参数文件 dsaparam.pem 生成 DSA 私钥匙,采用 3DES 加密后输出到文件 dsaprivatekey.pem

# openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem

使用私钥匙 dsaprivatekey.pem 生成公钥匙,输出到 dsapublickey.pem

# openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem

从 dsaprivatekey.pem 中读取私钥匙,解密并输入新口令进行加密,然后写回文件 dsaprivatekey.pem

# openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin

6、RSA 应用例子
产生 1024 位 RSA 私匙,用 3DES 加密它,口令为 trousers,输出到文件 rsaprivatekey.pem

# openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

从文件 rsaprivatekey.pem 读取私匙,用口令 trousers 解密,生成的公钥匙输出到文件 rsapublickey.pem

# openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem

用公钥匙 rsapublickey.pem 加密文件 plain.txt,输出到文件 cipher.txt

# openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt

使用私钥匙 rsaprivatekey.pem 解密密文 cipher.txt,输出到文件 plain.txt

# openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt

用私钥匙 rsaprivatekey.pem 给文件 plain.txt 签名,输出到文件 signature.bin

# openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin

用公钥匙 rsapublickey.pem 验证签名 signature.bin,输出到文件 plain.txt

# openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain

从 X.509 证书文件 cert.pem 中获取公钥匙,用 3DES 加密 mail.txt,输出到文件 mail.enc

# openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

从 X.509 证书文件 cert.pem 中获取接收人的公钥匙,用私钥匙 key.pem 解密 S/MIME 消息 mail.enc,结果输出到文件 mail.txt

# openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt

cert.pem 为 X.509 证书文件,用私匙 key,pem 为 mail.txt 签名,证书被包含在 S/MIME 消息中,输出到文件 mail.sgn

# openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn

验证 S/MIME 消息 mail.sgn,输出到文件 mail.txt,签名者的证书应该作为 S/MIME 消息的一部分包含在 mail.sgn 中

# openssl smime -verify -in mail.sgn -out mail.txt

更多实例:

openssl version -a
openssl help
openssl genrsa -aes128 -out fd.key 2048 # pem format
openssl rsa -text -in fd.key