OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。大多数开源程序,商业软件加密核心都是基于openssl实现的。

数据安全性的基本法则:

(1)数据的保密性;信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密钥要用一个安全的方法传送。加密过的数据可以公开地传送。

(2)完整性;通过数据的加密可以保证数据的完整性,保证数据在传输过程中没有被篡改。同时也要保证系统的完整性。

(3)可用性;保证数据在需要时的可用性。

 

常用的加密算法:

  1. 对称加密;加密和解密使用同一个密钥;依赖于:算法和密钥;安全性依赖于密钥,而非算法;

常见算法有:DES 3DESAES Blowfish Twofish IDEA RC6 cast5

特性:

a、加密、解密使用同一密钥;

b、将明文分隔成固定大小的块,逐个进行加密;

 

缺陷:

a、密钥过多;如一人对多人通信

b、密钥分发;如何发                              

工具:openssl enc, gpg

# openssl enc -e -CIPHERNAME -a -salt -in /PATH/FROM/SOMEFILE -out/PATH/TO/SOMECIPHERFILE加密

# openssl enc -d -CIPHERNAME -a -salt -in /PATH/FROM/SOMECIPHERFILE-out /PATH/TO/SOMEFILE解密

例:openssl  enc -e  -des3  -a -salt  -in  mykey -out  mykey.des3       加密

[root@localhost tmp]# openssl enc -e -des3 -a -salt -in mykey -out mykey.des3
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@localhost tmp]# cat mykey.des3 
U2FsdGVkX1/EDt3f00SNIDB06H2qFMMlYLETp1HjDDCo+pmXKLx/wLZzsinyQxXM
QQoklveH7BY9qm4FY79/Rye0PiXqgNlY9NiT85/Kze+ONtd+SPbxe/tHmN4x4HeF
TU5uG71yBl9S8rUxLlAnYjUCOWb8y8QQu4MFgK685CR9Xdxj02r47LuPBQb1dc9M
49U1EfsHqRY=
[root@localhost tmp]# cat mykey
hello,world!
hello,world!
hello,world!
hello,world!
hello,world!
hello,world!

        openssl  enc -d  -des3  -a -salt  -in  mykey.des3 -out  mykey.new 解密

[root@localhost tmp]# openssl enc -d -des3 -a -salt -in mykey.des3 -out mykey.new
enter des-ede3-cbc decryption password:
[root@localhost tmp]# cat mykey.new
hello,world!
hello,world!
hello,world!
hello,world!
hello,world!
hello,world!


(2) 非对称加密(公钥加密)

密钥对儿:私钥和公钥

         私钥:secret key,仅允许个人使用;

         公钥:public key,公开给所有获取;

         公钥从私钥中提取而来;使用公钥加密的数据,只能使用与此公钥配对儿的私钥解密;反之亦然;

 

用处:

a、身份认证:私钥拥有者用自己的私钥加密的数据,只要用其公钥能解密,即可认证其身份;

b、密钥交换:与被通信方通信之前,首先获取到对方的公钥,自己生成一个加密密码,用对方的公钥加密,并发送给对方;

c、数据加密

算法:RSA DSA ELGamal

                                   

特性:

a、密钥长度较大,例如512bits,2048bits, 4096bits

b、加密解密分别使用密钥对儿中的密钥相对进行;

         c、常用于数据签名和密钥交换;

工具:gpg, opensslrsautl

数字签名:RSA,DSA, ELGamal

生成密钥对儿:

                            操作过程:生成私钥,从私钥中提取公钥;

                       #openssl genrsa -out /PATH/TO/PRIVATE_KEYFILE NUM_BITS

            例:# openssl genrsa -out mykey 1024

