红联Linux门户
Linux帮助

加密、解密,以及OpenSSL建立私有CA

发布时间:2015-04-28 09:59:50来源:linux网站作者:wuday

一、常见算法

常见的加密算法和协议有对称加密,非对称加密,单向加密

1、对称加密:加密和解密使用一个密钥;依赖于算法和密钥,算法是可以公开的,密钥是不能公共的,因为加密是依赖于密钥的。安全性依赖于密钥,而非算法;

常见算法:

DES(Data Encryption Standard,56bits)、3DES、AES(Advanced EncryptionStandard)、Blowfish、Towfisk、IDEA、RC6、CASTS

特性:

1、加密、解密使用同一密钥

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

缺陷:

1、密钥过多;

2、密钥分发;

2、非对称加密:公钥加密

密码对儿:私钥(secret key)和公钥(public key);私钥仅允许个人使用;公钥是公开给所有获取;

公钥和私钥不是在创建时就成对出现的,而公钥是从私钥中提取出而来;创建时只需要创建私钥,从私钥中使用某种工具,把公钥从私钥中提取出来就可以了。

工作特性:使用公钥加密的数据,只能使用与此公钥配对儿的私钥解密,反之亦然。

用处:

1、身份认证:私钥拥有者用自己的私钥加密的数据,只要用其公钥解密,即可认证其身份;私钥加密不能保证数据的安全性,只有用于身份认证;

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

3、数据加密:

为什么不用非对称加密来加密数据呢?因为非对称加密数据比起对称加密要慢上10^3倍,都是用对称加密来加密数据,在用非对称加密来加密对称加密的密钥。

常用算法:

RSA、DSA、ELGamal

特性:

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

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

3、常用于数字签名和密钥交换;

3、单向加密

提出数据的特征码;每一个数据的都一个唯一的特性码,严重的依赖于算法。

特性:

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

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

3、不可逆;

算法:

MD5、SHA1、SHA256、SHA384、SHA512

单向加密已经被运行到CentOS操作系统中的用户名密码加密/etc/shadow文件中,其中CentOS 5运行的MD5,CentOS 6运行的SHA512。

用处:数据完整性


二、加密解密通信过程
加密、解密,以及OpenSSL建立私有CA

加密、解密,以及OpenSSL建立私有CA


三、数字证书的格式(x.509 v3):
加密、解密,以及OpenSSL建立私有CA

版本号(version)

序列号(serial number):是一个整数,CA使用唯一标识此证书的号码;

签名算法标志(Signature algorithmidentifier):它是一个带参数的,用于给证书签名本身说明,主要是让用户验证证书是可靠的

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

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

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

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

发行商的唯一标识:(可选)

证书主体的唯一标识:(可选)证书拥有者自己的数字标识

扩展信息:

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


四、https
加密、解密,以及OpenSSL建立私有CA

客户端和服务端进行通信时要进行三次握手,ssl也是基于TCP来实现的,在进行三次握手之后客户端向服务端要证书,服务端把证书给客户端,此时客户端拿到证书进行验证,先用本地存的根证书找看哪个CA给证书签的证,于是在本地找CA的证书,如果本地有说明我们信任此证书,接着用CA去解密证书中的数字签名,能解密说明此证书是CA发的,解密的结果是特征码,然后在用同样的单向加密算法去计算证书的特征码,并比较,比较之后发现结果相同,说明证书可靠,否则证书不可靠;在验证访问的域名(FQDN)必须与证书中的主体保持一致,否则客户端会认为拿的不是服务端的证书,在验证有效期等;

如果以上都是合法的,在从证书中提取对方的公钥信息,并且双方开始建立协商,双方使用哪种对称加密算法,使用哪种单向加密算法,使用哪种公钥加密算法;而后客户端生成一个临时加密密钥,并使用对方的公钥加密之后发送给服务端,于是服务器就已经拿到客户端访问请求的页面,把页面使用对称加密后发送给客户端,客户端拥有私钥解密就能在浏览器中显示;
加密、解密,以及OpenSSL建立私有CA

注:以上图片上传到红联Linux系统教程频道中。

第一步:验证证书主体、有效期、有没有在证书吊销列表中等;

第二步:从证书中提取对方的公钥信息;

第三步:生成对称加密的密钥,使用对方的公钥加密密钥,传送给服务端;

第四步:服务端使用私钥解密密文;

第五步:使用对称加密密钥加密客户端请求页面,发送给客户端;

第六步:客户端使用对称加密密钥解密请求页面,并在浏览器显示页面;


