网络上实现安全传输是一件非常必要的事情,此篇博文主要介绍一下四种常见的加密解密技术和PKI机制以及如何通过openssl建立私有CA

一、加密解密技术

1对称加密

   主要加密算法:

        1、DES:Data Encryption Standard 数据加密标准

加密端:将明文划分为64bits为一块,用密钥加密产生64bits的密文

解密端:还原回64bits密文

加密和解密均使用56bits的密钥

        2、3DES:Triple DES;也就是进行三次DES加密

        3AES:Advanced Encryption Standard;

 高级加密标准;密钥可为128bits,192bits,256bits,384bits

        4、Blowfish,使用1-448bits的密钥,将明文划分为64bits的块;

      5Twofish,采用128, 192, 256bits的密钥,将明文划分为128bits的块

      6、IDEA,采用128bits密钥,将明文划分为64bits的块;

      7、RC6, 256 位密钥和 128位块大小

        8CASTS64 位块加密, 允许最大 128 位的块大小,使用 128 位密钥

        特性:1、加密和解密使用同一个密钥,但是加密和解密算法可能不同;

                   2、将原始数据分割为固定大小的块,逐个进行加密;

2公钥加密

   主要加密算法:

1、RSA(既能实现数字签名,又能实现加解密)

2、DSA,digital Signature Algorithm(数字签名标准)

3、ELGamal,既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题

   公钥:从私钥中提取的,公开给所有人;

   私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key

   特点:用公钥加密的数据,只能适用与之配对的私钥加密;反之亦然;

   用途

      数字签名:主要在于让接收方确认发送方的身份;

      密钥交换:发送方用对方的公钥加密一个对称密钥,并发送给对方;

      数据加密:加密数据成为密文;

3单向加密

          主要加密算法:

       1、md5:Message Digest 5,128bits定长输出

       2、sha1:Secure Hash Aigorithm 1,160bits定长输出

          又有sha224,sha256,sha384,sha512

   特性:即提取数据指纹(特征码),只能加密不能解密,定长输出,雪崩效应

   功能:完整性验证。

4密钥交换

           主要加密算法: 

                     1、公钥加密

       有一个风险,密码是在网上传输,有可能会被暴力破解;

        2DHDeffie-Hellman

        wKiom1aROeiTKs0nAAA3Cu5wy_o744.png

      Alice和Bob最终都得到了同样的值,因为在模p 相等。注意ab  gab = gba mod p 是秘密的。其他所有的值 pgga modp, 以及 gb modp 都可以在公共信道上传递。一旦Alice和Bob得出了公共秘密,他们就可以把它用作对称密钥,以进行双方的加密通讯,因为这个密钥只有他们才能得到。此密钥依赖于大素数;(此段解释出自维基百科)

 

二、 PKI机制

   PKIPublic KeyInfrastructure)即公钥基础设施,它包括:

签证机构:CA

注册机构:RA

证书吊销列表:CRL

证书存取库:

 

X.509v3:定义了证书的结构以及认证协议标准,它包括

证书版本号

证书序列号

数字签名算法ID

发行者名称

证书有效期限

证书主体名称

证书主体公钥

发行者的唯一标识

主体的唯一标识

扩展

发行者的签名:单向加密以上内容项

1)没有PKI机制的加密通信过程

   A要给B加密一段数据发送过去

wKiom1aROqDSNtp7AAPIGHgLlss442.jpg

 缺陷:接收方的公钥可能会被人冒充;这个缺陷会引发中间人***(man-in-middle

2)增加PKI机制的加密通信过程

   主要是为了解决公钥的可信问题,增加PKI机制后的通信过程比上述过程增加了验证证书的环节;

   验证证书

    当接收方拿到发送方的公钥,会要求发送方发送可信机构为其签署的证书,而后验证证书内容,根据这个验证结果来确定公钥的可信性;

   索要证书的过程是基于SSL会话的方式进行的:

   SSL会话:

   wKioL1aROvLR0hGVAACw7gqVons590.png

        第一阶段:ClientHello:

支持的协议版本。比如tls 1.2;

客户端生成一个随机数,随后用于生成“会话密钥”;

支持的加密算法,比如AES、RSA;

支持的压缩算法;

第二阶段:ServerHello

确认使用的加密通信协议版本,比如tls 1.2;

服务器端生成一个随机数,稍后用于生成“会话密钥”;

