上一篇章中我们讲了使用gpg和openssl加密公钥进行安全数据通讯的场景。可是,网络中总是有不怀好意的角色存在,别以为你以公钥加密了就是安全的,有没有想过,你得到的这个公钥是不是真正要跟你通讯的服务器公钥呢?万一被伪造了?那将会如下图,黑客能打开加密的文件,而真正的ServerB却无法解开密文。
所以,就如现实生活中,大家都要确认某样东西的真实性的时候,找第三方权威机构,把各自己的信息交回权威机构进行验证后,再由权威机构公布各自需要的信息。
如下图,CA证书机构就是用来做这事的。
既然有了第三方的权威机构颁发的证书,那么通讯的过程也需要加密保护以便防止过程被窃取篡改。
大家都知道,HTTP 协议都是明文传输内容,在早期只展示静态内容时没有问题。伴随着互联网的快速发展,人们对于网络传输安全性的要求也越来越高,HTTPS 协议因此出现。如下图所示
在 HTTPS协议中封装的加密方法其实是 SSL/TLS 协议。SSL/TLS 协议作用在 HTTP 协议之下,对于上层应用来说,原来的发送接收数据流程不变,这就很好地兼容了老的 HTTP 协议,这也是软件开发中分层实现的体现。
SSL/TLS 握手是为了安全地协商出一份对称加密的秘钥
SSL交互和握手过程
单向认证:
双向认证:
原理过程讲完了,那就开始实现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
下图为生成的证书信息
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