Openssl是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:

openssl: 多用途命令行工具,各功能分别使用子命令实现

libcrypto: 公共加密库

libssl: ssl协议的实现

加密的方式

在讲加密解密之前,我们先来了解下几种加密的方式:

1、对称加密:通信双方使用同一个密钥

比较常见的算法:  DES(56),3DES,AES(128,192,256,384,512),Blowfish,Twofish,IDEA,RC6,CAST5

特性:

1、加密、解密使用同一口令;

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

缺陷:

1、密钥过多;

2、密钥传输;

加密工具:gpg, openssl ,enc

格式:

# openssl enc -des3 -a -salt -in /path/from/somefile -out /path/to/somecipherfile# openssl enc -d -des3 -a -salt -in /path/from/somecipherfile -out /path/to/somefile

2公钥加密(也称为非对称加密):密钥成对出现

密钥:公钥public key,私钥 secret key

常用加密算法:RSA, DSA, EIGamal

用途:

身份认证:通过私钥加密发出,对方通过发送者的公钥进行解密,从而对发送者进行身份认证

密钥交换:通过接收者的公钥加密发出,对方通过自己的私钥解密。

 

 

3单向加密:是不可逆的

特点:

定长输出

雪崩效应

    

加密的算法:MD5SHA1SHA256SHA384SHA512

 

加密工具:md5sum, sha1sum, openssl dgst, chsum

格式

# openssl dgst [-md5|-sha1] [-out /path/to/filename] /path/from/somefile

加密和解密

OK,下面我们来讲解下加密和解密的过程,以BobAlice两人之间的通信为例:

 

 

加密过程

发送方即为Bob

1Bob用单向加密算法计算数据的特征码;

2Bob用自己的私钥加密这段特征码,并加在数据尾部;

3将数据和私钥加密的特征码打包使用对称加密成密文,生成一个对称密钥;

4使Alice的公钥加密这个对称密钥,附加在密文的尾部;

5、发送给Alice

 解密过程:

接收方即为Alice

1Alice用自己的私钥解密得到对称密钥

2使用对称密钥解密密文;

3使用Bob的公钥解密得到Bob对数据进行单向加密算法的特征码;(这一步实现了对Bob的身份验证)

4Alice使用同样的单向加密算法计算出数据的特征码;

5通过比较两段特征码验证Bob发过来的数据的完整性;    

大家看完之后可以很清楚看到,在这个过程中公钥起到了至关重要的作用,可是你有没有想过,公钥在网络上传输的时候,可信度得不到验证,而且很容易就会被劫持或伪装。那么我们怎么样才能确定是对方的公钥呢,所以这就急需有一个专门机构来确保公钥来源的合法性以及可靠性,没错他就是CA(证书颁发机构)。因此,想要完成安全的通信,拥有一个可靠的CA是必不可少的,下面我们就来实现一下一个私有CA的建立过程。

openssl建立私有CA

使用openssl建立私有CA需要经过以下几个步骤

CA服务器

1、生成密钥

2、自签署证书

节点:

1、生成密钥对儿

2、生成证书签署请求

3、把请求发送给CA

CA

1、验正请求者信息;

2、签署证书;

3、把签好的证书发送给请求者;

  

一、建立CA服务器:

1、生成密钥

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

这里设置umask是为了修改生成密钥的权限的,下同

这里的2048是证书的长度。

 

2、自签证书

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

req: 生成证书签署请求

-news: 新请求

-key /path/to/keyfile: 指定私钥文件

-out /path/to/somefile: 

-x509: 生成自签署证书,只有服务器才会用这个选项

-days n: 有效天数

 

3、初始化工作环境

由于有几个文件是必要的,所以我们还得手动创建,并且还要向证书的序列文件serial给定初始值

# touch /etc/pki/CA/{index.txt,serial}# echo 01 > /etc/pki/CA/serial

 

这样我们的一个CA服务器就建好了。

二、节点申请证书:

 

(一节点生成请求

1、生成密钥对儿

这里节点生成密钥对跟服务器没什么区别,这里我将生成的密钥放在/etc/httpd/ssl/httpd.key中,这里的ssl目录是我事先创建的。

# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)

 

2、生成证书签署请求

# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr

需要注意的是一般生成的证书请求的文件后缀名为.csr

 

需要注意的是下面这几样必须跟CA服务器上的信息完全一样,不然CA将不给于签署

 

下面这一项用户名或者服务器名称尤其关键,如果这是一台服务器的话,那么名字必须是服务器的主机名。

 

最后信息填完还可以对其进行密码设定,你也可以直接按回车键不用密码,这里我就忽略了密码,直接回车过去了。

 

3、把签署请求文件发送给CA服务

证书请求做好之后当然就是将其发送给CA签署了,当然方式很多,我们这里使用了SCP这个命令, scp是有Security的文件copy,基于ssh登录。可以实现远程的数据拷贝功能,即能把文件从本地传向目的端,也可以从远程主机中拷贝数据到本地,这里我们就不详细叙述该命令的用法了,如需知道其详细用法建议参考http://blog.csdn.net/jiangkai_nju/article/details/7338177

由于我使用的节点和CA服务器是同一台虚拟机,所以这里我就不需要将请求发给CA服务起了,但为了如果不在同一主机的话就需要将文件发送给远程主机了。

这里我们就假设将做好的请求文件发往172.16.106.1主机的/etc/httpd目录下

# scp /etc/httpd/ssl/httpd.csr 172.16.106.1:/etc/httpd

 

(二) CA签署证书

当收到节点的证书请求时,CA服务器就可以对其进行签署了。签署的过程又分为以下步骤:

1、验正证书中的信息;

2、签署证书

# openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days N

 

CA签署证书的时候可以看到请求者发送的请求中的信息,当然CA如果觉得不行也可以直接拒绝。

这样一份证书请求就签好了,当然签署成功以后我们的证书序列号将会改变,我们不妨来查看下/etc/pki/CA/serial,其初始值为1,如果没错的话他现在应该会是2.同时index.txt文件中也会生成相应的数据,并且每发出一份证书都会在/etc/pki/CA/newcerts/生成一个文件记录。

3、发送给请求者;

这里我们还是使用scp命令进行发送

其格式为:

假设传给远程主机为172.16.200.1/etc/httpd目录下

#scp /etc/httpd/ssl/httpd.crt  172.16.200.1:/etc/httpd

这样一份完整的证书就做好并且可以使用了。

三、吊销证书

 

(一)节点

1、获取证书serial

# openssl x509 -in /path/to/certificate_file.crt -noout -serial -subject

 

这里指定noout为不输出为文件

Serial为序列号

Subject为主体信息

() CA

2、根据节点提交的serialsubject信息来验正与index.txt文件中的信息是否一致;

3、吊销证书(作废证书)

一般由于用户私钥泄露等情况才需要吊销一个未过期的证书。

# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

需要指出是这里的SERIAL即为想要吊销的证书序列号

如果想吊销01序列号的证书则为

# openssl ca -revoke /etc/pki/CA/newcerts/01.pem

4、生成吊销证书的编号(如果是第一次吊销)

#touch  /etc/pki/CA/crlnumber# echo 00 > /etc/pki/CA/crlnumber

 

5、更新证书吊销列表

# cd /etc/pki/CA/crl/# openssl ca -gencrl -out output.crl   生成证书吊销列表,这里输出的名称可以自己随便取

 

如果需要,查看crl文件的内容:

# openssl crl -in /path/to/crlfile.crl -noout -text