[TOC]

0x00 快速入门

OpenSSL是一个强大的安全套接字层密码库(Secrue socket layer),囊括主要的密码算法、常用的密钥证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

在OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用名为OpenSSL的开源软件包。由于这是互联网应用最广泛的安全传输方法,被网银、在线支付、电商网站、门户网站、电子邮件等重要网站广泛使用,所以该漏洞影响范围广大

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

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

OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序,OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的;


0x01 语法参数

基础语法:

openssl [Standard]

基础参数:

#Standard commands (标准命令)
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam(dh加密方式) dsa dsaparam(dsa加密方式) ec
ecparam enc(加密) engine errstr
gendh gendsa genpkey genrsa(生成rsa密匙)
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand(随机) req
rsa(密钥生成公钥) rsautl(公私钥加解密)s_client s_server
s_time sess_id smime speed
spkac ts verify version
x509(公钥证书的格式标准)

#Message Digest commands (消息摘要命令)
md2 md4 md5 rmd160
sha sha1

#Cipher commands (Cipher commands)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx idea
idea-cbc idea-cfb idea-ecb idea-ofb
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 rc5 rc5-cbc rc5-cfb
rc5-ecb rc5-ofb seed seed-cbc
seed-cfb seed-ecb seed-ofb zlib

基础使用
#实例:文件生成base64字符串
openssl base64 -in test.txt #等同于 base64 test.txt
N2ZmYjJhZmQ2ODZjZDk5NDdlOTY1ODMyZTY4MGQwYzI0NTY0ZGM4NDlhZmRjZGVhMDQzZmRkZDY1ZDIxN2ZlNwo=

rand

#实例1.随机数的生成
openssl rand -base64 位数 -out 写出的文件
openssl rand -base64 128
od3xDJVOVKGYfSXHELXI3oVw0hyElUE34tZWsYHrU6yk7Gyr6Z7B8QlZ2zbZBcTCR3DJMr81j1l3SaFYxbO1xhs4ki4iZXPwwpO1gyG4sAnfGC1bDEBYzKw+u/jlSCSBlCoukUa41nvEQ2hE2BGxbQoWeuwO0L3hQk5wwxMHPiE=


0x02 简要说明

1.对称加密算法
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4(已经证明不安全)。
这7种分组加密算法分别是 AES、DES、Blowfish、CAST、IDEA、RC2、RC5,

四种常用的分组密码加密模式(上面七种):

  • 电子密码本模式(ECB)
  • 加密分组链接模式(CBC)
  • 加密反馈模式(CFB)
  • 输出反馈模式(OFB)

注意:

  • AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。
  • DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。

对称加密应用例子:

#用DES3算法的CBC模式加密文件plaintext.txt,加密结果输出到文件ciphertext.bin
openssl enc -des3 -salt -in plaintext.txt -out ciphertext.bin
#用DES3算法的CBC模式解密文件ciphertext.bin,提供的口令为trousers,输出到文件plaintext.doc
openssl enc -des-ede3-cbc -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers


#用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 pass:123456

#用RC5算法的CBC模式加密文件plaintext.doc,输出到文件ciphertext.bin,salt、key和初始化向量(iv)在命令行指定
#貌似已经更名或者不用RC5 给文件ciphertext.bin用base64编码,输出到文件base64.txt。
openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29

#给文件ciphertext.bin用base64编码(类似于base64 filenames),输出到文件base64.txt。
openssl base64 -in ciphertext.bin -out base64.txt

WeiyiGeek.

注意事项:

  • 因为模式不同,该命令不能对以上的文件进行解密。


2.非对称加密算法
描述:OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)

  • DH算法一般用户密钥交换
  • RSA算法既可以用于密钥交换(如SSH密匙登录),也可以用于数字签名,当然如果你能够忍受其缓慢的速度,那么也可以用于数据加密
  • DSA算法则一般只用于数字签名

非对称加密应用例子应用例子

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

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

WeiyiGeek.


#DSA应用例子:
1.生成1024位DSA参数集,并输出到文件dsaparam.pem
openssl dsaparam -out dsaparam.pem 1024

