证书制作
我们已经知道创建证书需要一个证书请求,CA证书,CA证书配套的CA私钥。创建证书分为如下几个步骤。
1. 验证证书请求及其内容(本例中包括subjectName和subjectAltName),从而决定是否同意使用CA证书来证书这些数据。
2. 创建一个新的证书并且设置所有需要的字段,比如公钥,subject和issuer名称,使用期限数据等等。
3. 增加应用扩展到证书中,包括请求中的subjectAltname。
4. 使用CA的私钥对证书进行签名。
步骤一最为重要。为了检验请求,首先必须检查附带的签名合法性,这样有助确保请求提交签名申请后没有被改动过。更为重要的是我们必须决定是否同意去公证这些数据。对请求进行签名后并且将之放入证书中就意味着CA已经对请求的身份经过了验证。这使得把校验身份的责任留给了应用(application),或者最终来讲,应用(application)的使用者(用户)。
对任何提交的证书自动进行签名不是好方法。举例来说,攻击者可以使用他人的身份信息来创建请求,通过“正常”的渠道提交,这样没有经过授权的权利会被自动允许。鉴于此应用必须提示用户请求中所有的信息,并且询问是否正确,因为用户在作出决定中占有独特的地位。举例来说,我们无论如何必须校验请求的提出者确实在dNSName中包含了FQDN信息。最后,请求中的信息不得经过任何方式进行变更。换句话说,如果CA没有授权请求中任何部分,那么整个请求都应该被拒绝掉,而不是更改不被接受的部分。(这段不太懂...)
第二步,创建证书,赋值所有的属性。这通常是一些CA的标准参数。比如,CA应该决定采用的默认证书版本,默认的使用期限。除了这些标准设定,还必须给新创建的证书赋值subject和issuer名称。Subject名称应该直接从证书请求中取得;issuer名称则是CA的subject名称。最后是请求中的公钥也必须添加到证书中。
在通过编程方式创建证书的一个关键步骤是增加证书的扩展项。第三步处理这个话题。X.509V3证书使用最为普遍。因此需要添加相关V3的字段。搞清楚哪些字段是我们实际需要添加到证书是保证这一步正确的前提。举例来说,我们决定允许新产生的证书可以担当CA的角色。下面的例子中使用了默认的扩展,并且保存了subjectAltName。
最后一步使用CA私钥对证书进行签名。到了这一步可以防止对放入证书的数据做任何的改动了。因此必须是最后一步作此操作。下面是示例程序。