前言
一般,我们提供https网站服务需要购买 CA
机构签发的证书。但在某些情况下,例如:保护企业 Intranet
类网站的安全,我们就可以创建自己的 CA
,自签发免费的证书,往往比付费证书更有意义!
Linux
环境下我们可以利用 OpenSSL
来实现免费证书的签发。在签发免费证书之前我们需要了解一些公钥密码学的常识。
一、公钥密码学
1、公钥密码学

PKI
是一个安全体系,它利用公钥密码学技术来管理和分发数字证书,以验证通信实体的身份。PKIX
是 PKI
的一个具体实现标准,它定义了 PKI
体系结构的模型和操作协议。PKCS则为公钥密码学的应用提供了具体的标准和实现方式。它们相互协作,共同确保网络通信的安全性和可靠性。
个人理解,就是 PKIX
在 X.509
公钥证书标准的基础上,定义了PKI
应该具备哪些基础组件、及组件间的操作协议,使得 PKI
系统的构建和管理更标准和规范。在各组件构建与管理中,PKCS
则为涉及到的密钥管理、加密算法、证书管理等提供了具体的标准和接口等。
2、平时最常见的各种文件拓展名:
PEM
:DER
编码的二进制数据再以 Base64
编码。
CRT
– certificate
的缩写,linux
系统中比较常见,可能是PEM
编码,也可能是 DER
编码,但大多数应该是 PEM
编码。
CER
– certificate
的缩写,常见于Windows
系统,同样的,可能是 PEM
编码,也可能是 DER
编码,但大多数应该是 DER
编码。
DER
:以二进制编码格式保存证书,不包含私钥。这些证书也可以用 CER
或者 CRT
作为扩展名KEY
– 通常用来存放一个公钥或者私钥,并非 X.509
证书,编码同样的,可能是 PEM
,也可能是 DER
。
JKS
:Java
的密钥存储文件,二进制格式,是一种 Java
特定的密钥文件格式, JKS
的密钥库和私钥可以用不同的密码进行保护。
CSR
– Certificate Signing Request
,即证书签名请求,不是证书,而是向 CA
获得签名证书的申请文件PFX/P12
PKCS#12
通过 DER
编码实现,以二进制格式保存证书,可以包含私钥,也可以不包含私钥。如果包含私钥那么通常会加密。
总结一下:
- 常见证书三种编码格式:
DER
、PEM
、PKCS#12
-
常见证书文件扩展名:
CRT
、CER
、DER
- 公钥和私钥文件扩展名:
KEY
、JKS
- 包含证书和私钥文件扩展名:
PFX/P12
- 证书签名请求文件扩展名:
CSR
3、思考了几个傻傻的问题
梳理完上面一堆个概念还是一直懵懵懂懂,于是思考了几个傻傻的问题?
- 数字证书是不是都是公钥证书,有私钥证书吗?
私钥证书并不是常见的表述,通常在公钥密码学中,我们谈及的是公钥证书,而不是私钥证书。私钥不应该被公开或包含在证书中,因为它是保持通信和交易安全性的关键。
- 证书和密钥为什么要使用
ASN.1
描述?
私ASN.1
提供了描述数据结构的能力,跨平台,统一的编解码,高效传输。
- 证书和密钥为什么要使用
ASN.1
的编码规则进行编码?
个人理解使用了ASN.1
定义了证书和密钥数据结构,使用 ASN.1
提供的编码规则进行编码,不需要考虑兼容性。而且通过 ASN.1
统一编码,通过定义的编码规则,变相约定了证书和秘钥的内容格式,使得证书和密钥更容易被管理。
二、浏览器的如何验证SSL/TLS证书SAN的
其他的不谈,我们只关心浏览器是如何匹配证书中的 Subject Alternative Name
字段的,有三种方法:
- 在地址栏中的主机名与证书主题
Subject
中的Common Name
完全匹配。 - 主机名与通配符
Common Name
相匹配。例如:www.example.com
匹配* .example.com
。 - 主机名在
Subject Alternative Name
字段中列出
三、OpenSSL签发证书
使用 openssl req
工具时,不指定 -config
选项时,默认使用 /etc/pki/tls/openssl.cnf
;
1、生成自签名的CA证书
一条命令生成CA的私钥文件 CA.key
和证书文件CA.crt
#nodes 私钥不加密
#days 证书有效期 10年是一个合理的时间
#v3_req v3_ca 参考openssl.cnf
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj "/C=CN/ST=HB/L=SJZ/O=lbaxe" -keyout CA.key -out CA.crt -reqexts v3_req -extensions v3_ca
当然也可以分步
#1.生成私钥 CA.key
openssl genrsa -out CA.key 2048
#2.生成csr请求文件 CA.csr
openssl req -new -key CA.key -subj "/C=CN/ST=HB/L=SJZ/O=lbaxe" -sha256 -out CA.csr
#3.生成CA自签名证书 CA.crt
openssl x509 -req -days 3650 -in CA.csr -signkey CA.key -out CA.crt
2、签发SSL证书
准备服务器 192.168.0.100
的私钥文件 server.key
openssl genrsa -out server.key 2048
生成证书请求文件 server.csr
# 公用名称 (Common Name) 简称CN SSL 证书,一般为网站域名或ip;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名
# O 字段,SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称
openssl req -new -key server.key -subj "/C=CN/ST=HB/L=SJZ/O=lbaxe/CN=192.168.0.100" -sha256 -out server.csr
准备服务器 192.168.0.100
的证书扩展文件 server.ext
,subjectAltName
填写多个ip(需包含证书请求CN),可以多个服务器共用扩展文件
[ req ]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
x509_extensions = SAN
[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = Definesys
localityName = Definesys
organizationName = Definesys
[ SAN ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment,dataEncipherment
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 192.168.0.100
IP.2 = 192.168.0.101
使用CA证书签发服务器证书 server.crt
openssl x509 -req -days 365 -in server.csr -CA CA.crt -CAkey CA.key -CAcreateserial -sha256 -out server.crt -extfile server.ext -extensions SAN
※参考数据与延伸阅读
- https://www.digicert.com/faq/public-trust-and-certificates/what-is-a-multi-domain-san-certificate。
- https://jamielinux.com/docs/openssl-certificate-authority/index.html。