在 X509 标准中,规定了证书包含的信息,同时说明了记录信息的方法,也就是详细的证书格式。
这里详细介绍其基本概念。
简介
一个 X509 证书主要包含三部分:A) 用户的信息;B) 用户的公钥;C) CA 对该证书信息的签名。标准的数字证书格式如下,详细可以参考 RFC2459 中的介绍。
+-------------------------------+----------
| Version | | | | <-- 版本号
+-------------------------------+ | | |
| Certificate Serial Number | V V V <-- 证书序列号,也可以指定
+-------------------------------+ E E E
| Sinature Algorithm Identifier | R R R <-- 签名加密算法标识
+-------------------------------+ S S S
| Issuer Name | I I I <-- 颁发机构信息,包括了C/ST/L/O/CN等信息
+-------------------------------+ O O O
| Not Before & Not After | N N N <-- 证书有效期,指定了开始结束范围
+-------------------------------+ 1 2 3
| Subject Name | | | | <-- 证书持有人信息
+-------------------------------+ | | |
| Subject's Public Key Info | | | | <-- 证书持有人公钥信息
+-------------------------------+---- | |
| Issuer Unique Identifier | | | <-- 签发机构唯一标识
+-------------------------------+ | |
| Subject Unique Identifier | | | <-- 证书持有人唯一标识
+-------------------------------+------- |
| Extensions | | <-- 扩展信息
+-------------------------------+----------
| Signature | ALL <-- 证书签名信息
+-------------------------------+
在浏览器中,可以点击地址栏中的锁标志然后查看证书信息,如下是 Chrome 中关于 github.com
的证书信息。
该页面显示了证书中比较重要的内容,包括了证书颁发者、拥有者信息,以及有效期等信息。
而详细的信息可以从 Details 标签页中查看,如下是证书的详细信息。
详细介绍
详细信息一般包括了如下的字段,这里简单介绍下。
通用信息
有些字段可能会有些复杂。
版本号
Version
用来指明 X.509
证书的格式版本,包括了 V1
、V2
、V3
,不同版本对应的字段略有区别。
序列号
Serial Number
CA 分配给证书的唯一标识符,用于证书被取消时使用;
签名算法
Signature Algorithm
签发证书使用的签名算法,如 sha256WithRSAEncryption
。
签发机构 使用者
签发机构名 Issuer Name
标识签发证书 CA 的信息;证书用户名 Subject Name
使用该证书的机构,包含的内容与签发机构类似,详见如下介绍。
有效期
Validity
指定证书的有效期,包括了开始 Not Before
和失效日期 Not After
。
公钥信息
证书持有证书的公钥信息 Subject Public Key Info
包括了公钥使用算法以及公钥值。
证书用途
KeyUsage
标识证书的用途,一般包括了:
Certificate Signing
签发证书。CRL Signing
另外,还支持 ExtKeyUsage
配置。
按照不同的证书类型,通常有如下的特性:
- Root 支持
Certificate Signing
CRL Signing
。
基本限制
BasicConstraints
通常会包含一个 Certificate Authority
,也就是是否可以用来签发证书。
扩展项
Extension
V3 证书对 V2 的扩展项,以使证书能够附带额外信息,常见的有:
Subject Key ID
颁发和持有者信息
上述颁发者和持有者信息一般包含了如下字段:
- 国家信息
Country Name, C
使用的是 ISO 格式,通过两个字母代号代表相应的国家,例如US
、CN
等; - 州或者省信息
State or Province Name, ST
按照英文名填写即可,例如California
、ShangHai
、ZheJiang
等; - 地区信息
Locality Name, L
可选,可以是城市的名称,例如San Francisco
、HangZhou
等; - 组织信息
Organization Name, O
可以是公司名称,例如Github, Inc
、Alipay.com Co.,Ltd
等; - 单位部门
Organizational Unit Name, OU
可以省略,例如IT Dept
、Secure Web Server
等; - 通用名称
Common Name, CN
一般是网站的名称,也可以使用通配符,例如github.com
、*.alipay.com
等;
证书内容
这里以 PEM 格式为例介绍,如下分别为未加密的证书和私钥文件。
-----BEGIN CERTIFICATE-----
... ...
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
... ...
-----END PRIVATE KEY-----
如果对私钥进行了加密,那么其格式为,开始字段说明了所使用的加密方式和提供用于解密的初始向量。
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,fdc1f81c5115dc7f
... ...
-----END RSA PRIVATE KEY-----
常用命令
当然,可以将网站的证书导出,那么也可通过 OpenSSL 的命令查看。
openssl x509 -noout -text -in cert.pem
另外,也可以将 -text
替换为 -serial
-subject
-fingerprint
查看具体的信息。
FAQ
为什么设置过期时间?
最重要原因是吊销证书。因为某些原因 (例如,网站私钥丢失) 需要吊销证书时,网站应该向证书颁发机构 (CA) 申请将他们的证书加入到证书吊销列表 (CRL) 里。
当用户访问 HTTPS 站点时,浏览器会自动向 CA 请求吊销列表,如果用户访问的站点提供的证书在 CRL 里,浏览器就不信任这个证书。如果证书永久有效,随着越来越多的私钥丢失,吊销列表也越来越大,包括 CA 和浏览器都会造成很大压力。
当设置了效期之后,那么 CA 就可以将那些已经过期了的证书从 CRL 里剔除,因为反正浏览器也不信任过期证书。
目前,大多数的证书有效期为一年。
多域名支持
如想使用泛域名可以在 Common Name, CN 中使用 *
通配符,例如 *.foobar.com
;而如果想使用同一证书匹配多个域名,可以使用 X.509 中扩展字段的 Subject Alternative Name 字段来配置多域名支持。
这样就意味着需要在 CSR 证书请求中增加对 X.509 V3 扩展字段的支持。
而且在 GoLang 中,不再建议使用 CN 否则会报 certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
的错误。