为测试 Java 应用程序生成证书链

上一篇 / 下一篇  2007-04-08 21:07:34

Paul H. Abbott, 软件工程师, IBM

学习如何创建数字证书链以测试您的软件。IBM 软件工程师 Paul H. Abbott 通过展示如何使用可免费获得的 OpenSSL 工具箱创建任意长度的证书链,阐明了这个很少有文档说明的过程。他还描述了常见的证书属性,并展示了一些将证书读取到 Java keystore 中的示例 Java 代码。

如果正在开发用于公钥基础设施 (PKI) 实现安全性的 Java 软件,那么通常需要创建数字证书链(也称为证书路径) 以进行测试。这是比较简单的任务,但是关于它的文档说明非常少。本文描述了如何用开源 OpenSSL 工具箱 (请参阅参考资料)创建任意长度的证书链。还介绍了一些常见的证书属性并分析了一个读取证书到 Javakeystore中的示例应用程序。

数字证书:快速回顾

本文假定您熟悉 PKI 基础知识,因此我只对数字证书的目的和结构给予简要回顾以帮助说明证书链的概念。

数字证书的主要用途是验证签名数据的来源,如电子邮件和 JAR 文件。用证书验证签名的数据使接收者知道数据的来源以及它在传输过程中是否改变过。

在高层,一个数字证书包含一个惟一名(DN) 和一个公钥。DN 标识一个具有与证书的公钥匹配的私钥的实体——如一个人。通过用私钥对证书签名并将签名放到证书中而将两者结合到一起。

一个由匹配证书公钥的私钥签名的证书称为自签名证书。根证书颁发机构 (Root certification authority,CA) 证书就属于这一类。用户证书通常是由不同的私钥签名的,如 CA 的私钥。这构成了两证书链。验证用户证书为真涉及验证其证书中的签名,这需要 CA 的公钥。但在在可以使用 CA 的公钥之前,需要对封装的 CA 证书进行验证。因为 CA 证书是自签名的,所以用 CA 公钥验证证书。

用户证书需要用根 CA 的私钥签名。它可以用一个中介的私钥签名,这个私钥的证书是用 CA 的私钥签名的。这是一个三证书链的例子:用户证书、中介证书和 CA 证书。但是在链中可以有多个中介,因此证书链可以有任意的长度。

值得一提的另一点是证书可以包含额外信息,称为extension。Extension 可以指定证书的用途以及其他内容。根据于证书的用途,某些 extension 有可能非常重要。

用 OpenSSL 创建证书

有一些创建证书的工具。可以使用在 Java SDK 中自带的一个命令行工具 keytool 创建自签名的证书。但是证书链需要更复杂的软件,如 OpenSSL。

获得 OpenSSL

可以免费下载 OpenSSL (请参阅参考资料)。如果使用 UNIX,那么很可能在操作系统中已经安装了 OpenSSL,或者它是操作系统的安装选项。Linux 用户应当查看: /usr/share/ssl。Microsoft MKS toolkit 也带有某个版本的 OpenSSL。 (在我的计算机中它是在 C:\Program Files\MKS Toolkit\etc\openssl。) 如果使用 Windows 但是没有 MKS,那么可以从 SourceForge 得到必要的二进制文件 (请参阅参考资料)。大多数安装由三个主要文件组成:OpenSSL 二进制文件、一个 CA.sh shell 脚本和一个 openssl.cnf 配置文件。(SourceForge 的软件包缺少 CA.sh 文件。可以下载源代码包获得缺少的文件。)

安装后,保证 CA.sh 和 OpenSSL 可执行文件在路径中。然后就可以开始创建根证书了。

创建根证书

CA shell 脚本使创建根证书成为一项相对容易的工作。首先,进入要存放 CA 数据的目录。 (我使用 temp\OpenSSL 目录。) 然后键入:

CA -newca

这会产生一个像清单 1 的对话框,它包括我在提示符下输入的示例信息:

清单 1. 创建根证书

$ CA.sh -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Using configuration from C:/PROGRA~1/MKSTOO~1/etc/openssl/openssl.cnf
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
......++++++
...++++++
writing new private key to './demoCA/private/./cakey.pem'
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 (2 letter code) [AU]:UK
State or Province Name (full name) [Some-State]:Hampshire
Locality Name (e.g., city) []:Winchester
Organization Name (e.g., company) [Internet Widgits Pty Ltd]:IBM UK Ltd
Organizational Unit Name (e.g., section) []:JTC
Common Name (e.g., YOUR name) []:Pauls Root Certificate
Email Address []:Paul_Abbott@uk.ibm.com
$
完成对话框后,OpenSSL 创建以下目录结构:

