X.509
X.509是密码学里公钥证书的格式标准。 X.509 证书己应用在包括TLS/SSL在内的众多 Intenet协议里.同时它也用在很多非在线应用场景里,比如电子签名服务。X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。对于一份经由可信的证书签发机构签名或者可以通过其它方式验证的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,对文档进行数字签名.
另外除了证书本身功能,X.509还附带了证书吊销列表和用于从最终对证书进行签名的证书签发机构直到最终可信点为止的证书合法性验证算法。
X.509是ITU-T标准化部门基于他们之前的ASN.1定义的一套证书标准。
一个x509的模板
// generate a serial number
serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
serialNumber, _ := rand.Int(rand.Reader, serialNumberLimit)
// set expiry to around 10 years
expiry := 3650 * 24 * time.Hour
// round minute and backdate 5 minutes
notBefore := time.Now().Round(time.Minute).Add(-5 * time.Minute).UTC()
// basic template to use
// 此日期前无效 此日期后无效
x509 := x509.Certificate{
SerialNumber: serialNumber,
NotBefore: notBefore,
NotAfter: notBefore.Add(expiry).UTC(),
BasicConstraintsValid: true,
}
在X.509里,组织机构通过发起证书签名请求(CSR)来得到一份签名的证书。首先需要生成一对钥匙对,然后用其中的私钥对CSR进行签名,并安全地保存私钥。CSR进而包含有请求发起者的身份信息、用来对此请求进行验真的的公钥以及所请求证书专有名称。CSR里还可能带有CA要求的其它有关身份证明的信息。然后CA对这个专有名称发布一份证书,并绑定一个公钥. 组织机构可以把受信的根证书分发给所有的成员,这样就可以使用公司的PKI系统了。像Firefox, IE, Opera, Safari 以及Google Chrome都预装有早就确定的根证书列表,所以使用主流CA发布的证书SSL都直接可以正常使用。浏览器的开发者直接影响着它的用户对第三方的信任。FireFox就提供了一份csv/html格式的列表[2] X.509也定义了CRL实现标准。另一种检查合法性的方式是OCSP。FireFox 3开始就默认打开了这项检查功能,Windows从Vista版本以后也一样。
证书组成结构
证书组成结构标准用ASN.1(一种标准的语言)来进行描述. X.509 v3 数字证书结构如下:
- 证书
- 版本号
- 序列号
- 签名算法
- 颁发者
- 证书有效期
- 此日期前无效
- 此日期后无效
- 主题
- 主题公钥信息
- 公钥算法
- 主题公钥
- 颁发者唯一身份信息(可选项)
- 主题唯一身份信息(可选项)
- 扩展信息(可选项)
- ...
- 证书签名算法
- 数字签名
所有扩展都有一个ID,由object identifier来表达.它是一个集合,并且有一个标记用与指示这个扩展是不是决定性的。证书使用时,如果发现一份证书带有决定性标记的扩展,而这个系统并不清楚该扩展的用途,那么要拒绝使用它。但对于非决定性的扩展,不认识可以予以忽略。[3] RFC 1422[4]给出了v1的证书结构 ITU-T在v2里增加了颁发者和主题唯一标识符,从而可以在一段时间后可以重用。重用的一个例子是当一个CA破产了,它的名称也在公共列表里清除掉了,一段时间之后另一个CA可以用相同的名称来注册,即使它与之前的并没有任何瓜葛。不过IETF并不建议重用同名注册。另外v2在Internet也没有多大范围的使用。 v3引入了扩展。CA使用扩展来发布一份特定使用目的的证书(比如说仅用于代码签名) 所有的版本中,同一个CA颁发的证书序列号都必须是唯一的。
ASN.1
在电信和计算机网络领域,ASN.1(Abstract Syntax Notation One) 是一套标准,是描述数据的表示、编码、传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。
ASN.1是ISO和ITU-T的联合标准,最初是1984年的CCITT X.409:1984的一部分。由于其广泛应用,1988年ASN.1移到独立标准X.208,1995年进行全面修订后变成X.680系列标准。
ASN.1本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。各种ASN.1编码规则提供了由ASN.1描述其抽象句法的数据的值的传送语法(具体表达)。标准的ASN.1编码规则有基本编码规则(BER,Basic Encoding Rules)、规范编码规则(CER,Canonical Encoding Rules)、唯一编码规则(DER,Distinguished Encoding Rules)、压缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。为了使ASN.1能够描述一些原先没有使用ASN.1定义,因此不适用上述任一编码规则的数据传输和表示的应用和协议,另外制订了ECN来扩展ASN.1的编码形式。ECN可以提供非常灵活的表明方法,但还没有得到普遍应用。
ASN.1与特定的ASN.1编码规则一起通过使用独立于计算机架构和编程语言的方法来描述数据结构,为结构化数据的交互提供了手段,特别是在网络环境的应用程序。
应用层协议如X.400(email)、X.500和LDAP(目录服务)、H.323(VoIP)和SNMP使用 ASN.1 描述它们交互的协议数据单元。在UMTS的接入和非接入层也有广泛的应用。 ASN.1的其他应用领域参见此处[1]。
这里[2]列举了很多ASN.1的自由或者商业的工具。