五、使用OpenSSL构建私有CA
CA和申请证书都在同一台机器上进行的。
1、CA端操作流程
操作步骤:
1、生成私钥文件;      
2、生成自签署证书;        
3、相关辅助文件
touch/etc/pki/CA/index.txt
echo01 > /etc/pki/CA/serial
再次说明:
(1)私钥用于签发证书时,向证书添加数字签名使用;
(2)证书:每个通信方都导入此证书至“受信任的证书颁发机构”;
1)、配置文件
  /etc/pki/tls/openssl.cnf,此文件格式为INI格式的
………省略……………
[ ca ]
default_ca      =CA_default        # The default casection

[ CA_default ]  #定义Openssl做为CA时自己的相关路径
 
dir            =/etc/pki/CA # Where everythingis kept  #指明CA自己的工作目录
certs          =$dir/certs  # Where the issuedcerts are kept #已颁发证书的存取位置
crl_dir        =$dir/crl    # Where the issuedcrl are kept #已吊销证书的吊销链表存取位置
database        =$dir/index.txt  # database indexfile.  #证书索引文件
#unique_subject = no          # Set to 'no' to allowcreation of
#several ctificates with same subject.
new_certs_dir  =$dir/newcerts    # default place fornew certs.  #新证书的存放位置
    
certificate    =$dir/cacert.pem  # The CAcertificate    #指CA自己证书文件名
serial          =$dir/serial  # The currentserial number #序列号,下一个要发的证书的序列号,每签一个序列号会怎么加1
crlnumber      =$dir/crlnumber  # the current crlnumber  #吊销证书列表的编号
# mustbe commented out to leave a V1 CRL
crl            =$dir/crl.pem # The current CRL  #当前正在使用的吊销链
private_key    =$dir/private/cakey.pem# The private key  #CA自己的私钥文件
RANDFILE        =$dir/private/.rand # private randomnumber file #随机数的获取位置
 
x509_extensions = usr_cert        # The extentions to add to thecert #定义了x.509的扩展信息中记录为“用户证书”
 
…………省略……………………

2)、工作目录
/etc/pki/CA/
注意:CentOS要想构建CA必须是基于/etc/pki/CA目录进行
[root@node-2 ~]# cd /etc/pki/CA
[root@node-2 CA]# ll
total 16
drwxr-xr-x  2 root root4096 Oct 15  2014 certs        #证书文件存放位置,
drwxr-xr-x  2 root root4096 Oct 15  2014 crl          #证书吊销列表存取文件
drwxr-xr-x. 2 root root 4096 Oct 15  2014 newcerts      #新创建证书存取位置
drwx------. 2 root root 4096 Oct 15  2014 private        #CA自己私钥存储位置

3)、创建CA自己的私钥
[root@node-2 CA]# pwd
/etc/pki/CA
[root@node-2 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit longmodulus
........................................................+++
..............+++
e is 65537 (0x10001)
[root@node-2 CA]# ll ./private/
total 4
-rw------- 1 root root 1675 Apr 22 22:23cakey.pem

4)、生成一个自签署证书
此自签署证书在/etc/pki/tls/openssl.cnf文件中定义必须放在CA目录下叫cacert.pem;从私钥中提取公钥,并构建成证书签署请求,然后让CA给签署;
格式:openssl req -new -x509-key  /etc/pki/CA/private/cakey.pem -out/etc/pki/CA/cacert.pem -days #
-x509:表示自签署证书,不加表示证书签署请求;
-key:从那个私钥中自动提取出公钥,并创建一个证书签署请求;
-days:指明给自己签署证书的有效期
12345678910111213141516171819202122 [root@node-2 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days3360
You are about to be asked to enterinformation that will be incorporated
into your certificate request.
What you are about to enter is what is calleda Distinguished Name or a DN.
There are quite a few fields but you canleave some blank
For some fields there will be a defaultvalue,
If you enter '.', the field will be leftblank.
-----
Country Name (2 letter code) [XX]:CN            #国家代码,必须使用两位数字来描述
State or Province Name (full name) []:HA          #省名或州名
Locality Name (eg, city) [Default City]:ZZ          #城市名
Organization Name (eg, company) [DefaultCompany Ltd]:MagEdu  #组织名或公司名
Organizational Unit Name (eg, section)[]:Ops    #部门
Common Name (eg, your name or your server'shostname) []:www.magedu.com  #此项很重要,证书主题自己的名字,别人和你通信是就使用此名字来联系你,而后你证书中的名字和通信时所使用名字必须要保持一致;否则就认为证书验证无法通过;
Email Address []:caadmin@magedu.com                    #主机的联系人
[root@node-2 CA]# ll
total 20
-rw-r--r--  1 root root 1395 Apr 22 22:40 cacert.pem
drwxr-xr-x  2 root root4096 Oct 15  2014 certs
drwxr-xr-x  2 root root4096 Oct 15  2014 crl
drwxr-xr-x. 2 root root 4096 Oct 15  2014 newcerts
drwx------. 2 root root 4096 Apr 22 22:23 private

注意:构建Ca是给通信方签发证书的

5)、生成相关的辅助文件
[root@node-2 ~]# cd /etc/pki/CA/
[root@node-2 CA]# ls
cacert.pem certs  crl  newcerts private
[root@node-2 CA]# touch index.txt
[root@node-2 CA]# echo 01 > serial
[root@node-2 CA]# cat serial
01

2、给节点发证书
操作步骤:
1、节点申请证书
在证书申请的主机上进行如下步骤;
(1)生成私钥
(2)生成证书签署请求;              
(3)把请求发送给CA;
2、CA签发证书
(1)验证请求者信息
(2)签署证书
(3)把签署好的证书发还给请求者
1)、以http目录为示例,本机给本地签署证书:
123 [root@node-2 ~]# cd /etc/httpd/
[root@node-2 httpd]# mkdir ssl
[root@node-2 httpd]# cd ssl/

