日历
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | ||||||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
| 26 | 27 | 28 | 29 | 30 | 31 | ||||
搜索标题
最新评论
统计信息
- 访问量: 2237
- 日志数: 4
- 建立时间: 2006-11-28
- 更新时间: 2007-04-08
我的最新日志
-
为测试 Java 应用程序生成证书链
2007-4-08
Paul H. Abbott, 软件工程师, IBM
学习如何创建数字证书链以测试您的软件。IBM 软件工程师 Paul H. Abbott 通过展示如何使用可免费获得的 OpenSSL 工具箱创建任意长度的证书链,阐明了这个很少有文档说明的过程。他还描述了常见的证书属性,并展示了一些将证书读取到 Java keystore 中的示例 Java 代码。
如果正在开发用于公钥基础设施 (PKI) 实现安全性的 Java 软件,那么通常需要创建 数字证书链 (也称为 证书路径) 以进行测试。这是比较简单的任务,但是关于它的文档说明非常少。本文描述了如何用开源 OpenSSL 工具箱 (请参阅 参考资料)创建任意长度的证书链。还介绍了一些常见的证书属性并分析了一个读取证书到 Java keystore 中的示例应用程序。
本文假定您熟悉 PKI 基础知识,因此我只对数字证书的目的和结构给予简要回顾以帮助说明证书链的概念。
数字证书的主要用途是验证签名数据的来源,如电子邮件和 JAR 文件。用证书验证签名的数据使接收者知道数据的来源以及它在传输过程中是否改变过。
在高层,一个数字证书包含一个 惟一名 (DN) 和一个 公钥。DN 标识一个具有与证书的公钥匹配的 私钥 的实体——如一个人。通过用私钥对证书签名并将签名放到证书中而将两者结合到一起。
一个由匹配证书公钥的私钥签名的证书称为 自签名 证书。根证书颁发机构 (Root certification authority,CA) 证书就属于这一类。用户证书通常是由不同的私钥签名的,如 CA 的私钥。这构成了两证书链。验证用户证书为真涉及验证其证书中的签名,这需要 CA 的公钥。但在在可以使用 CA 的公钥之前,需要对封装的 CA 证书进行验证。因为 CA 证书是自签名的,所以用 CA 公钥验证证书。
用户证书需要用根 CA 的私钥签名。它可以用一个中介的私钥签名,这个私钥的证书是用 CA 的私钥签名的。这是一个三证书链的例子:用户证书、中介证书和 CA 证书。但是在链中可以有多个中介,因此证书链可以有任意的长度。
值得一提的另一点是证书可以包含额外信息,称为 extension。Extension 可以指定证书的用途以及其他内容。根据于证书的用途,某些 extension 有可能非常重要。
有一些创建证书的工具。可以使用在 Java SDK 中自带的一个命令行工具 keytool 创建自签名的证书。但是证书链需要更复杂的软件,如 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 的对话框,它包括我在提示符下输入的示例信息:
$ 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 天。如果想要改变这些值,必须编辑这个文件。
OpenSSL 使用 PEM 文件格式存储证书和密钥。PEM 实质上是 Base64 编码的二进制内容,再加上开始和结束行,如证书文件的
-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-----
。在这些标记外面可以有额外的信息,如编码内容的文字表示。文件是 ASCII 的,可以用任何文本编辑程序打开它们。观察这个 示例 PEM 文件生成用户证书有两步:生成一个请求和对请求签名。CA shell 脚本可以用
-newreq(生成一个新的请求) 和-sign(签名一个新请求) 操作符完成这两步。执行
CA -newreq命令会启动一个类似于生成新根证书时看到的对话框。一个主要的不同是这个对话框提示您输入 PEM 密码短语,OpenSSL 将使用这个短语编码私钥,然后将它写入输出文件。输出文件名为 newreq.pem,包含私钥和签名请求,可以将它想像为未签名的证书。清单 2 显示了一个新请求对话框的例子。
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 shell 脚本简化证书生成过程。但是在背后,CA.sh 使用 OpenSSL 命令执行所有必要的密钥生成和签名操作。通过 openssl.cnf 配置文件控制 OpenSSL。我将讨论这个文件的某些部分和它们影响的 CA.sh 操作。
正如我在前面说过的,
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 中指定的所有值。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 生成签名请求的信息。签名操作,就像请求生成操作一样,使用对 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 是私钥的存储库,相关的 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 basics (developerWorks,2002 年 7 月)引导您学习关于加密的基础知识以及如何在某 Java 编码语言中实现它,Part 2, Authentication and authorization (developerWorks,2002 年 7 月) 介绍了认证的基础知识并提供了 JAAS 体系结构的概述。
- Internet Engineering Task Force (IETF) Request for Comment (RFC) 2459 描述了在 Internet 上使用的 X.509 v3 证书和 X.509 v2 证书吊销列表 (CRL)。
- IETF RFC 1617 提供了 X.500 目录命名和结构指导。
- "Java 安全的演进" (developerWorks,2002 年 6 月) 提供了开发和发展 Java 安全性的高层概述。
- PKI 包 包含发布数字证书的证书权威机构的一长串清单。
- Which SSL: The SSL Certificate Buyers Guide 设计用于帮助您确定选择哪个提供商来提供数字证书。
- IBM alphaWorks 的 KeyMan 是管理密钥、证书、CRL 以及存储和获取这些条目的相应存储库的工具。
- 在 developerWorks Java 技术专区 中可找到数百种 Java 技术资源。
- 请访问 Developer Bookstore,获取技术书籍的完整列表,其中包括数百本 Java 相关主题 的书籍。
- 是否对无需通常的高成本入口点(entry point )或短期评估许可证的 IBM 测试产品感兴趣? developerWorks Subscrīption 为 WebSphere®、DB2®、Lotus®、Rational® 和 Tivoli® 产品提供了低成本的 12 个月单用户许可证,包括基于 Eclipse 的 WebSphere Studio IDE,用于开发、测试、评估和展示您的应用程序。
- cacert.pem 是这个 CA 的 PEM 编码的(请参阅侧栏 PEM 文件格式)根证书。根证书验证由根私钥签名的证书。
-
如何进行升级测试
2007-4-04
如何进行升级测试
作者 Dhiraj P. Lokhande 译 g_win
什么是升级测试?比如说你们公司开发的产品现已经发布的是V1.0,由于被发现存在缺陷,这时就需开发Patch或Hot Fix,并进行升级测试,然后发布V1.1。
升级测试听起来似乎挺平常的,但它其实也是软件测试中比较重要的一部分,它通常包括以下内容:
- 安装测试
- 数据库测试
- 应用测试
- 文档测试
安装测试
当发布一个系统的新版本时,程序代码肯定是被修改过了,安装测试的目的是确保安装完成后修改过的文件被复制到了正确的位置,比如说某个文件夹包含了所有更新的HTML文件,这时就要检查相关的CSS文件夹下的文件是不是更新了,如果只更新了HTML而没更新CSS,那么相应的颜色/字体就不能正确地显示。
如果公司研发过程比较规范,安装测试通常是在配置管理员的配合下完成的。首先,是文件夹级的测试,检查安装过程中复制到系统中的文件夹的时间戳是否变化;其次,检查被修改过的文件的大小,并和之前的版本进行比较,当然,这分两种测试,如果是白盒测试,测试人员要打开相应的文件确认新代码和改过的代码,如果是黑盒测试,那就要检查文件大小应与旧版本的不同。
数据库测试
很多情况下,系统的升级都是伴随着数据库脚本的更新,数据库测试通常也是由DBA人员或在DBA的配合下进行。升级前要停止数据库并做备份,然后执行升级脚本,之后测试人员需要查看数据库日志,并检查库中被修改的记录是否正确。如果升级脚本是在库中创建一个新的Table或是新的Relation,那么数据库测试应该关注对空库的测试,比如先建一个空库V1.0,只包含一些空的Table和Relation,而不包含任何数据,然后测试人员执行升级脚本,并查看日志文件里是否有报错,如果没有报错一切ok,则通过应用程序连到数据库上执行一些功能测试用例来确保数据的Inset或Update都是正确的。
应用测试
当安装测试和数据库测试都通过之后,进行应用测试,有两种方法:
方法一:先配一个空的数据库(即除了一些必需的初始化数据再没有其他数据),然后把应用程序升级一下,执行业务流程测试看系统是否能够正常运行。
方法二:也是先配好数据库,但库里存有一些实际数据,然后把程序升级一下(比如从V1.0升至V1.1),运行应用程序,检查那些已有的数据在V1.1上是否也能被正确的展现和使用,最后执行业务流程测试看系统是否能够正常运行。
有的时候升级完后还要手工修改库中已有的记录,比如一个网上银行的系统,它里面有很多支付或转帐的数据,在做升级测试时,就可能要修改那些在上一版本中生成的数据,因为它们可能涉及到多个表之间的数据转换或一二级约束。
文档测试
文档测试主要是验证相关的版本说明或者安装手册等文档是否和系统升级相匹配,这点很重要,因为客户通常都是根据版本说明和安装手册进行系统的安装或升级。
进行文档测试必须理解详细的升级步骤,比如文档中应建议用户升级前要备份数据库、数据文件、配置文件等,再比如升级需要复制某些文件到特定目录,应当在版本说明中有所体现,总之,升级时任何必要的说明都应当在版本说明或安装手册内阐述清楚,安装时可以做什么以及不可以做什么都应在版本发布前得到确认。
-
在TD的测试用例中显示测试用例编号的方法
2006-11-29
就像Defect里每个bug都有一个ID一样,其实TD为每个测试用例(Test Case)也赋予了一个编号,默认是不显示的,如果希望在界面上让它显示出来,可以这么做:
步骤1
创建一个Object,类型为Number,命名之(随意,如TEST_ID)
步骤2
进入Customize->Set Up Workflow->scrīpt Editor,找到Test Plan module scrīpt->TestPlan_Test_moveto
步骤3
在TestPlan_Test_moveto这个过程内插入如下代码:
if TestPlan_Fields.Field("Test_ID").Value <> Test_Fields.Field
("TS_TEST_ID").Value then
Test_Fields.Field("Test_ID").Value = Test_Fields.Field("TS_TEST_ID").Value
end if
或者只插入下面这句:
Test_Fields.Field("TS_USER_01").Value = Test_Fields.Field("TS_TEST_ID").Value
步骤4
保存,退出,5min之后打开测试用例查看其编号
-
建议添加"测试管理"分类
2006-11-28
默认分类好像少了"测试管理"



