上一篇章中我们讲了使用gpg和openssl加密公钥进行安全数据通讯的场景。可是,网络中总是有不怀好意的角色存在,别以为你以公钥加密了就是安全的,有没有想过,你得到的这个公钥是不是真正要跟你通讯的服务器公钥呢?万一被伪造了?那将会如下图,黑客能打开加密的文件,而真正的ServerB却无法解开密文。

更换SSL加密算法 ssl加密的过程_数据库

所以,就如现实生活中,大家都要确认某样东西的真实性的时候,找第三方权威机构,把各自己的信息交回权威机构进行验证后,再由权威机构公布各自需要的信息。

如下图,CA证书机构就是用来做这事的。

更换SSL加密算法 ssl加密的过程_配置文件_02

既然有了第三方的权威机构颁发的证书,那么通讯的过程也需要加密保护以便防止过程被窃取篡改。

大家都知道,HTTP 协议都是明文传输内容,在早期只展示静态内容时没有问题。伴随着互联网的快速发展,人们对于网络传输安全性的要求也越来越高,HTTPS 协议因此出现。如下图所示

更换SSL加密算法 ssl加密的过程_SSL_03

在 HTTPS协议中封装的加密方法其实是 SSL/TLS 协议。SSL/TLS 协议作用在 HTTP 协议之下,对于上层应用来说,原来的发送接收数据流程不变,这就很好地兼容了老的 HTTP 协议,这也是软件开发中分层实现的体现。

SSL/TLS 握手是为了安全地协商出一份对称加密的秘钥


SSL交互和握手过程


单向认证:


更换SSL加密算法 ssl加密的过程_更换SSL加密算法_04


双向认证:

更换SSL加密算法 ssl加密的过程_配置文件_05


原理过程讲完了,那就开始实现SSL/TLS


证书管理

名词:

PKI :Public Key Infrastructure

包含:

CA:证书颁发机构

RA:证书注册机构

CRL:证书吊销列表

证书存取库


创建私有CA


openssl的配置文件,/etc/pki/tls/openssl.cnf

找到[ ca ]设置,下面为主要选项说明。文件名是有指定要求的。

[ ca ]
default_ca      = CA_default # 默认CA使用哪套配置文件
[ CA_default ] #配置文件名,以下为该套配置的设定
dir             = /etc/pki/CA           # 目录
certs           = $dir/certs            # 签发证书存放位置
crl_dir         = $dir/crl              # 存放 crl(证书吊销列表)位置
database        = $dir/index.txt        # 数据库索引文件
#unique_subject = no                    # 是否允许被颁发者有重复的描述信息
new_certs_dir   = $dir/newcerts         # 新证书的默认位置,颁发证书的时候,会copy一份到这
certificate     = $dir/cacert.pem       # CA自签名证书文件
serial          = $dir/serial           # 存放下一个颁发证书的编号
crlnumber       = $dir/crlnumber        # 当前crl数量
crl             = $dir/crl.pem          # 证书吊销列表文件
private_key     = $dir/private/cakey.pem # CA自己的私钥
RANDFILE        = $dir/private/.rand    # 私钥随机数文件
x509_extensions = usr_cert # The extentions to add to the cert
name_opt        = ca_default # Subject Name options
cert_opt        = ca_default # Certificate field options
default_days    = 365 # 默认证书有效期
default_crl_days= 30 # 默认crl下一次公布间隔
default_md      = default # 默认使用的公钥算法,在[req]指定
preserve        = no # keep passed DN ordering
policy          = policy_match
[ policy_match ]
countryName             = match #国家
stateOrProvinceName     = match #省
organizationName        = match #组织名
organizationalUnitName  = optional #组织单位名
commonName              = supplied #证书颁发给哪个域名使用。非常重要
emailAddress            = optional #Email
[ req ]
default_bits            = 2048 #加密长度
default_md              = sha1 加密算法

1.创建所需要的文件

#cd /etc/pki/CA
生成证书索引数据库文件
#touch /etc/pki/CA/index.txt
指定第一个颁发证书的序列号
#echo 01 > /etc/pki/CA/serial


2.创建所需要的文件

生成私钥,如果不指定-des3 2048,在使用私钥时不会询问密码

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

3.生成签名证书

语法格式:

-new: 生成新证书签署请求
-x509: 专用于CA生成自签证书
-key: 生成请求时用到的私钥文件
-days n:证书的有效期限,以天为单位
-out
#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GUANGDONG
Locality Name (eg, city) [Default City]:shenzhen
Organization Name (eg, company) [Default Company Ltd]:NEO
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:ca.hunk.teh
Email Address []:hunk@hunk.teh
查看证书命令
#openssl x509 -in /etc/pki/CA/cacert.pem -noout -text   还有很多参数,可以输错命令将会列出


4.在客户端生成密钥文件

#(umask 066;openssl genrsa -out http.key -des3 2048)


5.在客户端生成证收请求文件

#openssl req -new -key http.key -out http.req   建议生成.req结尾的
查看请求文件命令
#openssl req -in http.req -noout -text
6.将客户端的请求文件传输至CA服务器
7.在CA服务器为指定请求文件生成证书
#openssl ca -in http.req -days 730 -out http.crt

下图为生成的证书信息

更换SSL加密算法 ssl加密的过程_配置文件_06

更换SSL加密算法 ssl加密的过程_数据库_07

8.将生成的证书传输给申请者


另外,当index.txt.attr文件内容unique_subject = yes时,

申请文件中的Subject相同时,将会报以下问题,唯一性检查

Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
如果后面报以下错误,请检查这里的设置
error creating name index:(2,0,1)

证书状态管理

#cat index.txt
V 200114153136Z 01 unknown
R 200114155454Z 180114162948Z 02
#openssl ca -status 01
Using configuration from /etc/pki/tls/openssl.cnf
01=Valid (V)

吊销证书
#openssl ca -revoke /etc/pki/CA/newcerts/02.pem

更新吊销列表
1.创建吊销证书的编号文件
#touch /etc/pki/CA/crlnumber
#echo 01 > /etc/pki/CA/crlnumber
2.更新证书吊销列表
#openssl ca -gencrl -out /etc/pki/CA/crl.pem