demoCA/
   cacert.pem              - root certificate
   index.txt               - empty
   serial                  - text file containing "01"
   certs/                  - empty
   crl/                    - empty
   newcerts/               - empty
   private/cakey.pem       - private key

下面是在主目录中文件的简单说明:

  • cacert.pem是这个 CA 的 PEM 编码的(请参阅侧栏PEM 文件格式)根证书。根证书验证由根私钥签名的证书。

  • index.txt是包含所有发布的证书列表的文件。

  • serial包含将指定给由这个 CA 发布的证书的下一个可用序列号。换一种说法,它是在这个根证书对签名请求签名时指定给一个证书的惟一序列号。

  • cakey.pem是根私钥。这个密钥用于签名证书请求。它也是 PEM 编码的。

您定义目录名 (在这个例子中是 demoCA) 和根证书的有效周期,在 CA.sh 中它默认为 365 天。如果想要改变这些值,必须编辑这个文件。

PEM 文件格式

OpenSSL 使用 PEM 文件格式存储证书和密钥。PEM 实质上是 Base64 编码的二进制内容,再加上开始和结束行,如证书文件的
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
。在这些标记外面可以有额外的信息,如编码内容的文字表示。文件是 ASCII 的,可以用任何文本编辑程序打开它们。观察这个示例 PEM 文件

生成用户证书

生成用户证书有两步:生成一个请求和对请求签名。CA shell 脚本可以用-newreq(生成一个新的请求) 和-sign(签名一个新请求) 操作符完成这两步。

生成一个新请求

执行CA -newreq命令会启动一个类似于生成新根证书时看到的对话框。一个主要的不同是这个对话框提示您输入 PEM 密码短语,OpenSSL 将使用这个短语编码私钥,然后将它写入输出文件。

输出文件名为 newreq.pem,包含私钥和签名请求,可以将它想像为未签名的证书。清单 2 显示了一个新请求对话框的例子。

清单 2. 示例 -newreq 对话框

Using configuration from
C:/PROGRA~1/MKSTOO~1/etc/openssl/openssl.cnf
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
......................++++++
...++++++
writing new private key to 'newreq.pem'
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 (2 letter code) [AU]:UK
State or Province Name (full name) [Some-State]:Hampshire
Locality Name (e.g., city) []:Winchester
Organization Name (e.g., company) [Internet Widgits Pty Ltd]:IBM Uk Ltd
Organizational Unit Name (e.g., section) []:JET
Common Name (e.g., YOUR name) []:Paul Abbott
Email Address []:Paul_H_Abbott@uk.ibm.com

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 newreq.pem

对请求签名

执行CA -sign命令会用包含在 private/cakey.pem 中的根 CA 的私钥签名请求。请求需要在一个名为 newreq.pem 的文件中,生成的证书写入到名为 newcert.pem 的文件中,这两个文件都在当前目录中。清单 3 显示了示例请求-签名对话框。