确认使用的加密方法;

服务器证书;

(如果服务器需要验证客户端证书则会索要客户端证书)

第三阶段:

验证服务器证书,在确认无误之后取出其公钥;

发送以下信息给服务器:

一个随机数:用于服务器公钥加密;

编码变更通知:表示随后的信息都将用双方商定的加密方法和密钥发送

客户端握手结束通知。

第四阶段:

收到客户端发来的第三个随机数pre-master-key后。计算生成本次会话所用到的“会话密钥”;

向客户端发送如下信息:

编码变更通知:表示随后的信息都将用双方商定的加密方法和密钥发送

服务器握手结束通知。

   验证的证书内容: 

1)用CA的公钥解密CA的签名,说明证书的来源可靠。

2)用同样的加密算法加密证书得到特征码,与解密出的特征码比对,若一致,则完整性可靠;

3)检查证书的有效期限

4)验证主体名称是否符合;

5)检查证书是否被吊销;


三、 OpenSSL介绍和使用openssl创建私有CA

1OpenSSL介绍

    OpenSSLSSL协议/TLS协议的开源实现程序,它由三部分组成

libcrypto:通用加密库,提供各种加密函数

libsslTLS/SSL协议的实现;基于会话实现了身份认证、数据机密性和会话完整性的TLS/SSL

openssl:多用途命令行工具;

     注意:libcryprolibssl主要是供给开发者使用;在这里我们仅说明一下openssl的使用;


openssl命令

          使用格式:openssl command [ command_opts ] [command_args ]

它通过众多的子命令来实现各种不同的功能,子命令分为三类:

     标准命令(enc,ca,req,genrsa,passwd,dgst...)可通过openssllist-standard-commands 查看.

     消息摘要命令(如md5等子命令)可通过 openssl list-message-digest-commands 查看

     加密命令(如des子命令)可通过 openssl list-cipher-commands 查看

注意:由于openssl有众多子命令,所以 man openssl 并不能看到子命令的帮助文档,想要查看子命令的帮助信息,应该先whatis command,然后再man command

例如:

~]# whatis passwd
sslpasswd (1ssl)  - compute password hashes
passwd (1)      - update user's authentication tokens
passwd (5)      - password file
~]# man sslpasswd

1常用命令

 1> enc 实现对称加密

   支持的算法:3des,aes,blowfish,twofish

   常用选项: 

           -in filename:指明需要加密的文件

           -outfilename:知名密文输出的文件

           -salt:加密时加一点杂质

           -e :加密数据

           -d :解密数据

           -des3... :指明加密算法

           -a :使用base64base64基于64个可打印字符来表示二进制数据。如无此项,加密密文

                  是乱码

例如:

加密
~]# openssl enc -e -des3 -a -salt -in test -outtest.crypt
解密
~]# openssl enc -d -des3 -a -salt -out test -in test.crypt


 2> dgst 实现单向加密

    dgst命令: openssl dgst -md5 /PATH/TO/SOMRFILE

 此处-md5为单向加密算法,此外还有-md2-md4-rmd160-sha,-sha1

 3> passwd 生成用户密码

    openssl passwd -1-salt SALT

      -1:表示MD5算法,目前仅支持md5算法

      -salt SALTSLAT是杂质,一般是随机数。

 例如:

~]# openssl passwd -1-salt $(openssl rand -hex 4)

此处说明生成随机数的方法

openssl rand -hex NUM 即可生成一个16进制字符串

例如:

~]# openssl rand -hex 4

 4>genrsa 生成私钥

   一般使用方法:(umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)

   其中umask 077保证私钥仅创建者可读;NUM_BITS必须是2N次方;

例如:

