基本概念
1. openssl是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现ssl协议。OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl、应用程序命令工具以及密码算法库libcrypto。
2. SSL:Secure Socket Layer,安全套接字层协议,分为SSLv2和SSLv3两个版本,TSL在SSL3.0基础之上提出的安全通信标准化版。主要是为了加密传输数据而产生的协议,能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。

SSL协议建立在可靠的传输层协议(TCP,UDP,SCTP)之上,应用层协议(HTTP,FTP,TELNRET)在SSL之上,SSL协议在应用层协议通信之前就已经完成了加密算法、服务器认证等工作。http协议调用了ssl协议,那么他就变成了https(http –>ssl–>https)。主要功能两个:
a. 加密解密在网络中传输的数据包,同时保护这些数据不被修改和伪造。
应用层——>ssl解密——>传输层
传输层——>ssl加密认证——>应用层
b. 验证网络对话中双方的身份。

3. SSL握手协议:SSL包含两个子协议,一个是包协议,一个是子协议,包协议说明SSL的数据包是如何封装的;握手协议说明通信双方协商通信双方决定使用什么算法及算法使用的key。暂时只讨论握手协议的过程。
1) Client向服务器发送自己支持的协议版本(如TLS1.2)、client生成的随机数、自己加密算法的一些配置。
2) Server 收到Client请求后向客户端response:确认使用加密通信协议的版本、生成一个随机数、确认使用加密的方法、server certificate(服务器证书)。
3) Client 验证服务器证书,在确认无误后取出其公钥,并发送随机数 Pre-Master-Key(用于公钥加密)、编码变更通知(通信双方都用商定好的密钥进行通信;即随后的信息都将用双方商定好的加密方法和密钥发送. )
4) Server验证完client的身份之后,用自己的私有密钥解密得到pre-master-key后,然后双方利用这个pre-master key来共同协商,得到master secret。返回信息给client
5) 双方用master一起产生真正的session key,这就是他们在剩下的过程中的对称加密的key了。这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。

4. 证书Certificate和证书颁发机构CA(certification authority)
证书是建立公共密钥和某个实体之间联系的数字化的文件。它包含的内容有:版本信息(X.509也是有三个版本的)、系列号、证书接受者名称、颁发者名称、证书有效期、公共密钥、一大堆的可选的其他信息、CA的数字签名。证书由CA颁发,由CA决定该证书的有效期,由该CA签名。每个证书都有唯一的系列号。证书的系列号和证书颁发者来决定某证书的唯一身份。常用的证书是采用X.509结构的,这是一个国际标准证书结构,
CA是第三方机构,被你信任,由它保证证书的确发给了应该得到该证书的人。CA自己有一个庞大的public key数据库,用来颁发给不同的实体。CA也是一个实体,它也有自己的公共密钥和私有密钥。

5. 加密算法
1)对称加密:指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性
常见的对称加密算法:DES、3DES、DESX、AES、RC4、RC5、RC6等
2)非对称加密:指加密和解密使用不同密钥的加密算法,也称为公私钥加密
常见的非对称加密算法:RSA、DSA(数字签名用)等
3)Hash算法:Hash算法它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值逆向获得目标信息
常见的Hash算法:MD2、MD4、MD5、SHA、SHA-1等

OpenSSL基本用法
1. 命令分为三类: 标准命令,消息摘要(dgst子命令),加密命令(enc子命令)
这里写图片描述

2. 对称加密 enc

openssl enc -ciphername [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

-in filename:要加密/解密的输入文件,缺省为标准输入。
-out filename:要加密/解密的输出文件,缺省为标准输出。
-pass arg:输入的文件如果有密码保护,在这里输入密码
-salt:自动插入一个随机数作为文件内容加密,默认选项
–nosalt:想和openssl0.9.5以前的版本兼容,就set这个option
–e:一个缺省会set的option,把输入数据加密,可以指明一种加密算法,若不指的话将使用默认加密算法
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64:用base64编码处理数据。set了这个option表示在加密之后的数据还要用base64编码捏一次,解密之前则先用base64编码解码。

创建word 文件加密:
这里写图片描述
加密:openssl enc -e -des3 -a -salt -in ./word -out ./encword
这里写图片描述
解密:openssl enc -d -des3 -a -salt -in ./encword -out ./decword
这里写图片描述

3. 单向加密 dgst
用来哈希某个文件内容的。也能用来进行数字签名和认证。

openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [-hmac key] [file…]

-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1:哈希算法的名称,默认值为md5。
-c:打印出哈希结果的时候用冒号来分隔开。
-d:详细打印出调试信息
-hex:以十六进制的形式输出结果,这是默认形式。
–binary:以二进制的形式输出结果。
-out filename:输出文件名,如果没有指定就采用标准输出。
-sign filename:从指定文件中读出私钥来对摘要值签名

word文件
这里写图片描述

4. 生成密码
用来哈希某个密码,也可以用来哈希文件内容。

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-quiet] [-table]{password}