清单 3. 示例 -sign 对话框
$ CA.sh -sign
Using configuration from C:/PROGRA~1/MKSTOO~1/etc/openssl/openssl.cnf
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          :PRINTABLE:'Winchester'
organizationName      :PRINTABLE:'IBM UK Ltd'
organizationalUnitName:PRINTABLE:'JET'
commonName            :PRINTABLE:'Paul Abbott'
emailAddress          :IA5STRING:'Paul_H_Abbott@uk.ibm.com'
Certificate is to be certified until Jun 22 20:50:55 2005 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 2 (0x2)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=UK, ST=Hampshire, L=Winchester, O=IBM UK Ltd,
          ōU=JTC, CN=Paul H Abbott/Email=Paul_H_Abbott@uk.ibm.com
        Validity
            Not Before: Jun 22 20:50:55 2004 GMT
            Not After : Jun 22 20:50:55 2005 GMT
        Subject: C=UK, ST=Hampshire, L=Winchester, O=IBM Uk Ltd,
          ōU=JET, CN=Paul Abbott/Email=Paul_H_Abbott@uk.ibm.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:e2:b5:90:50:e5:dd:7c:79:c3:49:a5:c9:ee:29:
                    3a:da:1d:8b:6a:b0:0b:a0:a1:cf:79:fc:be:50:db:
                    cb:37:b7:54:00:bb:6e:74:e6:a4:11:d4:c6:5a:02:
                    46:3b:b4:33:72:97:5b:cf:9d:9a:32:9b:e6:34:e9:
                    4b:30:4e:b6:68:55:8a:3f:80:f3:5e:c9:63:cc:4e:
                    c2:c0:c3:34:2f:93:9f:fa:ca:1b:44:f5:c8:87:ec:
                    1d:12:a9:8c:3a:b9:28:83:4d:b5:18:ff:34:3a:a9:
                    e7:7e:4e:c4:21:8e:56:e7:dc:f5:07:46:39:c8:d8:
                    ff:00:d3:87:20:2e:06:18:19
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                FA:65:44:FB:3A:E6:15:1F:C5:40:6C:EB:F4:DA:AB:B9:CD:F2:2D:54
            X509v3 Authority Key Identifier:
                keyid:93:8C:B4:F0:30:95:77:59:2E:A1:3B:0C:A5:3A:C6:92:FA:16:31:6D
                DirName:/C=UK/ST=Hampshire/L=Winchester/O=IBM UK Ltd/
                  ōU=JTC/CN=Paul H Abbott/Email=Paul_H_Abbott@uk.ibm.com
                serial:00

    Signature Algorithm: md5WithRSAEncryption
        27:43:6d:89:c3:61:d4:af:3e:dc:55:a3:9a:a7:7d:66:4e:29:
        2e:43:f0:90:c6:9c:0f:62:24:b2:4c:9e:2c:f7:d7:84:ce:7f:
        b6:c8:09:3d:b4:80:c8:26:9a:a8:6b:2f:df:8f:e3:8b:80:f5:
        10:28:80:28:5e:94:55:be:61:e5:18:4e:d4:a8:c2:9e:6d:9b:
        52:64:94:33:b3:a5:68:79:e2:85:86:01:e6:aa:0f:1e:54:2d:
        80:b1:37:38:66:cc:09:9a:0e:30:0a:e8:b9:00:7d:da:a2:a1:
        bb:3c:83:37:2f:16:6a:5d:84:25:66:23:d2:67:a9:02:a4:33:
        96:56
-----BEGIN CERTIFICATE-----
MIID0jCCAzugAwIBAgIBAjANBgkqhkiG9w0BAQQFADCBmjELMAkGA1UEBhMCVUsx
EjAQBgNVBAgTCUhhbXBzaGlyZTETMBEGA1UEBxMKV2luY2hlc3RlcjETMBEGA1UE
ChMKSUJNIFVLIEx0ZDEMMAoGA1UECxMDSlRDMRYwFAYDVQQDEw1QYXVsIEggQWJi
b3R0MScwJQYJKoZIhvcNAQkBFhhQYXVsX0hfQWJib3R0QHVrLmlibS5jb20wHhcN
MDQwNjIyMjA1MDU1WhcNMDUwNjIyMjA1MDU1WjCBmDELMAkGA1UEBhMCVUsxEjAQ
BgNVBAgTCUhhbXBzaGlyZTETMBEGA1UEBxMKV2luY2hlc3RlcjETMBEGA1UEChMK
SUJNIFVrIEx0ZDEMMAoGA1UECxMDSkVUMRQwEgYDVQQDEwtQYXVsIEFiYm90dDEn
MCUGCSqGSIb3DQEJARYYUGF1bF9IX0FiYm90dEB1ay5pYm0uY29tMIGfMA0GCSqG
SIb3DQEBAQUAA4GNADCBiQKBgQDitZBQ5d18ecNJpcnuKTraHYtqsAugoc95/L5Q
28s3t1QAu2505qQR1MZaAkY7tDNyl1vPnZoym+Y06UswTrZoVYo/gPNeyWPMTsLA
wzQvk5/6yhtE9ciH7B0SqYw6uSiDTbUY/zQ6qed+TsQhjlbn3PUHRjnI2P8A04cg
LgYYGQIDAQABo4IBJjCCASIwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl
blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFPplRPs65hUfxUBs
6/Taq7nN8i1UMIHHBgNVHSMEgb8wgbyAFJOMtPAwlXdZLqE7DKU6xpL6FjFtoYGg
pIGdMIGaMQswCQYDVQQGEwJVSzESMBAGA1UECBMJSGFtcHNoaXJlMRMwEQYDVQQH
EwpXaW5jaGVzdGVyMRMwEQYDVQQKEwpJQk0gVUsgTHRkMQwwCgYDVQQLEwNKVEMx
FjAUBgNVBAMTDVBhdWwgSCBBYmJvdHQxJzAlBgkqhkiG9w0BCQEWGFBhdWxfSF9B
YmJvdHRAdWsuaWJtLmNvbYIBADANBgkqhkiG9w0BAQQFAAOBgQAnQ22Jw2HUrz7c
VaOap31mTikuQ/CQxpwPYiSyTJ4s99eEzn+2yAk9tIDIJpqoay/fj+OLgPUQKIAo
XpRVvmHlGE7UqMKebZtSZJQzs6VoeeKFhgHmqg8eVC2AsTc4ZswJmg4wCui5AH3a
oqG7PIM3LxZqXYQlZiPSZ6kCpDOWVg==
-----END CERTIFICATE-----
Signed certificate is in newcert.pem

