openssl

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openssl相关的知识,希望对你有一定的参考价值。

一、openssl简介

SSL(secure socket lawyer)安全套接字协议是web浏览器与web服务器之间进行安全交换信息的协议,提供两个基本的服务:保密和鉴别。

SSL在3.1版本之后改名为TLS;ssl协议位于应用层协议和TCP/IP协议之间。

ssl的特性:

保密性:在握手协议中定义了会话密钥后,所有的消息都被加密。

鉴别性:可选的客户端认证和强制的服务器端认证。

完整性:传递的消息包括信息完整性检查


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


二、安装openssl


1、yum安装:

#yum -y install openssl openssl-devel

2、源码安装:需要注意linux自带的openssl,可以rpm -e卸载了再安装

下载地址:https://www.openssl.org/source/

#wget 
#tar xf openssl-1.0.1u.tar.gz
#cd openssl-1.0.1u
#./config --perfix=/usr/local/openssl
#make
#make install
#配置环境变量或者做链接文件:
#ln -s /usr/local/openssl/bin/openssl /usr/bin/opensll
#ln -s /usr/local/openssl/include/openssl /usr/include/openssl
#echo "/usr/local/openssl/lib"  >> /etc/ld.so.conf
#ldd /usr/local/openssl/bin/openssl
#ldconfig -v

3、openssl升级:

由于使用yum安装版本太低,只能通过源码编译安装了,跟上面的源码安装基本相同:

关于openssl的编译选项的解读:

全局选项

第一类是全局性选项:

--openssldir=OPENSSLDIR 安装目录,默认是 /usr/local/ssl 。

--prefix=PREFIX 设置 lib include bin 目录的前缀,默认为 OPENSSLDIR 目录。

--install_prefix=DESTDIR 设置安装时以此目录作为"根"目录,通常用于打包,默认为空。

zlib    使用静态的zlib压缩库

zlib-dynamic    使用动态的zlib压缩库

no-zlib    不使用zlib压缩功能。

threads    是否编译支持多线程的库

no-threads 是否编译支持多线程的库。默认支持。

shared    是否生成动态连接库

no-shared 不生成动态连接库。

asm    是否在编译过程中使用汇编代码加快编译过程。

no-asm 不在编译过程中使用汇编代码加快编译过程。

enable-sse2
no-sse2 启用/禁用SSE2指令集加速。如果你的CPU支持SSE2指令集,就可以打开,否则就要关闭。

gmp
no-gmp 启用/禁用GMP库

rfc3779
no-rfc3779 启用/禁用实现X509v3证书的IP地址扩展

krb5
no-krb5 启用/禁用 Kerberos 5 支持

ssl
no-ssl
ssl2
ssl3
no-ssl2
no-ssl3
tls
no-tls 启用/禁用 SSL(包含了SSL2/SSL3) TLS 协议支持。

dso
no-dso 启用/禁用调用其它动态链接库的功能。[提示]no-dso仅在no-shared的前提下可用。

# wget https://www.openssl.org/source/openssl-1.1.1-pre6.tar.gz
# tar xf openssl-1.1.1-pre6.tar.gz
# cd openssl-1.1.1-pre6
# ./config shared zlib      
# make
# make install
#修改历史的openssl文件备份
# mv /usr/bin/openssl /usr/bin/openssl.bak
# mv /usr/include/openssl /usr/include/openssl.bak
#设置软链接使其使用新的openssl版本
# ln -s /usr/local/bin/openssl /usr/bin/openssl
# ln -s /usr/local/include/openssl /usr/include/openssl
#更新动态链接库数据
# echo "/usr/local/lib64" >> /etc/ld.so.conf
# ldconfig -v
# openssl version
OpenSSL 1.1.1-pre6 (beta) 1 May 2018

三、openssl常用命令

openssl command [ command_opts ] [ command_args ]
常用command:
version    用于查看版本信息
enc        用于加解密
ciphers    列出加密套件
genrsa    用于生成私钥
rsa        RSA密钥管理(例如:从私钥中提取公钥)
req        生成证书签名请求(CSR)
crl        证书吊销列表(CRL)管理
ca         CA管理(例如对证书进行签名)
dgst      生成信息摘要
rsautl    用于完成RSA签名、验证、加密和解密功能
passwd    生成散列密码
rand      生成伪随机数
speed      用于测试加解密速度                    
s_client  通用的SSL/TLS客户端测试工具
X509       X.509证书管理
verify      X.509证书验证
pkcs7       PKCS#7协议数据管理

1、申请证书:

SSL常用于身份验证、数据加密等应用中,要使用SSL,我们密码有自己的证书。数字证书一般要向专业的认证公司(如VeriSign)申请,并且都是收费的,某些情况下,我们只是想使用加密的数据通信,而不在乎认证,这时就可以自己制作一个证书,自己制作一个证书,有两种方式,一种是Self Signed,另一种是自己制作一个CA,然后由这个CA,来发布我们需要的证书。下面分别介绍这两个方法。

(1)生成self signed自己签名的证书:

#生成一个key,你的私钥,openssl会提示输入一个密码;会在本路径下生成一个server.key文件:

选项解释:genrsa生成私钥;-des3制定加密方式;-out制定密钥文件及位数。

