加密解密技术基础、PKI及创建私有CA

目录

    一、数据安全的基本特点

    二、数据的加密算法和协议  

    三、数字证书CA

    四、PKI概述

    五、OpenSSL的组成

    六、使用OpenSSL构建私有CA




一、数据安全的基本特点   

        保密性:confidentiality;保证数据不被其他非法用户所获得

        完整性:integrity(数据完整性和系统完整性)

        可用性:available 保证数据能够被用户实时调用及查看


二、数据的加密算法和协议

    1.加密或解密的方法:

            传统加密方法:

                    替代加密算法

                    置换加密方法

            现代加密方法:

                现代块加密方法:把数据切割为固定大小的块,分别对每块数据进行单独加密,后一块和前一块基于某种链式机制,进行某种特殊的运算,紧密联系在一起。

    2.加密算法和协议:

    (1)对称加密:加密和解密使用同一个密钥。

           加密过程:(图片仅帮助理解)

wKiom1aOJD6RhSbOAADrREOa4ps132.jpg

    常见的算法

          DES:Data Encryptionstandard(数据加密标准) 现代加密算法,它使用56位的密钥对数据进行加密。

          3DES:Triple DES(相当于DES三个数量级)现代加密算法,它使用3条56位的密钥对数据进行三次加密。

          AES:AdvancedEncryption Standard(高级加密标准)AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。 

          商业加密算法:Blowfish,IDEA,RC6,CASTS

     特性:

           ● 加密、解密使用同一个密钥;

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

    (2)公钥加密:密钥分为公钥和私钥(成对出现)

            公钥:从私钥中同提取产生;可以公开给所有人;pubkey

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

            特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;

            用途:

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

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

                  身份认证:发送方用自己的私钥加密数据特征码,接收方用对方的公钥进行解密。依赖数               字签名,发送方用自己的私钥加密数据特征码的结果就是数字签名。数字签名就是为了完成身               份认证的。

            公钥加密通信过程:

                发送方

                        单向加密,计算数据的特征码

                        用自己的私钥加密特征码,并将结果附加在数据后,

                        生成一个临时的对称密钥,并用对称密钥加密整段数据

                        获取对方公钥,并使用对方公钥,加密临时对称密钥,并附加在数据后,发送给对方

                接收方:

                        使用自己的私钥解密加密的对称密钥

                        用对称密钥解密加密的数据

                        用对方的公钥解密特征码,如果能解密,对方身份得到验证

                        用单向加密计算数据的特征码与源文件进行比较,数据完整性得到验证     

            算法:

                    RSA,DSA,ELGamal(商业加密算法);

                    DSS : Digtal Signature Standard(数字签名标准)

                        只能签名不能加解密

                    DSA:DigtalSignatute Algorithm(数字签名算法)既能签名又能加解密,功能强大

     (3)单向加密:即提取数据指纹(即特征码),只能加密,不能解密;

        特性:定长输出、雪崩效应;

        功能:完整性验证

        算法:

            MD5:Message Digest5(消息摘要), 128bits

            sha1 160bits, sha224, sha256, sha384, sha512

    (4)密钥交换:IKE ( Internet Key Exchange )

        常见的实现方法:

            公钥加密

            DH(Deffie-Hellman)算法

      

三、数字证书CA

      公钥在网络传输过程中,无法保证可信度,容易被窃取或伪装,所以我们就需要一个受信任的第三方机构(CA),来保证公钥信息的安全分发。

    1.数字证书CA的颁发

       用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。

    2.如何对对方的数字证书进行验证

      用户使用CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。

    3.证书验证的主要内容:

       用户先获得CA自己的证书,用CA的公钥解密CA的证书,验证CA的可靠性,CA的证书是由CA自己所颁发的。 

    (1)用户使用CA的公钥解密对方的证书,能解密说明证书来源可靠;

    (2)然后用同样的加密算法加密证书,取得特征码,与解密的特征码比较,如果相同,证书完整性可靠;

    (3)检查证书的有效期限;

    (4)验证主体名称和期望通信的对方是否一致;

    (5)检查证书是否被吊销。