2.使用参数文件dsaparam.pem生成DSA私钥匙,采用3DES加密后输出到文件dsaprivatekey.pem (需要输入密码 test
openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem

3.使用私钥匙dsaprivatekey.pem生成公钥匙,输出到dsapublickey.pem (必修输入上面的密码)
openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem

4.从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,然后写回文件dsaprivatekey.pem(输入原有的密码和现在最新的密码)
openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3

WeiyiGeek.12
WeiyiGeek.34


#RSA应用例子:
1.产生1024位RSA私匙,用3DES加密它,口令为trousers,输出到文件rsaprivatekey.pem
openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

2.从文件rsaprivatekey.pem读取私匙,用口令trousers解密,生成的公钥匙输出到文件rsapublickey.pem
openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapublickey.pem

#3.使用公钥匙rsapublickey.pem加密文件plain.txt,输出到文件cipher.txt
openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt
#3.用公钥匙rsapublickey.pem验证签名signature.bin,输出到文件plain.tct (decript)
openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain.tct

#4.使用私钥匙rsaprivatekey.pem给文件plain.txt签名,输出到文件signature.bin (encrpty)
openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain.tct
#4.使用私钥匙rsaprivatekey.pem解密密文cipher.txt,输出到文件plain.txt
openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt

WeiyiGeek.rsa密钥和公钥

WeiyiGeek.公钥私钥加解密


#X.509应用例子;
1.从证书文件cert.pem中获取公钥匙,用3DES加密mail.txt,输出到文件mail.enc
openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

2.从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

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

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


3.信息摘要算法
OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD;SHA算法事实上包括了SHA和SHA1两种信息摘要算法此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1;
信息摘要算法:主要验证文件是否被更改,如果被更改则生成于验证的摘要算法不同;

#消息摘要算法应用例子:
1.用SHA1/MD5算法计算文件file.txt的哈西值,输出到stdout;
openssl dgst -sha1 file.txt
openssl dgst -md5 file.txt

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



1.用DSS1(SHA1)算法为文件file.txt签名(signature),输出到文件dsasign.bin;
#签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中
openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt

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

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

4.用sha1算法验证(verify)file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。
openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt


0x03 密钥和证书管理

首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能
OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能;

密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准;OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发:
在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能,并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能
事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制.

这里不得不提到SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socketlayer(SSL),SSL安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。由于SSL技术已建立到所有主要的浏览器和WEB服务器程序中,因此仅需安装服务器证书就可以激活该功能了)。即通过它可以激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露。保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。

SSL网站不同于一般的Web站点,它使用的是“HTTPS”协议,而不是普通的“HTTP”协议。因此它的URL(统一资源定位器)格式为“https://www.baidu.com”。

什么是x509证书链?
答:x509证书一般会用到三类文件,key,csr,crt。

  • Key是私用密钥,openssl格式,通常是rsa算法。
  • csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。
  • crt是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证。

首先要有一个CA根证书,然后用CA根证书来签发用户证书。用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的CA根证书来签发证书。

什么是CA根证书
答:CA认证即电子认证服务,是指为电子签名相关各方提供真实性、可靠性验证的活动。

特别说明:

  • 自签名证书(一般用于顶级证书、根证书): 证书的名称和认证机构的名称相同.
  • 根证书:根证书是CA认证中心给自己颁发的证书,是信任链的起始点。任何安装CA根证书的服务器都意味着对这个CA认证中心是信任的。
  • 数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。
  • 数字证书包含证书中所标识的实体的公钥(就是说你的证书里有你的公钥),由于证书将公钥与特定的个人匹配,并且该证书的真实性由颁发机构保证(就是说可以让大家相信你的证书是真的),因此,数字证书为如何找到用户的公钥并知道它是否有效这一问题提供了解决方案。

openssl中有如下后缀名的文件:

  • .key格式:私有的密钥
  • .csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
  • .crt格式:证书文件,certificate的缩写
  • .crl格式:证书吊销列表,Certificate Revocation List的缩写
  • .pem格式:用于导出/导入证书时候的证书的格式,有证书开头,结尾的格式


CA根证书的生成步骤:

  • 1.生成CA私钥(.key)
  • 2.生成CA证书请求(.csr)
  • 3.自签名得到根证书(.crt)(CA给自已颁发的证书)。
    在实际的软件开发工作中,往往服务器就采用这种自签名的方式,因为毕竟找第三方签名机构是要给钱的,也是需要花时间的。
    # Generate CA private key 
    openssl genrsa -out ca.key 2048

    # Generate CSR
    openssl req -new -key ca.key -out ca.csr
    # Country Name (2 letter code) [XX]:CN #地区
    # State or Province Name (full name) []:CN #省份
    # Locality Name (eg, city) [Default City]:CQ #城市
    # Organization Name (eg, company) [Default Company Ltd]:weiyigeek #组织名称
    # Organizational Unit Name (eg, section) []:weiyigeek #单元名称
    # Common Name (eg, your name or your servers hostname) []:weiyigeek.com.cn #通用名称即网站域名
    # Email Address []:[email protected]
    # A challenge password []:weiyigeek #认证密码
    # An optional company name []:

    # Generate Self Signed certificate(CA 根证书)
    openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
    # Signature ok
    # subject=/C=CN/ST=CN/L=CQ/O=weiyigeek/OU=weiyigeek/CN=weiyigeek.com.cn/[email protected]
    # Getting Private key


用户证书的生成步骤:
生成私钥(.key)–>生成证书请求(.csr)–>用CA根证书签名得到证书(.crt)于上面的步骤差不多多的只是加密;
服务器端用户证书

# private key
$openssl genrsa -des3 -out server.key 1024

# generate csr
$openssl req -new -key server.key -out server.csr

# generate certificate
$openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

客户端用户证书:

$openssl genrsa -des3 -out client.key 1024 
$openssl req -new -key client.key -out client.csr
$openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

生成pem格式证书步骤
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成

$cat client.crt client.key> client.pem 
$cat server.crt server.key > server.pem

最后生成结果:

服务端证书:ca.crt, server.key, server.crt, server.pem
客户端证书:ca.crt, client.key, client.crt, client.pem