证书的概念及制作
证书基础知识
1. 概念
一般证书分有三类,根证书、服务器证书和客户端证书。
- 根证书:是生成服务器证书和客户端证书的基础,是信任的源头,也可以叫自签发证书,即CA证书。
- 服务器证书:由根证书签发,配置在服务器上的证书。
- 客户端证书:由根证书签发,配置在服务器上,并发送给客户,让客户安装在浏览器里的证书。
数字证书指的其实就是公钥证书(也可直接简称为证书)。在现代网络通讯中通行的公钥证书标准名为 X.509 v3, 由 RFC5280 定义。X.509 v3 格式被广泛应用在 TLS/SSL 等众多加密通讯协议中,它规定公钥证书应该包含如下内容:
- 证书
- 序列号(Serial Number): 用以识别每一张证书,在作废证书的时候会用到它
- 版本: 证书的规范版本
- 公钥(Public Key): 我们的核心目的就是分发公钥,因此显然要把公钥放在证书里面
- 公钥指纹: 即公钥的 Hash 值,当前大部分证书都使用 SHA256 计算此指纹
- 公钥用途(Key Usage + Extended Key Usage): 记录了此证书可用于哪些用途——数字签名、身份认证等
- 主体(Subject): 即姓名、组织、邮箱、地址等证书拥有者的个人信息。有了这个我们就能确认证书的拥有者了
- 证书有效期的开始时间、结束时间(Not Before + Not After): 为了确保安全性,每个证书都会记录一个自身的有效期,证书一旦签发并公开,随着科技的发展、时间的推移,其公钥的安全性会慢慢减弱,因此每个证书都应该包含一个合理的有效期,证书的拥有者应该在有效期截止前更换自身的证书以确保安全性
- 签发者(Issuer): 签发此证书的「签发者」信息
- 其他拓展信息
- 数字签名(Signature): 我们还需要对上面整个证书计算一个数字签名,来确保这些数据的真实性、完整性,确保证书未被恶意篡改/伪造,此数字签名由「证书签发者(Issuer)」使用其私钥+证书内容计算得出
- 数字签名算法(Signature Algorithm): 证书所使用的签名算法,常用的有 RSA-SHA-256 与 ECDSA-SHA-256
2. 环境
openssl一般的虚拟机是安装了的,可以使用如下命令查看系统是否安装了openssl
openssl version -a
OPENSSLDIR:"/etc/pki/tls" 目录下有配置文件openssl.cnf
openssl中有如下后缀名的文件
- .key格式:私有的密钥
- .csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
- .crt格式:证书文件,certificate的缩写
- .crl格式:证书吊销列表,Certificate Revocation List的缩写
- .pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
3. 生成证书
3.1 CA根证书生成的步骤
生成CA私钥(.key) –>生成CA证书请求(.csr) –>自签名得到根证书(.crt) (CA自己给自己颁发的证书)
# generate CA private key
openssl genrsa -out ca.key 4096
#Generate CSR
openssl req -new -key ca.key -out ca.csr
#Generate self signed certificate (CA 根证书)
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
3.2 用户证书的生成步骤
生成私钥(.key)–>生成证书请求(.csr)–>用CA根证书签名得到证书(.crt)
# 生成客户端私钥
openssl genrsa -out client.key 4096
# 生成客户端的证书请求 (生成证书请求的时候,可以加上 -config xxx.cnf 文件 在文件中定义好DN,然后避免重复输入)
openssl req -new -key client.key -out client.csr
# 用根证书签名得到证书
openssl ca -in server.csr -out server.crt -cert ../root/ca.crt -keyfile ../root/ca.key
3.3 格式转换
cat client.crt client.key> client.pem
//下面这些是在网上看的,不清楚是否能成功,未自行测试过
openssl x509 -in root.crt -out root.pem // crt转pem格式
openssl x509 -in mycert.crt -out mycert.pem -outform pe // crt转pem格式
openssl x509 -in root.crt -out root.cer -outform der // crt转cer格式
openssl pkcs12 -export -in root.crt -inkey root.key -out root.p12 -name root // crt转p12格式
3.4 验证CA证书
openssl verify -CAfile ca.pem client.pem
//查看证书信息
openssl x509 -in client.pem -noout -text
//打印证书序列号
openssl x509 -in client.pem -noout -serial
正常会输出 client.pem OK
注意:
-
生成证书的时候可能会找不到文件:
/etc/pki/CA/index.txt
echo 1 > /etc/pki/CA/serial
直接使用touch 命令生成两个文件即可 -
如果生成证书的时候报错:TXT_DB error number 2
修改/etc/pki/CA/index.txt.attr 文件,将unique_subject = yes改为: unique_subject = false
4.另一种证书制作方式
4.1 命令:
1)根证书
openssl genrsa -out ca.key 4096
openssl req -new -sha256 -out ca.csr -key ca.key -config ca.conf
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
2)服务端证书
openssl genrsa -out server.key 2048
openssl req -new -sha256 -out server.csr -key server.key -config server.conf
openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -extensions req_ext -extfile server.conf
3)客户端证书
openssl genrsa -out client.key 2048
openssl req -new -sha256 -out client.csr -key client.key -config server.conf
openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt -extensions req_ext -extfile server.conf