X.509是定义的一个公钥证书格式标准。 RFC 5280 详细描述公钥证书,包括它们的字段和扩展名。
X.509有三个版本,通过version字段可以区分,新的版本包含之前版本内容:
version 1
- version
- serial Number
- Signature Algorithm Identifier
- Issuer Name
- Validity Period
- Subject Name
- Public Key Information
version 2 新增
- Issuer Unique ID
- Subject Unique ID
version 3 新增
- Extensions
目前较多使用的v3版本证书。
证书中包含的涉及运算的两块数据
- 公钥信息:数据的加密,对于大数据量的传输 目前使用的一种方式先是加密一个对称密钥,使用对称密钥加密要传输的数据。
- 签名信息:证书签名验证
- 证书颁发结构对证书ASN.1 DER 编码后的证书进行hash值(算法在Sigature Algorithm被标识), 用其私钥进行加密,存放到证书签名信息中。
- 验证签名方使用颁发机构公钥解密,再使用同样方法运算hash, 与解密出来的hash及进行比较,判断是否是授信证书。其中颁发机构一般指CA,也可以是自签名。
当然如果涉及证书链, 签名验证方法类似, 通过证书链找到根证书然后一级一级验证即可
生成证书
验证过程中v2版本证书目前没有找到方式生成。
下面使用openssl生成。可以生成v1, v3版本证书, 可以看到主要在扩展项上的不同。
v1版本
# Generate a private key openssl genrsa -out ca-key.pem 2048 # Generate a certificate request for the CA openssl req -new -key ca-key.pem -out ca-req.pem -subj "/CN=MyCA" # Create the CA certificate openssl x509 -req -in ca-req.pem -signkey ca-key.pem -out ca-cert.pem -days 365
v3版本
# Generate a private key openssl genrsa -out ca-key.pem 2048 # Create a certificate signing request (CSR): openssl req -new -key private.key -out csr.pem # Create a configuration file cert.conf [req] distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [req_distinguished_name] CN = Your Common Name [v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = yourdomain.com #Create the certificate openssl x509 -req -in csr.pem -signkey private.key -out certificate.pem -days 365 -sha256 -extfile cert.cnf
可以使用下面指令查看证书
openssl x509 -text -noout -in certificate.pem
其他
国密证书不支持自签名方式。
参考及引用
https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-x-509-public-key-certificates
图片from羅興文
Comments are closed.