我在这个链接中简单的介绍了下加密解密原理和相关算法及其实现http://starli.blog.51cto.com/8813574/1671408


CA是什么?为什么需要CA? 先看下面的互联网安全通讯模型!

现在互联网上常用的安全通讯模型

简述ssl协议及利用openssl创建私有CA_CA、私有CA

       发送方发送数据时执行的步骤如下(分别对应于上图发送方的1、2、3):

            1、发送方将需要在互联网上进行安全传输的数据采用单向加密算法提取数据的特征码,然后用自己的私钥加密这段特征码放在数据的尾部;

            2、发送方生成一个一次性的对称加密算法的秘钥,然后使用对称加密算法和生成的秘钥将数据和加密后的特征码加密后生成密文;

            3、将上一步对称加密用到的秘钥使用接收方的公钥加密后放在密文的后面;随后就可以将数据放到互联网上进行传输。

   

       接收方接收到数据后执行的步骤如下(分别对应于上图接收方的1、2、3):

            1、接收方接收到数据后,用自己的私钥解密加密后的对称加密算法的秘钥。(如果能解密则能验证数据的机密性

            2、接收方用解密后得到的对称加密算法的秘钥后使用与发送方同样的对称加密算法解密加密的数据和加密的数据的特征码。

            3、接收方使用与发送方相同的单向加密算法提取解密后的数据的特征码,而后使用发送方的公钥对上一步解密得到的加密的数据的特征码(如果能解密,则可以发送接收方的身份),并比较这两个特征码进行比较是否一致。(如果一致,则可以验证数据的完整)。


    在上面的通讯过程中,双方都加密时都会用到对方的公钥。由于公钥是公开的,任何人都可以得到并使用。私钥是保密的,只有私钥的拥有者才能使用。那么在互联网上的安全通讯过程中,通讯双方如何可靠的得到对方的公钥呢?这就需要一种手段来实现。CA其实就是实现让通讯双方可靠的得到对方公钥的一种手段。CA的实现方式是通过给通讯者颁发证书,目前通用的证书格式为x509,证书基本格式如下

简述ssl协议及利用openssl创建私有CA_CA、私有CA_02

         CA其实就是一个大家都信任的公信机构,因此如果信任该CA就信任此CA给通讯者颁发的证书,那么就可以放心的使用证书中的公钥跟证书的拥有者通讯。CA要想给客户端发证书,首先就要给自己签署一个自签证书。而且此证书也需要分发给各个信任他的互联网主机。

证书主要有以下几个组件组成(统称为PKI):

          证书存取库:证书申请者或拥有者跟RA、CA、CRL打交道的接口

          RA(证书注册机构):证书申请者申请证书的机构

          CA(证书颁发机构):给证书申请者签署证书的机构

          CRL(证书吊销列表):  证书拥有者的私钥丢失所要用到的列表       

          PS: PKI全称为公钥基础设施

         

          早期的互联网中,大多数的协议都是明文的,使得在互联网上传输的数据非常的不安全。Netscape公司为了实现数据在互联网上安全传输,就开发了一种实现数据安全传输的名叫SSL的协议,常见的SSL协议共有三个版本SSLv1、SSLv2、SSLv3,目前常用的是SSLv3。后来在开源界也有SSL协议的开源实现TLS,有TLSv1的版本,此版本相当于SSLv3。

          TLS(transfer layer security)、SSL(secure socket layer):他们都是一种位于应用层和传输层之间的协议,可以基于TCP和UDP,上层应用可以使用该协议对数据进行加密,从而保证传输数据的安装也可以不使用此协议。因此,大多数人都称ssl是一种位于应用层和传输层之间的半层协议。


         如果想使用证书在企业或组织内部进行安全通讯,那么就需要构建私有CA,颁发证书时也有一个流程 ,具体流程和步骤如下:

              

             openssl作为CA时用到的目录或文件:                

    [root@localhost CA]# rpm -ql openssl    
    /etc/pki/CA
    /etc/pki/CA/certs
    /etc/pki/CA/crl
    /etc/pki/CA/newcerts           # 新生成的证书的副本存放位置
    /etc/pki/CA/private
    /etc/pki/tls
    /etc/pki/tls/certs
    /etc/pki/tls/certs/Makefile
    /etc/pki/tls/certs/make-dummy-cert
    /etc/pki/tls/certs/renew-dummy-cert
    /etc/pki/tls/misc
    /etc/pki/tls/misc/CA
    /etc/pki/tls/misc/c_hash
    /etc/pki/tls/misc/c_info
    /etc/pki/tls/misc/c_issuer
    /etc/pki/tls/misc/c_name
    /etc/pki/tls/openssl.cnf       # openssl配置文件信息
    /etc/pki/tls/private           # CA私钥存放位置

        

                建立私有CA服务器:

               1、给CA自己生成私钥

    [root@ca private]# openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
    Generating RSA private key, 2048 bit long modulus
    .................................+++
    .........................................................................................+++
    e is 65537 (0x10001)
    # 此处-out选项后面跟的文件名必须是cakey.pem。


               2、然后提取CA的私钥中的公钥给自己颁发一个自签证书

    [root@ca CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem  -out cacert.pem -days 36500
    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) []:BEIJING
    Locality Name (eg, city) [Default City]:BJ
    Organization Name (eg, company) [Default Company Ltd]:movekj.com
    Organizational Unit Name (eg, section) []:tech
    Common Name (eg, your name or your server's hostname) []:ca.movekj.com
    Email Address []:
     # 此处-out选项后面跟的文件名必须是cacert.pem。

        

               3、初始化CA工作环境             

    [root@ca CA]# touch /etc/pki/CA/{index.txt,serial}
    [root@ca CA]# echo 00 > /etc/pki/CA/serial
    [root@ca CA]# cat /etc/pki/CA/serial 
    00

             客户端申请证书           

               1、给客户端生成私钥

    [root@http ~]# openssl genrsa -out ~/http.key 2048
    Generating RSA private key, 2048 bit long modulus
    ...................................................+++
    ....................................................+++
    e is 65537 (0x10001)

 

               2 、在本地生成证书签署请求

    [root@http ~]# openssl req -new -key ~/http.key -out ~/http.csr
    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) []:BEIJING
    Locality Name (eg, city) [Default City]:BJ
    Organization Name (eg, company) [Default Company Ltd]:movekj.com
    Organizational Unit Name (eg, section) []:sell
    Common Name (eg, your name or your server's hostname) []:www.movekj.com
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

             

            3、将证书请求复制到CA服务器上

    [root@http ~]# scp ~/http.csr root@10.0.0.200:~/    
    The authenticity of host '10.0.0.200 (10.0.0.200)' can't be established.
    RSA key fingerprint is 2c:de:35:e7:d4:f1:a2:29:82:86:ff:d3:c4:75:11:42.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '10.0.0.200' (RSA) to the list of known hosts.
    root@10.0.0.200's password: 
    http.csr                                                                                                                  100% 1005     1.0KB/s   00:00

                

               4、在CA服务器上给客户端签署证书

    [root@ca ~]# openssl ca -in ~/http.csr -out ~/http.crt -days 300
    Using configuration from /etc/pki/tls/openssl.cnf
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number: 0 (0x0)
            Validity
                Not Before: Jul  9 02:49:02 2015 GMT
                Not After : May  4 02:49:02 2016 GMT
            Subject:
                countryName               = CN
                stateOrProvinceName       = BEIJING
                organizationName          = movekj.com
                organizationalUnitName    = sell
                commonName                = www.movekj.com
            X509v3 extensions:
                X509v3 Basic Constraints: 
                    CA:FALSE
                Netscape Comment: 
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier: 
                    16:91:A6:EA:6B:0D:5C:E8:BC:43:F8:64:52:A8:83:75:33:13:B7:CE
                X509v3 Authority Key Identifier: 
                    keyid:C2:AC:56:05:CD:7F:A0:58:D9:BF:65:9F:37:B4:3B:19:4D:35:21:F2
    
    Certificate is to be certified until May  4 02:49:02 2016 GMT (300 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

 

               5、将证书传给客户端

    [root@ca ~]# scp ~/http.csr root@10.0.0.150:~    
    The authenticity of host '10.0.0.150 (10.0.0.150)' can't be established.
    RSA key fingerprint is 5c:ea:49:68:f7:0f:77:d3:4e:82:0d:04:7e:ab:13:01.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '10.0.0.150' (RSA) to the list of known hosts.
    root@10.0.0.150's password: 
    http.csr                                                                                                                  100% 1005     1.0KB/s   00:00

        

         

         有了CA颁发的证书之后,互联网上的安全通讯过程如下(以https为例,这个过程也称之为SSL、TLS会话的建立过程):

简述ssl协议及利用openssl创建私有CA_CA、私有CA_03

           由于https是基于tcp/443号端口,因此在SSL会话开始之前有TCP的三次握手过程,而后才是SSL:

           1、客户端向服务器请求服务器的证书;

           2、服务器准备证书,客户端从服务器处下载证书

           3、客户端用事先下载在本地的CA证书中的公钥解密从服务器下载下来的证书的数字签名来获得证书主体部分的特征码(如果能解密,则就能验证此证书确实是客户端信任的CA颁发的证书),而后用与同样的算法提取证书主体部分的特征码,并比较两者是否一致。(如果一致,就能验证证书是完整的,没有被人篡改过,后续的通讯过程客户端就用从服务器上下载下来的证书中的公钥来进行加密通讯