PKI:Public Key Infrastructure
公钥基础设施:
- 签证机构:CA(Certificate Authority)
- 注册机构:RA
- 证书吊销列表:CRL
- 证书存取库:
X.509v3:
定义了证书的结构以及认证协议标准
- 版本号
- 序列号
- 签名算法ID
- 发行者名称
- 有效期限
- 主体名称
- 主体公钥
- 发行者的唯一标识
- 主体的唯一标识
- 扩展
- 发行者的签名
证书获取
证书类型:
- 证书授权机构的证书
- 服务器
- 用户证书
获取证书的两种方法:
- 使用证书授权机构
生成签名请求(csr)
将 csr 发送给 CA
从 CA 处接收签名 - 自签名的证书
自己签发自己的公钥
安全协议
SSL:Secure Socket Layer
- TLS:Transport Layer Security
1995:SSL 2.0 Netscape
1996:SSL 3.0
1999:TLS 1.0
2006:TLS 1.1 IETF(Internet工程任务组)RFC 4346
2008:TLS 1.2
2015:TLS 1.3 - 功能:机密性,认证,完整性,重放保护
两阶段协议,分为握手阶段和应用阶段
- 握手阶段(协商阶段):客户端和服务端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成
- 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
SSL/TLS

SSL/TLS协议.jpg
- Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
- ChangeCipherSpec协议:一条消息表明握手协议已经完成
- Alert协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接终端SSL连接,而warning级别的错误SSL连接仍可继续,只是会给出错误警告
- Record协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
- HTTPS协议:就是 "HTTP协议" 和 "SSL/TLS协议" 的组合。"HTTP over SSL" 或 "HTTP over TLS",对 http 协议的文本数据进行加密处理后,成为二进制形式传输
OpenSSL
OpenSSL:开源项目
三个组件:
- openssl:多用途的命令行工具,包openssl
- libcrypto:加密算法库,包openssl-libs
- libssl:加密模块应用库,实现了ssl及tls,包nss
openssl命令:
- 两种运行模式:交互模式和批处理模式
- openssl version:程序版本号
- 标准命令、消息摘要命令、加密命令
- 标准命令:enc,ca,req,...
对称加密:
- 工具:
openssl enc,gpg - 算法:3des,aes,blowfish,twofish
enc命令:
- 帮助:
man enc - 加密:
~]# openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher - 解密:
~]# openssl enc -d -des3 -a -salt -in testfile.cipher -out -testfile
单向加密:
- 工具:
-
md5sum,sha1sum,sha224sum... openssl dgst
-
- dgst命令:
帮助:man dgst
openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
openssl dgst -md5 testfile
md5sum /PATH/TO/SOMEFILE - MAC:Message Authentication Code,单向加密的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制
CBC-MAC
HMAC:使用md5或sha1算法
生成用户密码:
- passwd命令:
帮助:man sslpasswd
openssl passwd -1 -salt SALT(最多8位)
openssl passwd -1 -salt centos
生成随机数:
帮助:man sslrand
openssl rand -base64|-hex NUM
NUM:表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出现的字符数位NUM*2
生成密钥对儿:
man genrsa
- 生成私钥
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
~]# (umask 077;openssl genrsa -out test.key -des 2048) - 将加密key解密:
openssl rsa -in test.key -out test2.key - 从私钥中提取出公钥
openssl rsa -in PRIVATEKEYFILE -pubout -out PUBLICKEYFILE
~]# openssl rsa -in test.key -pubout -out test.key.pub - 随机数生成器:伪随机数字
键盘和鼠标,块设备中断
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
CA:
公共信任的CA,私有CA;
建立私有CA的方法:
- openssl
- OpenCA
用openssl命令建立私有CA:
配置文件:/etc/pki/tls/openssl.cnf
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions = crl_ext
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha256 # use SHA-256 by default
preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
# For the CA policy
-
构建私有CA:
在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录即文件即可;
步骤:- 生成私钥:
~]# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) - 生成自签证书:
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
-new:生成新证书签署请求;
-x509:生成自签格式证书,专用于创建私有CA时;
-key:生成请求时用到的私钥文件路径;
-out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
-days:证书的有效时长,单位是day; - 以文本方式查看证书信息
~]# openssl x509 -in cacert.pem -noout -text - 为CA提供所需的目录即文件:
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
- 生成私钥:
要用到证书进行安全通信的服务器,需要向CA请求签署证书:
申请证书:
步骤(以httpd为例):
- 在请求的主机上生成私钥:
[root@node1 ~]# mkdir /etc/httpd/ssl [root@node1 ~]# cd /etc/httpd/ssl [root@node1 ~]# (umask 077;openssl genrsa -out httpd.key 2048) - 在请求的主机上生成证书签署请求:
[root@node1 ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365 - 将请求通过可靠方式发送给CA主机
- 在CA主机上签署证书:
[root@node1 ~]# openssl ca -in /tmp/httpd.csr -out/etc/pki/CA/certs/httpd.crt -days 365 - 查看证书信息:
~]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
吊销证书:
步骤:
- 客户端获取要吊销的证书的serial(在使用证书的主机上执行):
~]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject - CA端主机吊销证书:
先根据客户提交的serial和subject信息,对比其与本机数据库(index.txt)中存储的是否一致;
吊销:
~]# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
注意:其中的SERIAL要换成证书真正的序列号; - 生成吊销证书的吊销编号(第一次吊销证书时执行):
~]# echo 01 > /etc/pki/CA/crlnumber - 更新证书吊销列表:
~]# openssl ca -gencrl -out thisca.crl - 查看crl文件:
~]# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text