至此,证书验证过程结束。

       

四、PKI : Public Key Infrastructure

        公钥基础设施:

        签证机构:CA 用户在注册机构注册以后,CA判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者,并在证书存取库进行备份。

        注册机构:RA,一般用户在注册CA时的注册机构。

        证书吊销列表:CRL,用户如果将自己的私钥丢失,就可以申请吊销自己的证书。

        证书存取库:CB,发出证书的存放的数据库,如果用户的证书丢失,可以在这儿找到。

        x509V3:定义了证书的结构以及认证协议标准

            版本号:指出该证书使用了哪种版本的X.509标准

            序列号:由CA给予每一个证书分配的唯一的数字型编号

            签名算法ID:用来指定CA签署证书时所使用的签名算法

            发行者名称:CA的名称

            有效期限:证书起始日期和时间以及终止日期和时间

            主体名称:证书持有人唯一的标识符

            主题公钥:包括证书持有人的公钥、算法

            发行者的唯一标识(可选项)

            主体的唯一标识(可选项)

            扩展

            发行者的签名:CA对此证书的数字签名,用于验证证书是自己的签发的


五、OpenSSL的组成

 1.OpenSLL协议工作原理

    (1)在TCP/IP协议下的实现过程

    wKiom1aOhZmxfX74AAEHdiq4AsE624.jpg

     (2)客户端和服务器端的会话原理(图片未必精确,辅助理解)

    wKiom1aPyoaD-sTcAAGkZ83inLo818.jpg

 SSL客户端服务器端会话过程:

       客户端生成一个随机数,稍后用户生成“会话密钥“,客户端支持的加密算法,比如AES,RSA以及

支持的压缩算法。

       服务器端生生一个随机数,稍后用于生成“会话密钥”,双方协商通信所使用的加密算法,服务器

端向客户端发送服务器端的证书

       客户端验证服务器证书(发证机构,证书完整性、证书持有者、证书有效期、吊销列表)在确认无

误后取出其公钥;发送一个随机数,编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥

发送;至此客户端握手结束通知;

       服务器收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有用到的“会话密

钥“,向客户端发送变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;服务端握手结

束通知;


2.OpenSSL支持的子命令

    标准命令:enc,ca,req,genrsa,...

Standard commands  
#标准命令,使用命令自身来调用
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh                
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
gendh             gendsa            genpkey           genrsa            
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              req               
rsa               rsautl            s_client          s_server          
s_time            sess_id           smime             speed             
spkac             ts                verify            version           
x509              
Message Digest commands (see the `dgst' command for more details) 
#消息摘要命令,使用dgst调用,加密时支持的算法
md2               md4               md5               rmd160            
sha               sha1              
Cipher commands (see the `enc' command for more details)
#加密命令,使用enc命令调用
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          zlib

    对称加密:

        工具:openssl enc,  gpg

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

    enc命令:

 加密:~]#openssl  enc  -e -des3  -a  -salt -in fstab   -out fstab.ciphertext
 解密:~]# openssl  enc -d  -des3  -a -salt  -out fstab   -in fstab.ciphertext

    单向加密:

         工具:openssl openssl dgst, md5sum, sha1sum, sha224sum, ...

    dgst命令:      

 ~]# openssl  dgst  -md5 /PATH/TO/SOMEFILE

    生成用户密码:

        工具:passwd, openssl  passwd

 ~]# openssl  passwd  -1 -salt  SALT

        生成随机数:

        openssl rand       

 ~]# opensll rand -hex NUM
 ~]# opensll rand -base NUM

    公钥加密:

            加密解密:

            算法:RSA,ELGamal

            工具:openssl rsautl, gpg

    数字签名:

        算法:RSA, DSA, ELGamal

        工具:penssl rsautl, gpg

    密钥交换:

        算法:DH    

  生成私钥: ~]# (umask 077;  openssl genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)
  提出公钥: ~]# openssl  rsa  -in /PATH/FROM/PRIVATE_KEY_FILE -pubout

3.如何使用OpenSSL进行对称加密

    (1) 对称加密

