分类: Java
2008-10-28 16:17:58
正如您可能注意到的,数字签名方式有一个问题。它证实消息是由特定的发送方发送的,但我们怎么才能知道发送方确实是她所说的那个人呢?如果某人实际上是 Amanda,却自称 Alice,并对一条消息进行了签名,那会怎么样呢?我们可以通过使用数字证书来改进安全性,它将一个身份标识连同公钥一起进行封装,并由称为认证中心或 CA 的第三方进行数字签名。
从实际意义上来说,认证中心是验证某个实体的身份并用 CA 私钥对该实体的公钥和身份进行签名的组织。消息接收方可以获取发送方的数字证书并用 CA 的公钥验证(或解密)该证书。这可以证实证书是否有效,并允许接收方抽取发送方的公钥来验证其签名或向他发送加密的消息。浏览器和 JDK 本身都带有内置的来自几个 CA 的证书及其公钥。
JDK 1.4 支持 X.509 数字证书标准。
Java 平台将密钥库用作密钥和证书的资源库。从物理上讲,密钥库是缺省名称为 .keystore 的文件(有一个选项使它成为加密文件)。密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护;您可以选择让每个别名密码与主密钥库密码匹配。
Java 平台使用 keytool 来操作密钥库。这个工具提供了许多选项;下列示例演示了(keytool 示例)生成公钥对和相应的证书、以及通过查询密钥库查看结果的基本方法。
可以用 keytool 将密钥以 X.509 格式导出到文件中,由认证中心对该文件签名,然后将其重新导入到密钥库中。
还有一个用来保存认证中心(或其它可信的)证书的特殊密钥库,它又包含了用于验证其它证书有效性的公钥。这个密钥库称为 truststore。Java 语言在名为 cacerts 的文件中提供了缺省的 truststore。如果您搜索这个文件名,就会发现至少两个这样的文件。您可以使用下列命令显示其内容: