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

1.png

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

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

1.png

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

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

1.png

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

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


SSL交互和握手过程


单向认证:


1.png


双向认证:

1.png


原理过程讲完了,那就开始实现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 #使用的策略。match为必须匹配,optional为可选,supplied需要 指定。可以参考pam章节

[ 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 /PATH/TO/SOMECERTFILE: 证书的保存路径

#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

下图为生成的证书信息

1.png

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 代表证书是有效的,R 是吊销状态

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