~]# (umask 077;openssl genrsa -out fisrt.pri 512) 
Generating RSA private key, 512 bit long modulus
...........++++++++++++
...++++++++++++
e is 65537 (0x10001)
~]# cat fisrt.pri 
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAL3I5YfgHBp6X8LJLXWb4d09hmjpnW0/cO5Hkt45tTaiZtCRnu4v
Dt0fLKBNVsirztD4mXR6KHvx91pWAMgNR+kCAwEAAQJAE1UnrJOzyS62Go2Lx/M9
KuBdlMpXcw2HX36DA4g1YX80YJIpEbElUtSAJ1mnm73HU0YBQaW7/+moSsXTgpvW
AQIhAPmixZqK8JLkDHmk8OjxOCQzWJFm7uZ0SBcN5v+eUvJRAiEAwp+C8V+hm+DE
qj6guba6Qm1B/GixioSb6QZooNIEPhkCIQDIbxTRvPTkPA54LSLxJZy6FC/srwTq
LDslp5ftbaWTwQIgGuGlWGl5DOqyv0D/Oid++oXUw2RCgXtnfXwhH3VimKECIAK1
lEloDaB18V+tK9d46JQXZAWBg3s+2oOL/AyjLBah
-----END RSA PRIVATE KEY-----


 5> rsa 提取公钥 

   一般使用方法 openssl rsa -in  /PATH/FROM/PRIVATE_KEY_FILE  -pubout

 例如:

~]# openssl rsa -in fisrt.pri -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL3I5YfgHBp6X8LJLXWb4d09hmjpnW0/
cO5Hkt45tTaiZtCRnu4vDt0fLKBNVsirztD4mXR6KHvx91pWAMgNR+kCAwEAAQ==
-----END PUBLIC KEY-----


2)使用openssl创建私有CA(配置文件在/etc/pki/tls/openssl.cnf的[ ca ]段

   概述:在将要被配置为CA的主机上生成一个自签证书,并为CA提供所需要的目录及文件即可


1、在/etc/pki/CA/private/下生成密钥cakey.pem

~]# (umask077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
.........................................................++
..................................................................................++
e is 65537 (0x10001)


2、生成自签证书

~]# openssl req -new-x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 300
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) []:ShangHai
Locality Name (eg, city) [Default City]:ShangHai
Organization Name (eg, company) [Default Company Ltd]:OpenHome       
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:centos 7
Email Address []:admin@test.com

    -x509:自签证书,专用于创建私有CA时;

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

    -key:生成请求时用到的私钥文件路径

    -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;

    -days:证书的有效时长,单位是天

注意:虽然指向的是私钥文件,但是会自动提取出公钥写入;

 

3、为CA提供所需的目录和文件

~]# mkdir/etc/pki/CA/{certs,crl,newcerts} -----> 注意:若这些文件存在则不用执行此步
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial


至此私有CA创建成功。

 

验证CA服务器颁发证书

以一台web服务器为例,向CA服务器请求一个证书

1、在web服务器所在主机的/etc/httpd目录下新建ssl目录,并在这个目录下生成一个私钥文件

[root@COS6 httpd]#mkdir ssl
[root@COS6 httpd]# cd ssl
[root@COS6 ssl]# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
........................+++
...........................................................................................................+++
e is 65537 (0x10001)


2、在web服务器上生成证书签署请求

[root@COS6 ssl]#openssl req -new -key httpd.key -out httpd.csr -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) []:ShangHai
Locality Name (eg, city) [Default City]:ShangHai
Organization Name (eg, company) [Default Company Ltd]:OpenHome
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:centos 7
Email Address []:admin@test.com

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

注意:这一步的信息必须和CA的信息保持一致;


3、将请求通过可靠方式发送给CA服务器,我们这里是测试,所以使用scp工具,但实际使用中建议更安全的方式来传递请求

[root@COS6 ssl]# scphttpd.csr root@172.16.25.71:/  ---> 172.16.25.71是CA服务器


4CA服务器签署web服务器发来的请求

[root@COS7 ~]# openssl ca -in /httpd.csr -out/etc/pki/CA/certs/httpd.crt -days 200
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jan  9 15:55:33 2016 GMT
            Not After : Jul 27 15:55:332016 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = ShangHai
            organizationName          = OpenHome
            organizationalUnitName    = Ops
            commonName                = centos 7
            emailAddress              = admin@test.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL GeneratedCertificate
            X509v3 Subject KeyIdentifier: 
               70:BE:AA:EB:B8:5E:C0:62:18:8B:D2:8E:A8:AF:9D:70:A8:ED:49:B7
            X509v3 Authority KeyIdentifier: 
               keyid:73:4E:41:9A:71:B3:F0:85:26:6E:99:1B:6B:E0:53:96:32:DC:8D:9F

Certificate is to be certified until Jul 27 15:55:33 2016 GMT (200 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


注意:CA服务器和客户端的httpd.csr文件在签署请求后都可以删除,以此来保证信息不泄露。

 

注:此篇博文是在CentOS系统上做的测试