2)、生成节点私钥:
12345678 [root@node-2 ssl]# (umask 077; openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit longmodulus
....................++++++
......++++++
e is 65537 (0x10001)
[root@node-2 ssl]# ll
total 4
-rw------- 1 root root 891 Apr 23 08:19httpd.key
 
3)、生成签署证书请求:
[root@node-2 ssl]# openssl  req -new -key httpd.key-out httpd.csr
You are about to be asked to enterinformation that will be incorporated
into your certificate request.
What you are about to enter is what is calleda Distinguished Name or a DN.
There are quite a few fields but you canleave some blank
For some fields there will be a defaultvalue,
If you enter '.', the field will be leftblank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [DefaultCompany Ltd]:MagEdu
Organizational Unit Name (eg, section)[]:Ops
Common Name (eg, your name or your server'shostname) []:www.zh.com  #此名称要和证书申请者的FQDN的保持一致
Email Address []:webadmin@zh.com
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@node-2 ssl]# ls
httpd.csr httpd.key
#提示:以上的国家、省名、城市名要和CA的保持一致
3、CA签署证书
[root@node-2 ssl]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt-days 3360
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:Apr 23 00:30:38 2015 GMT
Not After :Jul  4 00:30:38 2024 GMT
Subject:
countryName          = CN
stateOrProvinceName      = HA
organizationName        = MagEdu
organizationalUnitName      = Ops
commonName            =www.zh.com
emailAddress          =webadmin@zh.com
X509v3 extensions:
X509v3 BasicConstraints:
CA:FALSE
NetscapeComment:
OpenSSLGenerated Certificate
X509v3 SubjectKey Identifier:
C9:1A:C2:19:08:28:FF:1F:B4:85:90:32:00:E1:5B:E8:FF:6E:7E:95
X509v3Authority Key Identifier:
keyid:66:1E:36:DB:E7:40:30:ED:B1:04:24:86:11:08:73:0C:DF:5E:DD:52
 
Certificate is to be certified until Jul  4 00:30:38 2024 GMT (3360 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

操作过程遇到以下问题1:
[root@node-2 ssl]# openssl ca -in/etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3360
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/index.txt:No such file or directory  #没有/etc/pki/CA/index.txt文件
unable to open '/etc/pki/CA/index.txt'
139960522676040:error:02001002:systemlibrary:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/index.txt','r')
139960522676040:error:20074002:BIOroutines:FILE_CTRL:system lib:bss_file.c:400:
操作过程遇到以下问题2:
[root@node-2 CA]# openssl ca -in/etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3360
Using configuration from/etc/pki/tls/openssl.cnf
/etc/pki/CA/serial:No such file or directory      #没有/etc/pki/CA/serial文件
error while loading serial number
140170056320840:error:02001002:systemlibrary:fopen:No such file ordirectory:bss_file.c:398:fopen('/etc/pki/CA/serial','r')
140170056320840:error:20074002:BIOroutines:FILE_CTRL:system lib:bss_file.c:400:
4、查看节点所生成的文件:
[root@node-2 ~]# cd /etc/httpd/ssl/
[root@node-2 ssl]# ll
total 8
-rw-r--r-- 1 root root  0 Apr 23 19:47 httpd.crt      #证书文件
-rw-r--r-- 1 root root 676 Apr 23 08:22  httpd.csr      #证书请求文件
-rw------- 1 root root 891 Apr 23 08:19  httpd.key      #私钥文件