学习如何创建数字证书链以测试您的软件IBM 软件工程师 Paul H Abbott 通过展示如何使用可免费获得的 OpenSSL 工具箱创建任意长度的证书链阐明了这个很少有文档说明的过程他还描述了常见的证书属性并展示了一些将证书读取到 Java keystore 中的示例 Java 代码
如果正在开发用于公钥基础设施 (PKI) 实现安全性的 Java 软件那么通常需要创建 数字证书链 (也称为 证书路径) 以进行测试这是比较简单的任务但是关于它的文档说明非常少本文描述了如何用开源 OpenSSL 工具箱 (请参阅 参考资料)创建任意长度的证书链还介绍了一些常见的证书属性并分析了一个读取证书到 Java keystore 中的示例应用程序
数字证书快速回顾
本文假定您熟悉 PKI 基础知识因此我只对数字证书的目的和结构给予简要回顾以帮助说明证书链的概念
数字证书的主要用途是验证签名数据的来源如电子邮件和 JAR 文件用证书验证签名的数据使接收者知道数据的来源以及它在传输过程中是否改变过
在高层一个数字证书包含一个 惟一名 (DN) 和一个 公钥DN 标识一个具有与证书的公钥匹配的 私钥 的实体——如一个人通过用私钥对证书签名并将签名放到证书中而将两者结合到一起
一个由匹配证书公钥的私钥签名的证书称为 自签名 证书根证书颁发机构 (Root certification authorityCA) 证书就属于这一类用户证书通常是由不同的私钥签名的如 CA 的私钥这构成了两证书链验证用户证书为真涉及验证其证书中的签名这需要 CA 的公钥但在在可以使用 CA 的公钥之前需要对封装的 CA 证书进行验证因为 CA 证书是自签名的所以用 CA 公钥验证证书
用户证书需要用根 CA 的私钥签名它可以用一个中介的私钥签名这个私钥的证书是用 CA 的私钥签名的这是一个三证书链的例子用户证书中介证书和 CA 证书但是在链中可以有多个中介因此证书链可以有任意的长度
值得一提的另一点是证书可以包含额外信息称为 extensionExtension 可以指定证书的用途以及其他内容根据于证书的用途某些 extension 有可能非常重要
用 OpenSSL 创建证书
有一些创建证书的工具可以使用在 Java SDK 中自带的一个命令行工具 keytool 创建自签名的证书但是证书链需要更复杂的软件如 OpenSSL
获得 OpenSSL
可以免费下载 OpenSSL (请参阅 参考资料)如果使用 UNIX那么很可能在操作系统中已经安装了 OpenSSL或者它是操作系统的安装选项Linux 用户应当查看 /usr/share/sslMicrosoft MKS toolkit 也带有某个版本的 OpenSSL (在我的计算机中它是在 C:\Program Files\MKS Toolkit\etc\openssl) 如果使用 Windows 但是没有 MKS那么可以从 SourceForge 得到必要的二进制文件 (请参阅 参考资料)大多数安装由三个主要文件组成OpenSSL 二进制文件一个 CAsh shell 脚本和一个 f 配置文件(SourceForge 的软件包缺少 CAsh 文件可以下载源代码包获得缺少的文件)
安装后保证 CAsh 和 OpenSSL 可执行文件在路径中然后就可以开始创建根证书了
创建根证书
CA shell 脚本使创建根证书成为一项相对容易的工作首先进入要存放 CA 数据的目录 (我使用 temp\OpenSSL 目录) 然后键入
CA newca
这会产生一个像清单 的对话框它包括我在提示符下输入的示例信息
清单 创建根证书
$ CAsh newca
CA certificate filename (or enter to create)
Making CA certificate
Using configuration from C:/PROGRA~/MKSTOO~/etc/openssl/f
Loading screen into random state done
Generating a bit RSA private key
++++++
++++++
writing new private key to /demoCA/private//cakeypem
Enter PEM pass phrase:
Verifying password Enter PEM pass phrase:
You are about to be asked to enter information that will be incorporated into your certificate request
What you are about to enter is what is called a Distinguished Name or a DN
You will see a number of fields but you can leave some blank
For some fields there will be a default value
If you enter the field will be left blank
Country Name ( letter code) [AU]:UK
State or Province Name (full name) [SomeState]:Hampshire
Locality Name (eg city) []:Winchester
Organization Name (eg company) [Internet Widgits Pty Ltd]:IBM UK Ltd
Organizational Unit Name (eg section) []:JTC
Common Name (eg YOUR name) []:Pauls Root Certificate
Email Address []:Pa
$
完成对话框后OpenSSL 创建以下目录结构
demoCA/
cacertpem root certificate
indextxt empty
serial text file containing
certs/ empty
crl/ empty
newcerts/ empty
private/cakeypem private key
下面是在主目录中文件的简单说明
cacertpem 是这个 CA 的 PEM 编码的(请参阅侧栏 PEM 文件格式)根证书根证书验证由根私钥签名的证书
indextxt 是包含所有发布的证书列表的文件
serial 包含将指定给由这个 CA 发布的证书的下一个可用序列号换一种说法它是在这个根证书对签名请求签名时指定给一个证书的惟一序列号
cakeypem 是根私钥这个密钥用于签名证书请求它也是 PEM 编码的
您定义目录名 (在这个例子中是 demoCA) 和根证书的有效周期在 CAsh 中它默认为 天如果想要改变这些值必须编辑这个文件
生成用户证书
生成用户证书有两步生成一个请求和对请求签名CA shell 脚本可以用 newreq (生成一个新的请求) 和 sign (签名一个新请求) 操作符完成这两步
生成一个新请求
执行 CA newreq 命令会启动一个类似于生成新根证书时看到的对话框一个主要的不同是这个对话框提示您输入 PEM 密码短语OpenSSL 将使用这个短语编码私钥然后将它写入输出文件
输出文件名为 newreqpem包含私钥和签名请求可以将它想像为未签名的证书清单 显示了一个新请求对话框的例子
清单 示例 newreq 对话框
Using configuration from
C:/PROGRA~/MKSTOO~/etc/openssl/f
Loading screen into random state done
Generating a bit RSA private key
++++++
++++++
writing new private key to newreqpem
Enter PEM pass phrase:
Verifying password Enter PEM pass phrase:
You are about to be asked to enter information that will be incorporated into your certificate request
What you are about to enter is what is called a Distinguished Name or a DN
You will see a number of fields but you can leave some blank
For some fields there will be a default value
If you enter the field will be left blank
Country Name ( letter code) [AU]:UK
State or Province Name (full name) [SomeState]:Hampshire
Locality Name (eg city) []:Winchester
Organization Name (eg company) [Internet Widgits Pty Ltd]:IBM Uk Ltd
Organizational Unit Name (eg section) []:JET
Common Name (eg YOUR name) []:Paul Abbott
Email Address []:Paul
Please enter the following extra attributes
to be sent with your certificate request
A challenge password []:qwerty
An optional company name []:
Request (and private key) is in newreqpem
对请求签名
执行 CA sign 命令会用包含在 private/cakeypem 中的根 CA 的私钥签名请求请求需要在一个名为 newreqpem 的文件中生成的证书写入到名为 newcertpem 的文件中这两个文件都在当前目录中清单 显示了示例请求签名对话框
清单 示例 sign 对话框
$ CAsh sign
Using configuration from C:/PROGRA~/MKSTOO~/etc/openssl/f
Loading screen into random state done
Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:UK
stateOrProvinceName :PRINTABLE:Hampshire
localityName:PRINTAB