注意对话框中请求的 PEM 密码是用来加密根 CA 的私钥——而不是用户的私钥——的密码。

在签名后检查 demoCA 目录,可以看到 index.txt 和 serial 文件已经更新。生成的公钥也放到了 demoCA/newcert/ 目录中,文件名反映了其序列号——如 01.pem。

这时,有了一个用户证书、一个用户私钥和根证书。如果就需要这些,那么就可到此为止了。如果想要知道如何控制证书内容或者创建一个三(或者更多)证书链,则请继续往下读。

在 CA.sh 背后

到目前为止,我展示了如何用 CA.sh shell 脚本简化证书生成过程。但是在背后,CA.sh 使用 OpenSSL 命令执行所有必要的密钥生成和签名操作。通过 openssl.cnf 配置文件控制 OpenSSL。我将讨论这个文件的某些部分和它们影响的 CA.sh 操作。

CA -newca

正如我在前面说过的,CA -newca操作为 CA 创建必要的目录结构:

dir             = ./demoCA              # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
new_certs_dir   = $dir/newcerts         # default place for new certs.

certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key

这个操作创建在 openssl.cnf 中的 CA_default 一节中定义的目录,尽管 CA.sh 不直接引用配置文件。如果想要使用不同的结构,需要修改 openssl.cnf 并手工创建所需要的目录。也可以修改 CA.sh 以创建目录。.

下面对 OpenSSL 的调用生成一个根证书:

openssl req -new -x509 -keyout ./demoCA/private/cakey.pem
  -out ./demoCA/cacert.pem -days 365

-days标志设置根证书的生存期为 365 天 (一年),它覆盖了在 openssl.cnf 中指定的所有值。

CA -newreq

openssl.cnf 的req一节控制新证书请求的生成,如下面的例子所示:

[ req ]
default_bits        = 1024
default_keyfile     = privkey.pem
distinguished_name  = req_distinguished_name
attributes          = req_attributes

第一行确定生成的密钥对的长度,第二行确定生成的私钥的默认目标文件。后面两行指向同一文件的其他节。

req_distinguished_name一节定义了要放在证书请求中的 DN 组件,这些组件最终要进入签名的证书中:

