PKI 体系概述

公钥基础设施

公钥基础设施 PKI(Public Key Infrastructure)是通过使用公钥技术和数据证书来提供信息系统安全服务,并负责验证数字证书持有者身份的一种体系。PKI 基础设施采用证书管理公钥,通过第三方可信任认证中心,把用户的公钥和用户的身份信息捆绑在一起,它是具有通用性的安全基础设施,是一套服务体系。

PKI 的功能是通过答发数据证书来绑定证书持有者的身份和相关的公开密钥,为用户获取证书、访问证书和撤销证书提供方便的途径。同时利用数字证书及相关的各种服务(证书发布、黑名单发布等)实现通信过程中实体的身份认证,保证了通信数据的机密性、完整性、不可否认性和认证性。

PKI 体系架构

PKI 体系架构由证书申请者、注册机构RA、认证中心CA、证书撤销列表CRL组成。

  1. CA(Certification Authority):负责证书的颁发和吊销(Revoke),接收来自 RA 的请求,是最核心的部分。

  2. RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给 CA。

  3. 证书存储库:存放证书,多采用 X.500 系列标准格式。

常见的操作流程为,用户通过 RA 登记申请证书,提供身份和认证信息等;CA 审核后完成证书的制造,颁发给用户。用户如果需要撤销证书则需要再次向 CA 发出申请。

证书的签发

CA 对用户签发证书实际上是对某个用户公钥,使用 CA 的私钥对其进行签名,这样任何人都可以用 CA 的公钥对该证书进行合法性验证,验证成功则认可该证书中所提供的用户公钥内容,实现用户公钥的安全分发。

用户证书的签发可以有两种方式。一般可以由 CA 直接来生成证书(内含公钥)和对应的私钥发给用户;也可以由用户自己生成公钥和私钥,然后由 CA 来对公钥内容进行签名。

PKI实体向CA申请本地证书有以下两种方式:

  1. 在线申请。
  2. 离线申请。

证书的撤销

证书超出有效期后会作废,用户也可以主动向 CA 申请撤销某证书文件,由于 CA 无法强制收回已经颁发出去的数字证书,因此为了实现证书的作废,往往还需要维护一个撤销证书列表(Certificate Revocation List,CRL),用于记录已经撤销的证书序号。

因此,通常情况下,当第三方对某个证书进行验证时,需要首先检查该证书是否在撤销列表中。如果存在,则该证书无法通过验证。如果不在,则继续进行后续的证书验证过程。

EasyRsa 安装和证书生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 下载
curl -O https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.0/EasyRSA-3.1.0.tgz

# 解压
tar -xvf EasyRSA-3.1.0.tgz

# 配置easy-rsa
cd EasyRSA-3.1.0
cp vars.example vars

vim vars
#############################################
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "GuangDong"
set_var EASYRSA_REQ_CITY "GuangZhou"
set_var EASYRSA_REQ_ORG "zhongjin.io"
set_var EASYRSA_REQ_EMAIL "imaginefei@163.com"
set_var EASYRSA_REQ_OU "ZhongJin Home VPN"
#############################################

# 初始化pki
# easyrsa --vars=./vars --pki-dir=./pki init-pki
./easyrsa init-pki

# 生成CA
./easyrsa build-ca nopass

# 生成服务端证书
./easyrsa build-server-full server nopass

# 生成客户端证书
./easyrsa build-client-full client nopass

# 生成dh文件
./easyrsa gen-dh

Openvpn 服务端安装和配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 安装
apt install openvpn

# 生成ta.key文件(HMAC签名来加强服务器的TLS完整性验证能力)
openvpn --genkey --secret ta.key

# 将easyrsa生成的ca.crt、server.key、server.crt、dh.pem、ta.key复制到/etc/openvpn文件夹
cp pki/ca.crt /etc/openvpn
cp pki/private/server.key /etc/openvpn
cp pki/dh.pem /etc/openvpn/dh2048.pem
cp ta.key /etc/openvpn

# 配置openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gzip -d /etc/openvpn/server.conf.gz
vim /etc/openvpn/server.conf
#############################################
port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "route 192.168.31.0 255.255.255.0"
push "route 192.168.110.0 255.255.255.0"
push "dhcp-option DNS 10.8.0.1"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-CBC
comp-lzo
user vpn
group vpn
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 0
#############################################


# 开启端口转发
vim /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p

# 添加防火墙nat规则
iptables -t nat -A INPUT -s 10.8.0.0/24 -m comment --comment "允许openvpn网段" -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -m comment --comment "允许openvpn网段" -j MASQUERADE

# 启动openvpn
systemctl start openvpn@server.service
systemctl status openvpn@server.service
systemctl enable openvpn@server.service

# 查看ip
ip addr

Openvpn 客户端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 拿到easyrsa生成的ca.crt、client.key、client.crt、ta.key
# 配置客户端配置文件
vim client.ovpn
#############################################
client
dev tun
proto tcp
remote asus.zhongjin.io 12000
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert zhongjin.crt
key zhongjin.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3
#############################################

# 将配置文件和证书等拿到客户端中使用