-crypt -1 -apr1:这三个option中任意选择一个作为哈希算法,缺省的是-crypt。
-salt string:输入作为salt的字符串
-in file:要哈希的文件名称。
–stdin:对标准输入的内容进行加密

用“12345”作为salt的字符串 分别hash 密码、文件、标准输入内容
openssl passwd -crypt -salt 12345 root
openssl passwd -crypt -in ./word -salt 12345
openssl passwd -1 -in ./word -salt 12345
openssl passwd -1 -salt 12345 -stdin
这里写图片描述

5. 生成RSA私有密钥 genrsa

openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [numbits]

-out filename:私有密钥输入文件名,缺省为标准输出
-des|-des3|-idea:采用什么加密算法来加密我们的密钥。一般会要你输入保护密码。 如果这三个中一个也没set,我们的密钥将不被加密而输入。
-numbits:指明产生的参数的长度。必须是本指令的最后一个参数。如果没有指明,则产生512bit长的参数

密钥文件的权限一定要控制好,只能自己读写,因此可以使用 umask 命令设置生成的私钥权限

生成密钥文件rsa.txt
openssl genrsa -out ./rsa.txt 1024
这里写图片描述

6. Rsa :专门处理管理RSA密钥,从私钥中提取公钥等。

openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout]

-inform DER|PEM|NET:指定输入的格式是DEM、DER还是NET
-outform DER|PEM|NET:和上一个差不多,不同的是指定输出格式
-in filename:要分析的文件名称(私钥文件名)。如果文件有密码保护,会要你输入的。
-out filename:指明将提取出的公钥保存至指定文件中
-des|-des3|-idea:指明用什么加密算法对私有密钥进行的加密
-pubout:缺省的来说是打印出私有密钥,这个就可以打印公共密钥。如果上面那个选项有set,那么这个选项也自动被set。
-check:检查RSA的私有密钥是否被破坏了。

从文件rsa.txt中提取公钥:
openssl rsa -in ./rsa.txt -out rsa.pub //保存到文件
openssl rsa -in ./rsa.txt -pubout //打印
这里写图片描述

对私钥进行加密
openssl rsa -in ./rsa.txt -des3 -out rsa.pem
这里写图片描述

7. DSA(与RSA用法基本相同)

openssl gendsa [-out filename] [-des] [-des3] [-idea] [-rand file(s)] [paramfile]

openssl dsa [-inform PEM|DER] [-outform PEM|DER] [-in filename]
[-passin arg] [-out filename] [-passout arg] [-des] [-des3] [-idea]
[-text] [-noout] [-modulus] [-pubin] [-pubout]

DSA与RSA
DSA是基于整数有限域离散对数难题的,采用对称加密,密钥量短,加/解密速度快,DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。
RSA算法在网络容易实现密钥管理,方便进行数字签名,算法复杂,加/解速度慢,采用非对称加密。

8. 创建CA和申请证书 req
在文件/etc/pki/tls/openssl.cnf 中定义的证书名称、存储位置等信息。可以根据自己需求修改。创建自签名证书和证书签名请求文件CSR

openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] [-newkey dsa:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-[md5|sha1|md2|mdc2]] [-config filename] [-x509] [-days n] [-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section]

-in filename:要处理的CSR的文件名称,只有-new和-newkey俩个option没有被set,本option才有效
-out filename:要输出的CSR文件名。
–new:本option产生一个新的CSR(Cerificate Signing Request), 它会要用户输入创建CSR的一些必须的信息。至于需要哪些信息,是在config文件里面定义好了的。如果-key没有被set私钥文件,那么就将根据config文件里的信息先产生一对新的RSA私钥文件,通过-keyout指定私钥钥文件。
-newkey arg:同时生成新的私有密钥文件和CSR文件。本option是带参数的。如果是产生RSA的私有密钥文件,参数是一个数字,指明私有密钥bit的长度。如果是产生DSA的私有密钥文件,参数是DSA密钥参数文件的文件名。
-key filename:参数filename指明我们的私有密钥文件名,如果没有指定,那么就将根据config文件里的信息先产生一对新的RSA私钥文件,通过-keyout指定生成的私钥文件路径。
-keyout filename:指明创建的新的私有密钥文件的文件名。如果该option没有被set,将使用config文件里面指定的文件名。
-config filename:使用的config文件的名称。本option如果没有set,将使用缺省的config文件。
-x509:本option将产生自签名的证书。一般用来自己玩下做个Root CA。证书的扩展项在可以在上面提到的config文件里面指定。
-days n:如果-509被set,那么这个option的参数指定我们自己的CA给人家签证书的有效期,缺省是30天。
–verify:检验请求文件里的签名信息。
–noout:不要打印CSR文件的编码版本信息。