[root@localhost tmp]# openssl genrsa -out mykey 1024
Generating RSA private key, 1024 bit long modulus
............................++++++
.............++++++
e is 65537 (0x10001)
[root@localhost tmp]# cat mykey
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDKk60hTgCODqzk1CV9THMksyEq+kTLk95pJHhWeBNSfBUYMaAj
cmH17lZMlsoYOqdocRDD60xRvgckZdk13Xvq0OzocBQHAOdRCTnbgNkqT86eBVjT
xuLx7Dhos4tAWlUa3Y0Bi65KjVgB7c3r+11iranxkRqt2o0ayqlBUDEzDQIDAQAB
AoGBAIVczUi0umbLQIVxKLEhiFgr2XUax/miAnUDvnlmmYnfCGAiI4PShK1MV+Ia
Dzf+PUHj1Z61pEvYJ4mNx37PrgiPwrXiQqUWAUH9fdcky7+a5KNOIHRkT1wgGeR4
HPvUmfu2wvjXkQJj3GttTOgWoNtsaPG/hTDbqJ3cafZsPeVBAkEA6pl62SglV9gq
u7Chqjcvao6nsQwMYt7JWz1w6hhXdRZp1KZXqs7G3XKI74fazzjtOZOJAB74uQZ0
Jw66g0PhHQJBAN0OYd16rjUTTZcF8B99lnAZCA9XqeogUPDgjHZLXQo2Kctic0Bo
sNd2QnvpxP1DJwLi7Dc0QFlee++GBwEFZrECQQCd+iSDv0kGUobURSlYWjkP5GiA
DMD6g1PMoR88RJAARMuXazx1xTCdRtd3lWB/UrJMp1EGR9Tto67r7jsi0b7xAkAC
2MiR3Z6YuGLravwoq6lgUDI2YF6j0T65m2qzq0zLcN8g62eokLCWVcONbPlIebDq
7Jk2LMoXXIwkDYnRjYxBAkEAl4YcnZUJkZLlwaKoc8N7RNZJy/qxFzv2AHlsnIfU
AqD84ohclgKm2tMY6Bi4O8afqsG1tcxe71UsHUl1fGjAqA==
-----END RSA PRIVATE KEY-----
[root@localhost tmp]#

       修改只有属主有读权限

[root@localhost tmp]# ll mykey
-rw-r--r-- 1 root root 891 Apr 22 08:07 mykey
[root@localhost tmp]# chmod 400 mykey
[root@localhost tmp]# ll mykey
-r-------- 1 root root 891 Apr 22 08:07 mykey
[root@localhost tmp]#

注意:在bash命令行上放在小括号中执行的命令,其实是通过打开一个子shell进程进行的;

   #(umask077; openssl genrsa -out /PATH/TO/PRIVATE_KEYFILE NUM_BITS)

[root@localhost tmp]# (umask 077;openssl genrsa -out mykey2)
Generating RSA private key, 1024 bit long modulus
...++++++
...++++++
e is 65537 (0x10001)

    从私钥中手动提取公钥:

          #openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE –pubout

例:# openssl rsa -in mykey -pubout                        加-text则以纯文本输出

[root@localhost tmp]# openssl rsa -in mykey -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDihLFD9OvI3vYQNWq2U+35jMYH
/IQGypMoXwGdw1Y2l5EiWSZCAiYZ8pi2KCne5/4abqSYEm40bdh/AGLEcKQxlB5k
BCIrp3mB4AgKBYwHNR+103kP7vxZf05BV4ZOgLuIxBWTN5jDgXKiICh7DwOb/D8r
PjeQw3kYr4NOtte73wIDAQAB
-----END PUBLIC KEY-----
[root@localhost tmp]#


(3)单向加密:提取数据的特征码;

 

特性:

                 a、定长输出:无论原来的数据是多大级别,其加密结果长度一样;

                 b、雪崩效应:原始数据微小改变,将会导致结果巨大变化;

                 c、不可逆:

 

        算法:

                         MD5128bits定长输出;CentOS 5

                          SHA1160bits定长输出;

                          SHA256

                          SHA384

                         SHA512CentOS6  CentOS7

CRC32 循环冗余校验码

   

        用处:

  1. 检验数据完整性;

         工具:openssl dgst,md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum

 

#openssl dgst -CIPHER /PATH/TO/SOMEFILE...

               例:openssl dgst -md5 mykey.new

[root@localhost tmp]# openssl dgst -md5 mykey.new
MD5(mykey.new)= 98e22e589945fa9d83394831b4c4372c
[root@localhost tmp]#

   mykey.new简单修改之后,MD5码会发生很大变化

[root@localhost tmp]# cat mykey.new
ello,world!
hello,world!
hello,world!
hello,world!
hello,world!
hello,world!
[root@localhost tmp]# openssl dgst -md5 mykey.new
MD5(mykey.new)= 86808e319afa61ef2d3890c5982d41cd
[root@localhost tmp]#

MAC:消息认证码,单向加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性;


生成用户密码:

                            #openssl passwd -1 -salt 8bits随机数

   例:# openssl passwd -1 -salt 12345678

[root@localhost tmp]# openssl passwd -1 -salt 12345678
Password: 
$1$12345678$j9vX8TpKTDxbX4gACw.5l1
[root@localhost tmp]#

生成随机数:

                            #openssl rand -hex|-base64 NUM

  例:# openssl rand -base64 4

        # openssl rand -hex 4