[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = AU
countryName_min             = 2
countryName_max             = 2

stateOrProvinceName         = State or Province Name (full name)

localityName                = Locality Name (e.g., city)

organizationName            = Organization Name (e.g., company)

organizationalUnitName      = Organizational Unit Name (e.g., section)

commonName                 = Common Name (e.g., YOUR name)

emailAddress                = Email Address

这一节的每一部分包含最多四个值,如例子中的第二到第五行所示:

  • 打印到屏幕上的消息提示
  • 一个默认值 (后缀_default
  • 用户可以键入的最少字符数 (后缀_min
  • 用户可以输入的最多字符数 (后缀_max

还有其他几个选项。它们包括定义自己的对象标识符 (OID) 类型和让惟一名值在配置文件中定义而不是由用户提供,这对于批处理操作会很有用。req_attributes一节可以定义加密密码的最小和最大长度,以及其他内容。

new-request 操作的 OpenSSL 调用为:

openssl req -new -keyout newreq.pem -out newreq.pem -days 365

注意-keyout选项覆盖了配置文件中的default_keyfile一行。同样,生成的证书的生存期设置为 365 天。如果拿这个一行与生成根证书的那一行比较,您会看到只有一处不同:-x509。它告诉 OpenSSL 您需要一个自签名的证书。

可以在 OpenSSL 文档 (请参阅参考资料) 的req一节中找到更多关于使用 OpenSSL 生成签名请求的信息。

CA -sign

签名操作,就像请求生成操作一样,使用对 OpenSSL 的调用对证书签名:

openssl ca -policy policy_anything -out newcert.pem
  -infiles newreq.pem

值得注意的是 OpenSSL 命令是ca而不是sign,没有指定用来签名的私钥。openssl.cnf 配置文件定义了这些信息。有关的一节是CA_default,尽管可以使用-name选项覆盖它。

-policy参数指定配置文件中的策略一节。用这一节指定哪些字段必须出现在 DN 请求中,哪些是可选的。我通常使用这种配置:

[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
可以看到,这种配置默认情况下要求很低。值得注意的是文档声明没有在这里列出的 DN 字段将会无声无息地从签名的请求中删除。

签名第三个证书

本书的创建根证书生成一个用户证书两节展示了如何用 CA.sh shell 脚本创建根证书,然后用根证书签名用户证书。如果只想有一个两证书链,那些这个过程就足够了,但是如果在链中需要三个或者更多的证书呢?回答是直接使用 OpenSSL 命令。既然知道了 CA.sh 脚本是如何工作的,就可以利用这些知识创建一个三证书链。其步骤类似于创建二证书链的步骤。为了简化,将重复使用上一例子中的 CA 证书/私钥和用户请求。

首先重命名现有的用户请求文件为 userRequest1.pem。然后创建一个新的用户证书,将称它为 userCert1。现有的用户证书没有标记为 CA 证书,并且不能用于对其他证书签名。(只有在试图验证一个包含这种证书的证书链时才会看到这一点。)

需要添加以下一节,它使证书可以根据配置文件对证书签名:

[ my_v3_ext ]
basicConstraints = CA:true

使用以下命令来签名证书:

openssl ca -policy policy_anything -extensions my_v3_ext
  -out userCert1.pem -infiles userRequest1.pem

下一步,为第三个证书生成一个新的证书请求。可以使用CA -newreq命令完成这项任务,也可以直接使用OpenSSL命令。

有了请求文件后,需要对它签名。如前所述,用来对请求签名的私钥默认是在配置文件中而不是openssl ca命令中指定的。但是openssl ca命令可以包含一个-keyfile选项,它让您可以覆盖这个默认值。 下面的命令使用第二个证书签名第三个证书:

openssl ca -policy policy_anything -keyfile userRequest1.pem
  -cert userCert1.pem -out userCert2.pem -infiles newreq.pem

注意-cert参数指定了签名者的证书,覆盖了配置文件中的默认值。不用这个参数调用这个命令将会产生一个错误,因为 OpenSSL 会检查私钥和签名者的证书是否匹配。

假定一切顺利,在当前目录中应当有 userCert1.pem 和 userCert2.pem 文件,在 demoCA/private 目录中有根 CA 证书。这三个文件构成了证书链。如果使用 Windows,那么应当可以通过在文件浏览器中更改文件名使它们具有 .cer 扩展名,并双击它们来安装证书。

其他选项

可以发现下面 OpenSSL 命令行选项很有用:

  • -startdate, -enddate & -days可以指定生成的证书的有效周期。在默认情况下,一个证书从当前日期起一年有效。
  • -notext可以关闭出现在二进制编码版本之前的已生成证书的文字表述。文字版本通常不是必需的。
  • -key是用来加密私钥的密码。它在要从一个批处理文件中调用 OpenSSL 时很有用。
  • -batch告诉 OpenSSL 在批处理模式下工作,没有用户提示。
  • -extfile指定一个文件包含证书扩展。

将证书装载到 Java keystore

Java keystore 是私钥的存储库,相关的 X.509 证书链认证对应的公钥。让证书链进入 Java keystore 需要一个简单的 Java 程序。清单 4 中的代码片段将所创建的三证书链读入到一个现有的 keystore 中:


清单 4. 将证书链装载到 Java keystore
// The keystore to add the certificates to
FileInputStream ksis = new FileInputStream(".keystore");

// The new keystore with the certificates added
FileOutputStream ksos = new FileOutputStream(".newkeystore");

// The certificate files, to be added to keystore
FileInputStream certFile1 = new FileInputStream("cacert.cer");
FileInputStream certFile2 = new FileInputStream("userCert1.cer");
FileInputStream certFile3 = new FileInputStream("userCert2.cer");

CertificateFactory cf = CertificateFactory.getInstance("X.509");

// Read the 3 certificates into memory
Certificate cert1 = cf.generateCertificate(certFile1);
Certificate cert2 = cf.generateCertificate(certFile2);
Certificate cert3 = cf.generateCertificate(certFile3);

// Read the keystore file, type="jks"
KeyStore ks = KeyStore.getInstance("jks");
char[] password = "password".toCharArray();

ks.load(ksis, password);

// Add certificates to keystore
ks.setCertificateEntry("MYROOT_ALIAS", cert1);
ks.setCertificateEntry("MYUSER1_ALIAS", cert2);
ks.setCertificateEntry("MYUSER2_ALIAS", cert3);

// Write modified keystore to file system
ks.store(ksos, password);

ksos.close();

在清单 4 中,keystore 的密码是password,keystore 类型是jks。证书进入 keystore 后,任何配置为访问这个keystore 的 Java 应用程序都可以使用它们。Sun 的 JDK 文档包含了如何做到这一点的信息。

结束语

正如您现在可能已经认识到的,可以用 OpenSSL 实现非常简单的 CA 并发布证书。您可能决定在完成自己的测试应用程序后,使它获得您的证书链。不过,这种方式需要承担验证所有证书的来源并管理已发布证书的责任。另一方面,您可能决定使用外部 CA 来发布证书,如 thawte 或 VeriSign,这种方式也有其优点和缺点。

本文展示了如何为使用基于 PKI 的安全性的测试 Java 应用程序创建证书链。为了不分散这个主题,我没有触及您可能会感兴趣的相关领域,如在其他应用程序 (如电子邮件) 中使用生成的证书链,如何在另一种语言中使用生成的证书链,以及证书吊销列表。如果您有意了解这些内容以及网络安全性和数字证书的复杂主题的其他领域,请参阅参考资料一节中提供的一些极好的信息资源。

参考资料

  • 下载最新版本的OpenSSL 源代码

  • The OpenSSL Documentation是 OpenSSL 命令的主文档。它还不完整,但是仍然相当有用。

  • 如果使用 Windows 但是没有 MKS,可以从 SourceForge 下载必要的 OpenSSL二进制文件

  • Introduction to Public Key Infrastructure提供了对 PKI 的基本介绍。

  • Jalal Feghhi 和 Peter Williams 的Digital Certificates: Applied Internet Security(Addison-Wesley Professional,1998) 描述了数字证书及它们的使用,主要是从 Windows 的角度。

  • Marco Pistoia et al. 的Java 2 Network Security, 2nd Edition(Prentice Hall PTR,1999) 提供了关于 Java 2 安全性的有用背景知识。

  • 安全专家 Brad Rubin 撰写了这个讨论 Java 安全性的全面的由两部分组成的入门教程。Part 1, Crypto basicsdeveloperWorks,2002 年 7 月)引导您学习关于加密的基础知识以及如何在某 Java 编码语言中实现它,Part 2, Authentication and authorizationdeveloperWorks,2002 年 7 月) 介绍了认证的基础知识并提供了 JAAS 体系结构的概述。

  • Internet Engineering Task Force (IETF) Request for Comment (RFC)2459描述了在 Internet 上使用的 X.509 v3 证书和 X.509 v2 证书吊销列表 (CRL)。

  • IETF RFC1617提供了 X.500 目录命名和结构指导。

  • "Java 安全的演进" (developerWorks,2002 年 6 月) 提供了开发和发展 Java 安全性的高层概述。

  • PKI 包包含发布数字证书的证书权威机构的一长串清单。

  • Which SSL: The SSL Certificate Buyers Guide设计用于帮助您确定选择哪个提供商来提供数字证书。

  • IBM alphaWorks 的KeyMan是管理密钥、证书、CRL 以及存储和获取这些条目的相应存储库的工具。

  • developerWorksJava 技术专区中可找到数百种 Java 技术资源。

  • 请访问Developer Bookstore,获取技术书籍的完整列表,其中包括数百本Java 相关主题的书籍。

  • 是否对无需通常的高成本入口点(entry point )或短期评估许可证的 IBM 测试产品感兴趣?developerWorks Subscrīption为 WebSphere®、DB2®、Lotus®、Rational® 和 Tivoli® 产品提供了低成本的 12 个月单用户许可证,包括基于 Eclipse 的 WebSphere Studio IDE,用于开发、测试、评估和展示您的应用程序。

TAG:

 

评分:0

我来说两句

Open Toolbar