You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# **openssl**
## 说明
**OpenSSL** 是一个强大的安全套接字层密码库囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议并提供丰富的应用
程序供测试或其它目的使用
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、SHASHA1和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实现了证书签发的整个流程和证书管理的大部分机制
## 实例
```bash
: << comment
key格式私有的密钥
csr格式证书签名请求证书请求文件含有公钥信息certificate signing request的缩写
crt格式证书文件certificate的缩写
pem格式用于导出导入证书时候的证书的格式有证书开头结尾的格式
crl格式证书吊销列表Certificate Revocation List的缩写
comment
# 制作并信任您自己的证书任何人都可以在没有CA帮助的情况下制作自己的证书。 唯一的区别是您自己制作的证书不会被其他任何人信任
# CA根证书的生成步骤:生成CA私钥.key-->生成CA证书请求.csr-->自签名得到根证书(.crtCA给自已颁发的证书
openssl genrsa -out ca.key 4096 # 生成ca私钥
openssl req -new -x509 -key ca.key -days 365 -out ca.crt # 生成ca根证书
# 用户证书的生成步骤:生成私钥(.key)-->生成证书请求(.csr)-->用ca根证书签名得到(.crt)
## 服务器端用户证书:
openssl genrsa -des3 -out server.key 4096 # 生成ca私钥
openssl req -new -key server.key -out server.csr # 生成csr,此处组织名称可以填写泛域名如:*.19950128.com
openssl x509 -req -days 365 -sha256 ca -keyfile ca.key -cert ca.crt -in server.csr -out server.crt
## 客户端用户证书(和服务端类似,目的是为了实现双向认证)
openssl genrsa -des3 -out client.key 4096
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -sha256 -keyfile ca.key ca -cert ca.crt -in client.csr -out client.crt
## 生成pem格式证书
cat client.crt client.key > client.pem
cat server.crt server.key > server.pem
: << comment
SSL证书的公共名称 (CN)。 该公共名称 (CN) 是使用该证书的系统的标准名称。 如果您使用的是动态 DNS那么 CN 应该具有通配符
例如: *.api.com. 否则,使用网关集群中设置的主机名或 IP 地址
生成自己专用密钥和公用证书。回答问题并在出现提示时输入公共名称
comment
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
# 检查已创建的证书
openssl x509 -text -noout -in certificate.pem
openssl dhparam -out dhparams.pem -dsaparam 2048 # 生成dhparams.pem文件
: << comment
制作并信任您自己的证书:
任何人都可以在没有CA帮助的情况下制作自己的证书。 唯一的区别是您自己制作的证书不会被其他任何人信任;然后,您可以使用
localhost.crt和localhost.key配置本地网站服务器并在本地受信任的根列表中安装localhost.crt
如果您希望在开发证书中更加逼真,可以使用(minica)[https://github.com/jsha/minica]生成自己的本地根证书,并颁发由其签名的终
端(又称叶)证书。 然后,您将导入根证书而不是自签名的终端证书;您还可以选择使用带有点的域例如www.localhost将其作为别
名添加到/etc/hosts作为127.0.0.1的别名。这巧妙地改变了浏览器处理cookie存储的方式
comment
# 一步生成crt和key
openssl req -x509 -out localhost.crt -keyout localhost.key \
-newkey rsa:2048 -nodes -sha256 \
-subj '/CN=localhost' -extensions EXT -config <( \
printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\
nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
```
### 消息摘要算法应用例子
```bash
openssl dgst -sha1 file.txt # 用SHA1算法计算文件file.txt的哈西值输出到stdout
openssl sha1 -out digest.txt file.txt # 用SHA1算法计算文件file.txt的哈西值输出到文件digest.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
```
### 对称加密应用例子
```bash
#对称加密应用例子用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.binsalt、key和初始化向量(iv)在命令行指定
openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29
```
### Diffie-Hellman应用例子
```bash
# 使用生成因子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
```
### DSA应用例子应用例子
```bash
# 生成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
```
### RSA应用例子
```bash
# 产生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
```