公开密钥基础建设(英语:Public Key Infrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。
密码学上,公开密钥基础建设借着数字证书认证机构(CA)将用户的个人身份跟公开密钥链接在一起。对每个证书中心用户的身份必须是唯一的。链接关系通过注册和发布过程创建,取决于担保级别,链接关系可能由CA的各种软件或在人为监督下完成。PKI的确定链接关系的这一角色称为注册管理中心(Registration Authority,RA)。RA确保公开密钥和个人身份链接,可以防抵赖。
OpenSSL的配置文件位置:/etc/pki/tls/openssl.cnf
以下是跟CA的相关部分,因此知道文件将创建在哪里。
[ CA_default ]
dir = /etc/pki/CA # 保存所有信息的目录
certs = $dir/certs # 保存证书的目录
crl_dir = $dir/crl # 保存证书吊销列表的目录
database = $dir/index.txt # 数据库索引文件
确保目录和文件已经创建
[root@localhost CA]# cd /etc/pki/CA
[root@localhost CA]# ls
certs crl newcerts private
[root@localhost CA]#
[root@localhost CA]# touch index.txt
[root@localhost CA]# echo 01 > serial
[root@localhost CA]# ls
certs crl index.txt newcerts private serial
如果您只是想做一张内网用的电子证书或不想花钱去找个 CA 签署,您可以造一张自签 (Self-signed)的电子证书。当然这类电子证书没有任何保证,浏览器遇到这证书会发出警告,甚至不接收这类证书。使用自签名(self-signed)的证书,它的主要目的不是防伪,而是使用户和系统之间能够进行SSL通信,保证密码等个人信息传输时的安全。
服务端生成CA私钥文件
[root@localhost CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
用生成的CA私钥文件生成CA自签证书
[root@localhost CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.epm -days 7300 -out /etc/pki/CA/cacert.pem
# 各参数的含义
# -new:生成新证书签署请求
# -x509:专用于CA生成自签证书,即自己充当CA认证自己
# -key:生成请求时用到的私钥文件路径
# -days n:证书的有效期限(天)
# -out /PATH/TO/SOMECERTFILE:证书的保存路径
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:w3iCA Ltd
Organizational Unit Name (eg, section) []:IT Dept
Common Name (eg, your name or your server's hostname) []:www.w3ica.com
Email Address []:[email protected]
客户端生成私钥文件
[root@localhost httpd]# mkdir -p /etc/httpd/ssl
[root@localhost httpd]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
客户端用私钥加密生成证书请求
[root@localhost httpd]# openssl req -new -key /etc/httpd/ssl/httpd.key -days 365 -out /etc/httpd/ssl/httpd.csr
CSR(Certificate Signing Request)包含了公钥和名字信息。通常以.csr为后缀,是网站向CA发起认证请求的文件,是中间文件。
在这一命令执行的过程中,系统会要求填写如下信息:
要求添写的内容 | |
---|---|
Country Name (2 letter code) | 使用国际标准组织(ISO)国码格式,填写2个字母的国家代号。中国请填写CN |
State or Province Name (full name) | 省份,比如填写BeiJing |
Locality Name (eg, city) | 城市,比如填写BeiJing |
Organization Name (eg, company) | 组织单位,比如填写公司名称的拼音 |
Organizational Unit Name (eg, section) | 比如填写IT Dept |
Common Name (eg, your websites domain name) | 城市,比如填写BeiJing |
Email Address | 邮件地址,可以不填 |
A challenge password | 可以不填 |
An optional company name | 可以不填 |
注意
行使 SSL 加密的网站地址。请注意这里并不是单指您的域名,而是直接使用 SSL 的网站名称 例如:www.abc.com。
一个网站这里定义是:
abc.com 是一个网站;
www.abc.com 是另外一个网站;
blog.abc.com 又是另外一个网站。
这里我的填写如下
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:w3i Ltd
Organizational Unit Name (eg, section) []:IT Dept
Common Name (eg, your name or your server's hostname) []:www.test.com
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
最后把生成的请求文件(/etc/httpd/ssl/httpd.csr)传输给CA
这里我使用scp命令,通过ssh协议,将该文件传输到CA下的/tmp/ssl目录
scp /etc/httpd/ssl/httpd.csr root@192.168.80.130:/tmp/ssl/
查看申请信息
# openssl req -noout -text -in /tmp/ssl/httpd.csr
在服务端CA上签署证书
[root@localhost CA]# openssl ca -in /tmp/ssl/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
证书通常以.crt为后缀,表示证书文件
可能遇到的问题
The organizationName field needed to be the same in the CA certificate and the request 因为默认使用/etc/pki/tls/openssl.cnf,里面要求其一致,修改organizationName=supplied
修改 /etc/pki/tls/openssl.cnf
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
查看生成的证书的信息的命令
# openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|-subject|-serial
[root@localhost CA]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -subject
subject= /C=CN/ST=BeiJing/O=w3i Ltd/OU=IT Dept/CN=www.test.com/emailAddress=admin@test.com
最后将生成的证书还给请求者客户端
[root@localhost CA]# scp /etc/pki/CA/certs/httpd.crt [email protected]:/tmp/
(1)知道客户端吊销的证书的serial
# openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
(2)先根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致;然后
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
(3)生成吊销证书的编号(第一次吊销一个证书时才需要执行)
# echo 01 > /etc/pki/CA/crlnumber
(4)更新证书吊销列表
# openssl ca -gencrl -out thisca.crl
查看证书吊销列表
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text