示例:解密解密当前目录下的anaconda-ks.cfg文件

[root@localhost ~]# cp /etc/fstab ./  #将/etc/fstab文件复制至当前目录下
[root@localhost ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.cipher #加密操作
enter des-ede3-cbc encryption password: #加密是用到的密码
Verifying - enter des-ede3-cbc encryption password:
[root@localhost ~]# cat fstab.cipher  #查看加密后的文件
U2FsdGVkX19vosbARtM7zk0M+f8c+StIW8TR7mOLAQoc30fhhXF9gGYjiRT4Uzou
Qq9B/SSoHP/jbC9PiLiMRNxktyFkCqOPMyql5W2SumcxD4bSPKy0MHpKs8UP//LZ
JODM4ImWvXIY+qjmeV52j4j75BKPIwMEVSLsbjMBVI8IEDmVMi6T8z78GJFpKZpW
DMKcR6S1oarHdCnrrPFAKYyUr2N3qjuY8eGrce7cxpG9NrqvIgGG9yvWHodlUa0Y
C5T8ZNMrLokdV/5Rd0jJOuykvxHSPsvUI1S3jYojAsU4S5H3IAeSW/3OkGIW8dr1
GLL/Gjxk+irQI+BxepKqtHU9coxTKzZhE7FdSNYzsAWXfm2DoPa9z4YPafvMqMHu
lN6ra6daLNERZdwr5rDvEn19q7Swcqd9mOlwVpk4W7X4gxeSbFp2/orm9BFDdmNV
aeXaKQjEsZiA/sc1V8TbHY66bzyvDay9DIXSVaYAhBrZV2Kkxrv7GCV/PrOeVLkN
2UR9i6rZrHvJyQA2UJqPzIEOYHI3hV0inJVyzsOOIJoOKEdnlaxktPb0mbeoeb7C
Kf/Pr2r3ToUFwjb2WKhVe+nJCKsL2b5TRptEiHJaxzhQDdg7kv3AsoqIO/X8PzUV
IOr5jG/2zyDKh8a2uLODXBSYEtMLTqw7709ZMntFY8Mh0tVdWI8ygTfre6gmPqij
chHEDj7fEUa4o/jKF+x5s0pWE8XpUaktucz45fOFl5SoOHbL8x25gaqEAfAhSax8
OsWETzvML0kCf/dcUZixb3MBkaTHdUZIozbjVmNtJJa4lqPxbxoQig==

解密加密后的文件

六、使用OpenSSL构建私有CA

    注:此处申请CA的服务器和CA主机是分别为两台CentOS 7主机

1.建立私有CA:
            Openssl
            OpenCA

    openssl命令配置文件: /etc/pki/tls/openssl.cnf

#这里只列出CA默认的经常用到的部分
[CA_default ]
dir        = /etc/pki/CA                   # Where everything is kept
certs        = $dir/certs                    # Where the issued certs are kept
crl_dir        = $dir/crl                    # Where the issued crl are kept
database    = $dir/index.txt        # database index file.
#unique_subject    = no                # Set to 'no' to allow creation of
                                                        # several ctificates with same subject.
new_certs_dir    = $dir/newcerts    # default place for new certs.
certificate    = $dir/cacert.pem      # The CA certificate
serial        = $dir/serial                   # The current serial number
crlnumber    = $dir/crlnumber       # the current crl number
                                                        # must be commented out to leave a V1 CRL
crl        = $dir/crl.pem                    # The current CRL
private_key    = $dir/private/cakey.pem  # The private key
RANDFILE    = $dir/private/.rand                 # private random number file


 2.构建私有CA:
        在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;

    步骤:

        (1) 生成私钥

[root@localhost ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
..........................................++
..................................................................................................................++
e is 65537 (0x10001)
[root@localhost ~]# ls -l /etc/pki/CA/private/cakey.pem   #查看文件权限确保不能被他人访问
-rw-------. 1 root root 3243 1月   5 01:57 /etc/pki/CA/private/cakey.pem

        (2)生成自签证书

[root@localhost ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
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]:Beijing
Organization Name (eg, company) [Default Company Ltd]:CTO
Organizational Unit Name (eg, section) []:technology
Common Name (eg, your name or your server's hostname) []:localhost
Email Address []:[email protected]

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

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

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

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

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

     (3)为CA提供目录和文件

 [root@localhost ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts} #创建CA所需要的目录
 [root@localhost ~]# touch /etc/pki/CA/{serial,index.txt} #创建CA需要的文件存储序列号和索引文件
 [root@localhost ~]# echo 01 > /etc/pki/CA/serial #将序列号定向输出至serial文件中

要用到证书进行安全通信的节点服务器,需要向CA请求签署证书(以httpd为例)

  步骤:
    (1) 用到证书的主机生成私钥,首先确保当前主机已经安装了httpd服务

[root@localhost ~]# rpm -q httpd #查看当前主机是否安装httpd服务
httpd-2.2.15-45.el6.centos.x86_64
[root@localhost ~]# cd /etc/httpd/
[root@localhost httpd]# mkdir ssl
[root@localhost httpd]# cd ssl/
[root@localhost ssl]# (umask 077; openssl genrsa -out httpd.key 2048) #生成私钥

    (2) 生成证书签署请求

[root@localhost 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  #填写申请签署的信息,此处务必和CA主机的信息一致
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:CTO
Organizational Unit Name (eg, section) []:technology
Common Name (eg, your name or your server's hostname) []:localhost #此处的主机名为服务器域名
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ssl]# ll #使用ll命令可以看到当前目录下生成了一个httpd.csr的文件
total 8
-rw-r--r-- 1 root root 1005 Jan  4 17:36 httpd.csr
-rw------- 1 root root 1675 Jan  4 17:35 httpd.key

    (3) 将请求通过可靠方式发送给CA主机

    使用scp命令将该文件传输至CA主机

    注:scp(Security  copy)是在Linux下进行远程拷贝文件的命令,基于ssh登录

[root@localhost ssl]# scp httpd.csr [email protected]:./ #为了方便此处将文件传输至当前目录
The authenticity of host '172.16.249.123 (172.16.249.123)' can't be established.
RSA key fingerprint is 75:3e:1f:63:a9:e0:ba:c1:2b:f9:f3:28:75:d7:26:0a.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '172.16.249.123' (RSA) to the list of known hosts.
[email protected]'s password: 
httpd.csr                                              100% 1005     1.0KB/s   00:00

    (4) 在CA主机上签署证书

[root@localhost ~]# openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.ctr -days 365
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  4 18:45:20 2016 GMT
            Not After : Jan  3 18:45:20 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Beijing
            organizationName          = CTO
            organizationalUnitName    = technology
            commonName                = localhost
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                B6:47:E9:94:5D:B0:4E:27:A4:C4:D6:F7:71:0C:E7:E5:69:34:92:F6
            X509v3 Authority Key Identifier: 
                keyid:24:52:08:3D:06:76:BB:96:83:91:2A:22:9C:4D:D8:FB:3B:36:BC:58
Certificate is to be certified until Jan  3 18:45:20 2017 GMT (365 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@localhost ~]# scp /etc/pki/CA/certs/httpd.ctr [email protected]:/etc/httpd/ssl/

    至此,CA证书签发完成。

3.吊销CA证书

    仅作测试使用,在真实的生产环境很少用到。

    (1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):
       ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject
    (2) CA主机吊销证书
      先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;  
      吊销:
       ~]# openssl  ca  -revoke  /etc/pki/CA/newcerts/SERIAL.pem          
             其中的SERIAL要换成证书真正的序列号;   

        示例       
    (3) 生成吊销证书的吊销编号(第一次吊销证书时执行)
             # echo  01  > /etc/pki/CA/crlnumber
    (4) 更新证书吊销列表
             # openssl  ca  -gencrl  -out  thisca.crl
          查看crl文件:
             # openssl  crl  -in  /PATH/FROM/CRL_FILE.crl  -noout  -text


    以上为签署私有CA及吊销CA的全过程,难免有不足之处,恳请大家多多指正。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章