[[email protected] ~]# openssl genrsa -des3 -out server.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
.............++
...................................................................++
e is 65537 (0x010001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

#使用上面生成的key,生成一个(CSR)证书签名请求,如果你的key有密码包含,openssl会询问你的密码,然后询问一系列的问题,其中最重要的是(common name),它代表你的证书要代表的目标,如果你为网站申请的证书,就要添加你的域名。

选项解释:req生成签名请求;-new 新的请求;-key使用文件中包含的密钥;-out将密钥输出到文件。

# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:china
string is too long, it needs to be no more than 2 bytes long
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:beijin
Locality Name (eg, city) []:beijinshi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:panjiayuan
Organizational Unit Name (eg, section) []:pjy
Common Name (e.g. server FQDN or YOUR name) []:www.pjy.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

#生成self signed签名证书:

选项解释:X.509证书管理;-req输入是证书请求、签名和输出;-days签署证书到期多长时间;-in输入文件;-signkey带ARG的自我签名证书;out输出到文件。
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=C = CN, ST = beijin, L = beijinshi, O = panjiayuan, OU = pjy, CN = pjy, emailAddress = [email protected]
Getting Private key
Enter pass phrase for server.key:

#另外的方法就是集合上面的命令,一次性生成key和证书

选项解释:req生成证书签名请求;-x509输出X509结构而不是证书Req;-nodes不要加密输出密钥;-days签署证书到期多长时间;-newkey rsa在指定大小上生成一个新的“bits”的RSA密钥;-keyout 指定RSA密钥文件名;-out输出证书文件。

# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
Generating a 2048 bit RSA private key
....................................................................................+++
.+++
writing new private key to 'privateKey.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

会生成一个privatekey.key私钥文件和certificate.crt证书文件。


(2)生成自己的CA (Certificate Authority),通过CA发布证书。

CA是证书的发布者,CA可以发布其他人的证书,把CA的证书加入系统信任的根证书后,由CA发布的证书也被系统所信任,所以,CA的key是必须小心保护的,一般都要加密保护,并且限制为root权限读写。

#生成CA的key
#openssl genrsa -des3 -out ca.key 4096
 
#生成CA的证书
#openssl req -new -x509 -days 365 -key ca.key -out ca.crt
 
#生成我们的key和CSR这两步与上面Self Signed中是一样的
#openssl genrsa -des3 -out myserver.key 4096
#openssl req -new -key myserver.key -out myserver.csr
 
#使用ca的证书和key,生成我们的证书
#这里的set_serial指明了证书的序号,如果证书过期了(365天后),
#或者证书key泄漏了,需要重新发证的时候,就要加1
#openssl x509 -req -days 365 -in myserver.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out myserver.crt

 

2、查看证书

#查看KEY信息
#openssl rsa -noout -text -in myserver.key
 
#查看CSR信息
#openssl req -noout -text -in myserver.csr
 
#查看证书信息
#openssl x509 -noout -text -in ca.crt
 
#验证证书
#会提示self signed
#openssl verify selfsign.crt
 
#因为myserver.crt是幅ca.crt发布的,所以会验证成功
#openssl verify -CAfile ca.crt myserver.crt
 
去掉key的密码保护
#有时候每次都要输入密码太繁琐了,可以把Key的保护密码去掉
#openssl rsa -in myserver.key -out server.key.insecure
 
不同格式证书的转换
一般证书有三种格式:
PEM(.pem)前面命令生成的都是这种格式,
DER(.cer .der) Windows上常见
PKCS#12文件(.pfx .p12) Mac上常见
 
# PEM转换为DER
#openssl x509 -outform der -in myserver.crt -out myserver.der
 
# DER转换为PEM
#openssl x509 -inform der -in myserver.cer -out myserver.pem
 
# PEM转换为PKCS
#openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt -certfile ca.crt
 
# PKCS转换为PEM
#openssl pkcs12 -in myserver.pfx -out myserver2.pem -nodes
 
测试证书
Openssl提供了简单的client和server工具,可以用来模拟SSL连接,做测试使用。
 
#连接到远程服务器
#openssl s_client -connect www.google.com.hk:443
 
#模拟的HTTPS服务,可以返回Openssl相关信息
# -accept用来指定监听的端口号
# -cert -key用来指定提供服务的key和证书
#openssl s_server -accept 443 -cert myserver.crt -key myserver.key -www
 
#可以将key和证书写到同一个文件中
#cat myserver.crt myserver.key > myserver.pem
#使用的时候只提供一个参数就可以了
#openssl s_server -accept 443 -cert myserver.pem -www
 
#可以将服务器的证书保存下来
#openssl s_client -connect www.google.com.hk:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > remoteserver.pem
#转换成DER文件,就可以在Windows下直接查看了
#openssl x509 -outform der -in remoteserver.pem -out remoteserver.cer

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

4、消息摘要算法应用例子

#用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

5、base64应用:

#对字符abc进行base64编码
#echo abc | openssl base64
结果为:YWJjCg==
#对YWJjCg==解码
#echo YWJjCg== | openssl base64 -d
结果为:abc
#对文件t.txt进行base64编码
#openssl base64 -in t.txt
结果为:aGVsbG8K
#对aGVsbG8K进行解码
#echo aGVsbG8K | openssl base64 -d
结果为:abc
#对t.txt进行编码并将结果输出到t.base64文件里
#openssl base64 -in t.txt -out t.base64
#若编码值存放在t.base64文件里,对其进行解码
#openssl base64 -d -in t.base64
结果为abc

6、des3应用:

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


以上是关于openssl的主要内容,如果未能解决你的问题,请参考以下文章

Laravel基本使用

怎么在windows上openssl颁发代码签名证书?

Openssl源代码整理学习

汉澳sinox不受openssl心血漏洞影响并分析修复其漏洞代码

Openssl源代码整理学习---含P7/P10/P12说明

OpenSSL 解密失败但错误代码为 0