[root@localhost tmp]# openssl rand -base64 4
Fr/NWQ==
[root@localhost tmp]# openssl rand -hex 4
9bd788db
[root@localhost tmp]#

用随机数生成用户密码 :

 例:# openssl passwd -1 -salt $(openssl rand -hex 4)

[root@localhost tmp]# openssl passwd -1 -salt $(openssl rand -hex 4)
Password: 
$1$d23a1058$PvmnG/zwwEI6Oy2vOS5qd/

一次加密通信过程

                发送者:

                          1、使用单向加密算法提取生成数据的特征码;

                          2、使用自己的私钥加密特征码附加在数据后面;

                          3、生成用于对称加密的临时密钥;

                          4、用此临时密钥加密数据和已经使用私钥加密后的特征码;

                          5、使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方;

 

                接收方:

                          1、使用自己的私钥解密加密的临时密钥;从而获得对称密钥;

                          2、使用对称密钥解密对称加密的数据和私钥加密的特征码密文;从而获得数据和特征码密文;

                          3、使用发送方的公钥解密特征码密文,从而获得从计算生成的特征码;

                          4、使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的进行比较;

数字证书:

                CA:签证机构

                          功用:保证公钥信息安全分发;

 

                数字证书的格式(x.509v3)

                          版本号(version

                          序列号(serialnumber)CA用于惟一标识此证书;

                          签名算法标志(Signaturealgorithm identifier)

                          发行者的名称:即CA自己的名称;

                          有效期:两个日期,起始日期和终止日期;

                          证书主体名称:证书拥有者自己的名字

                          证书主体公钥信息:证书拥有者自己的公钥;

                          发行商的惟一标识:

                          证书主体的惟一标识:

                          扩展信息:

                          签名:CA对此证书的数字签名;


OpenSSl建立私有CA

1、生成私钥文件:/etc/pki/CA/private/cakey.pem

     #(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

[root@localhost tmp]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
..................................+++
...................................................................+++
e is 65537 (0x10001)
[root@localhost tmp]#


2、生成自签证书

       #openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out/etc/pki/CA/cacert.pem -days  365

[root@localhost tmp]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
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) [XX]:CN  
State or Province Name (full name) []:zz
Locality Name (eg, city) [Default City]:zz
Organization Name (eg, company) [Default Company Ltd]:mage
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server's hostname) []:localhost
Email Address []:hello@mail.com
[root@localhost tmp]# cd /etc/pki/CA
[root@localhost CA]# ll
total 20
-rw-r--r--  1 root root 1363 Apr 22 08:41 cacert.pem
drwxr-xr-x. 2 root root 4096 Oct 15  2014 certs
drwxr-xr-x. 2 root root 4096 Oct 15  2014 crl
drwxr-xr-x. 2 root root 4096 Oct 15  2014 newcerts
drwx------. 2 root root 4096 Apr 22 03:34 private
[root@localhost CA]#

                                               -new: 生成新的证书签署请求;

                                               -key:私钥文件路径,用于提取公钥;

                                               -daysN: 证书有效时长,单位为“天”;

                                               -out:输出文件保存位置;

                                               -x509:直接输出自签署的证书文件,通常只有构建CA时才这么用;

3、提供辅助文件

                                     #touch /etc/pki/CA/index.txt

                                     #echo 01 > /etc/pki/CA/serial

给节点发证书:

                            1、节点申请证书

                                     在证书申请的主机上进行如下步骤:

                                               (1)生成私钥;

                                               (2)生成证书签署请求;

 

                                               注意:

                                                        (a)其中的subject信息部分,要与CA的保持一致;

                                                        (b)Common Name要使用此主机在通信真实使用名字;

 

                                               (3)把请求发送给CA

 

                            2CA签发证书

                                     (1)验正请求者信息

                                     (2)签署证书

                                               #openssl ca -in /PATH/FROM/CSR_FILE -out /PATH/TO/CRT_FILE -days N

                                     (3) 把签署好的证书发还给请求者

    吊销证书:

                            1、获取吊销证书的序列号;

                                     #openssl x509 -in /PATH/FROM/CRT_FILE -noout -serial -subject

                            2、实现证书吊销

                                     (1)吊销证书

                                              #openssl ca -revoke /PATH/FROM/CRT_FILE

                                     (2)生成吊销证书的编号

                                               echo01 > /etc/pkie/CA/crlnumber

                                     (3)更新证书吊销列表

                                               #openssl crl -gencrl -out THISCA.crl