(1) 生成自签名证书, -x509选项, 作为RootCA 使用
openssl req -new -x509 -keyout ca.key -out ca.cer -days 3650
这里写图片描述

(2) 生成证书签名请求文件CSR
openssl req -new -keyout test.key -out test.csr -days 3650
这里写图片描述

9. CA服务器根据CSR颁发证书 ca
模拟CA行为的工具。有了它,你就是一个CA,可以用来给各种格式的CSR签名,用来产生和维护CRL。此外还维护着一个文本数据库,记录了所有经手颁发的证书及那些证书的状态。

openssl ca [-verbose][-config filename][-name section][-gencrl][-revoke file][-crldays days][-crlhours hours][-crlexts section][-startdate date][-enddate date][-days arg][-md arg][-policy arg][-keyfile arg][-key arg][-passin arg][-cert file][-in file][-out file][-notext][-outdir dir][-infiles][-spkac file][-ss_cert file][-preserveDN][-batch][-msie_hack][-extensions section]

-config filename:指定使用的configure文件。
-in filename:要签名的CSR文件。
-ss_cert filename:一个有自签名的证书,需要我们CA签名,就从这里输入文件名。
-infiles:如果你一次要给几个CSR签名,就用这个来输入,但记得这个选项一定要放在最后。这个项后面的所有东东都被认为是CSR文件名参数。
-out filename:签名后的证书文件名。证书的细节也会给写进去
-outdir directory:摆证书文件的目录。证书名就是该证书的系列号,后缀是.pem。
-cert:CA本身的证书文件名。
-keyfile filename:CA自己的私有密钥文件。
-md arg:签名用的哈希算法,比如MD2,MD5等。
-notext:不要把证书文件的明文内容输出到文件中去。

CA颁发证书前需要准备相关文件,否则会报对应文件找不到。或者通过CA.sh -newca创建一个CA,建立好相应的目录,所有需要的文件,包括CA的私有密钥文件,证书文件,系列号文件,和一个空的index文件,免去上面的自签证创建过程。
这里自己准备:
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial

用上面生成的自签名证书ca.cer作为RootCA 颁发证书
openssl ca -in test.csr -out test.cer -cert ca.cer -keyfile ca.key -notext
其中-notext表示不要把证书文件的明文内容输出到文件中去,否则在后面用keytool导入到keystore时会出错。
这里写图片描述

10. X509
X509是一个功能很丰富的证书处理工具,可以用来显示证书的内容,转换其格式,给CSR签名等等

openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] [-keyform DER|PEM][-CAform DER|PEM] [-CAkeyform DER|PEM] [-in filename][-out filename] [-serial] [-hash] [-subject] [-issuer] [-nameopt option] [-email] [-startdate] [-enddate] [-purpose] [-dates] [-modulus] [-fingerprint] [-alias] [-noout] [-trustout] [-clrtrust] [-clrreject] [-addtrust arg] [-addreject arg] [-setalias arg] [-days arg] [-signkey filename][-x509toreq] [-req] [-CA filename] [-CAkey filename] [-CAcreateserial] [-CAserial filename] [-text] [-C] [-md2|-md5|-sha1|-mdc2] [-clrext] [-extfile filename] [-extensions section]

-in filename:指定输入文件名
-out filename:指定输出文件名
-md2|-md5|-sha1|-mdc2:指定使用的哈希算法。缺省的是MD5
-text:用文本方式详细打印出该证书的所有细节
-noout:不打印出请求的编码版本信息。
-serial:打印出证书的系列号。
-subject:打印出证书拥有者的名字。
-issuer:打印证书颁发者名字
-dates:打印证书起始有效时间和到期时间

这里只是查看证书的内容,而且证书格式要求是PEM格式,就是base64编码格式。除了PEM格式还有DER格式(二进制编码),
openssl x509 -in test.cer -noout -text
这里写图片描述

参考文章:
https://blog.csdn.net/u011456940/article/details/57416526
https://blog.csdn.net/liguangxianbin/article/details/79665100
https://www.cnblogs.com/yangxiaolan/p/6256838.html