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.

12 KiB

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实现了证书签发的整个流程和证书管理的大部分机制

实例

: << 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文件

# 一步生成crt和key
openssl req -x509 -out localhost.crt -keyout localhost.key \
  -newkey rsa:2048 -nodes -sha256 -days 3650\
  -subj '/CN=*.19950128.com' -extensions EXT -config <( \
printf "[dn]\nCN=*.19950128.com\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:*.19950128.com\\
nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
# 消息摘要算法应用例子
openssl dgst -sha1 file.txt # 用SHA1算法计算文件file.txt的哈西值输出到stdout

用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

2、对称加密应用例子

对称加密应用例子用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

3、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

4、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

5、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

制作并信任您自己的证书: 任何人都可以在没有CA帮助的情况下制作自己的证书。 唯一的区别是您自己制作的证书不会被其他任何人信任;然后,您可以使用 localhost.crt和localhost.key配置本地网站服务器并在本地受信任的根列表中安装localhost.crt

如果您希望在开发证书中更加逼真,可以使用(minica)[https://github.com/jsha/minica]生成自己的本地根证书,并颁发由其签名的终 端(又称叶)证书。 然后,您将导入根证书而不是自签名的终端证书;您还可以选择使用带有点的域例如www.localhost将其作为别 名添加到/etc/hosts作为127.0.0.1的别名。这巧妙地改变了浏览器处理cookie存储的方式

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")