Junky's IT Notebook

统计

留言簿(8)

积分与排名

WebSphere Studio

阅读排行榜

评论排行榜

keytool - 密钥和证书管理工具(2)

证书
证书(也叫公钥证书)是来自某个实体(签发人)的经数字签名的声明,它声明另一实体(主体)的公钥(及其它信息)具有某一特定的值。
下面详细解释本句中使用的主要术语:
公钥
是与特定实体相关联的数字。所有需要与该实体进行信任交互的人都应知道该数字。公钥用于校验签名。
经数字签名
如果某些数据经数字签名,说明它们已与某一实体的“身份”存储在一起,而且证明该实体的签名知道这些数据。通过用该实体的私钥进行绘制,这些数据就是不可伪造的了。
身份
用于声明实体的一种手段。某些系统中,身份是公钥,而在另一些系统中则可以是 Unix UID、电子邮件地址或 X.509 特征名等等。
签名
所谓签名,就是用实体的(签名人,在证书中也称为签发人)私钥对某些数据进行计算。
私钥
是一些数字,每个数字都应仅被以该数字作为私钥的特定实体所知(即该数字应保密)。在所有公钥密码系统中,私钥和公钥均成对出现。在 DSA 等具体的公钥密码系统中,一个私钥只对应一个公钥。私钥用于计算签名。
实体
实体是您在某种程度上对其加以信任的个人、组织、程序、计算机、企业、银行等。
通常,公钥密码系统需要访问用户的公钥。在大型联网环境中,并不能确保通信实体之间已经预先建立起关系,也无法确保受信任的储存库与所用的公钥都存在。于是人们发明了证书作为公钥分配问题的解决办法。现在,认证机构 (CA) 可充当可信任的第三方。CA 是可信任的向其它实体签名(发放)证书的实体(例如企业)。由于 CA 受法律协议约束,因此可认为它们只提供可靠有效的证书。公共认证机构数量很多,例如 VeriSign、Thawte、Entrust 等等。您还可以使用诸如 Netscape/Microsoft Certificate Servers 或 Entrust CA 等产品来自己运营认证机构。
使用 keytool 可以显示、导入和导出证书。还可以产生自签名证书。
keytool 目前处理 X.509 证书。

X.509 证书
X.509 标准规定了证书可以包含什么信息,并说明了记录信息的方法(数据格式)。除了签名外,所有 X.509 证书还包含以下数据:
版本
识别用于该证书的 X.509 标准的版本,该版本影响证书中所能指定的信息。迄今为止,已定义的版本有三个。keytool 可导入和导出 v1、v2 和 v3 版的证书。它只能生成 v1 版证书。
序列号
发放证书的实体有责任为证书指定序列号,以使其区别于该实体发放的其它证书。此信息用途很多。例如,如果某一证书被撤消,其序列号将放到证书撤消清单 (CRL) 中。
签名算法标识符
用于标识 CA 签名证书时所用的算法。
签发人名称
签名证书的实体的 X.500 特征名。它通常为一个 CA。使用该证书意味着信任签名该证书的实体。注意:有些情况下(例如根或顶层 CA 证书),签发人会签名自己的证书。
有效期
每个证书均只能在一个有限的时间段内有效。该有效期以起始日期和时间及终止日期和时间表示,可以短至几秒或长至一世纪。所选有效期取决于许多因素,例如用于签名证书的私钥的使用频率及愿为证书支付的金钱等。它是在没有危及相关私钥的条件下,实体可以依赖公钥值的预计时间。
主体名
证书可以识别其公钥的实体名。此名称使用 X.500 标准,因此在Internet中应是唯一的。它是实体的 X.500 特征名 (DN),例如,
CN=Java Duke, OU=Java Software Division, O=Sun Microsystems Inc, C=US
(这些指主体的通用名、组织单位、组织和国家。)
主体公钥信息
这是被命名实体的公钥,同时包括指定该密钥所属公钥密码系统的算法标识符及所有相关的密钥参数。
X.509 1 版 1988 年发布,已得到广泛使用,是最常用的版本。
X.509 2 版引入了主体和签发人唯一标识符的概念,以解决主体和/或签发人名称在一段时间后可能重复使用的问题。大多数证书监视文档都极力建议不要重复使用主体或签发人名称,而且建议证书不要使用唯一标识符。版本 2 证书尚未得到广泛使用。
X.509 3 版是最新的版本(1996 年)。它支持扩展的概念,因此任何人均可定义扩展并将其纳入证书中。现在常用的扩展包括:KeyUsage(仅限密钥用于特殊目的,例如“只签名”)和 AlternativeNames(允许其它身份也与该公钥关联,例如 DNS 名、电子邮件地址、IP 地址)。扩展可标记为“极重要”,以表示该扩展应被检查并执行或使用。例如,如果某一证书将 KeyUsage 扩展标记为“极重要”,而且设置为“keyCertSign”,则在 SSL 通讯期间该证书出现时将被拒绝,因为该证书扩展表示相关私钥应只用于签名证书,而不应该用于 SSL。

证书中的所有数据均用两个名为 ASN.1/DER 的相关标准进行编码。抽象语法注释 1 (Abstract Syntax Notation 1) 描述数据。确定性编码规则 (Definite Encoding Rules) 描述储存和传输该数据的唯一方式。
X.500 特征名
X.500 特征名用于标识实体,例如 X.509 证书的 主体和签发人(签名人)域所命名的实体。keytool 支持以下的子组件:
commonName - 个人常用名,例如“Susan Jones”
organizationUnit - 小型组织(例如部门或分部)的名称,例如“Purchasing”
organizationName - 大型组织的名称,例如“ABCSystems, Inc.”
localityName - 地方(城市)名,例如“Palo Alto”
stateName - 州或省份名,例如“California”
country - 两个字母的国家代码,例如“CH”
当给出一个特征名字符串作为 -dname 选项的值时,例如 -genkey 或 -selfcert 命令中的该选项,字符串必须为以下格式:
CN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode
其中所有的斜体字代表实际值而上面的关键字是以下缩写:
CN=commonName
OU=organizationUnit
O=organizationName
L=localityName
S=stateName
C=country
以下是特征名字符串样本:
CN=Mark Smith, OU=JavaSoft, O=Sun, L=Cupertino, S=California, C=US
以下是使用这一字符串的样本命令:
keytool -genkey -dname "CN=Mark Smith, OU=JavaSoft, O=Sun, L=Cupertino,
S=California, C=US" -alias mark
大小写对关键字缩写无关紧要。例如,“CN”、“cn”和“Cn”都将被当作是一样的。
但顺序是有关系的;每个子组件必须按设计好的顺序出现。但是,不是所有子组件都必须有。可以只用一部分,例如:
CN=Steve Meier, OU=SunSoft, O=Sun, C=US
如果特征名字符串的值含有逗号,当在命令行指定该字符串时,逗号必须用“\”字符来进行转义,如下所示:
cn=peter schuster, o=Sun Microsystems\, Inc., o=sun, c=us
在命令行中指定特征名字符串是不必要的。如果某一命令需要指定特征名字符串,而在命令行中又未提供,则用户将得到每个子组件的提示。这种情况下,逗号不需要用“\”来转义。
Internet RFC 1421 证书编码标准
证书常用 Internet RFC 1421 标准中定义的可打印的编码格式来存储,而不是用其二进制编码来存储。这种证书格式,也称“Base 64 编码”,便于通过电子邮件或其它机制将证书导出到别的应用程序中。
用 -import 和 -printcert 命令读入的证书可以是这种格式的编码或是二进制格式的编码。
缺省情况下,-export 命令将以二进制编码格式输出证书,但如果指定了 -rfc 选项,则将以可打印的编码格式输出证书。
缺省情况下,-list 命令打印证书的 MD5 指纹。而如果指定了 -v 选项,将以可读格式打印证书,如果指定了 -rfc 选项,将以可打印的编码格式输出证书。
在其可打印的编码格式中,已编码证书的起始行是:
-----BEGIN CERTIFICATE-----
结束行是:
-----END CERTIFICATE-----
证书链
keytool 可创建和管理密钥仓库的“密钥”项,每个密钥项都含有私钥和相关证书“链”。链中的第一个证书含有与私钥对应的公钥。
当第一次产生密钥时(参见 -genkey 命令),链中只含有一个元素,即自签名证书。自签名证书是一个这样的证书:其签发人(签名人)与主体(证书所认证的公钥所属的实体)相同。当调用 -genkey 命令来生成新的公钥/私钥对时,它同时也把公钥打包进自签名证书中。
之后,当证书签名请求 (CSR) (参见 -certreq 命令)被生成并送至认证机构 (CA) 后,CA 的答复将被导入(参见 -import),证书链将取代自签名证书。在链的底部是认证主体公钥的 CA 所发放的证书(答复)。链中下一个证书是用于认证 CA 公钥的证书。


在许多情况下,这是个自签名证书(即来自认证其自身公钥的 CA 的证书)且是链中的最后一个证书。在其它情况下,CA 也许将返回证书链。这种情况下,链中底部的证书是相同的(由 CA 签名的证书,对密钥项的公钥进行认证),但链中第二个证书是由不同的 CA 所签名的,对您向其发送 CSR 的 CA 的公钥进行认证。然后,链中的下一个证书将是对第二个 CA 的公钥进行认证的证书,以此类推,直至到达自签名的“根”证书为止。因此,链中的每个证书(从第一个以后)都对链中前一个证书的签名人的公钥进行认证。
许多 CA 只返回所发放的证书,而不支持链,特别是当层次结构较简单时(无中介 CA)。这种情况下,必须用储存在密钥仓库中的可信任的证书信息来建立证书链。
另一种答复格式(由 PKCS#7 标准所定义)除了包含所签发的证书外,还支持证书链。两种答复格式都可由 keytool 处理。
顶层(根)CA 证书是自签名的。但是,对根公钥的信任并非来自根证书本身(任何人都可用特征名来产生自签名证书!譬如说用 VeriSign 根 CA 的特征名), 而是来自报纸之类的其它来源。根 CA 的公钥是广为人知的。它被储存在证书中的唯一原因是因为这是大多数工具所能理解的格式,因此这种情况下的证书只是作为一种传输根 CA 的公钥用的“交通工具”。在将根 CA 证书加到您的密钥仓库中之前,应该先对它进行查看(用 -printcert 选项)并将所显示的指纹与已知的指纹(从报纸、根 CA 的网页等中获取)进行比较。
导入证书
要从一个文件中导入某个证书,可用 -import 命令,如下所示:
keytool -import -alias joe -file jcertfile.cer
此样本命令导入文件 jcertfile.cer 中的证书并将其存储在由别名 joe 标识的密钥仓库项中。
导入证书的两个理由如下:
为将其添加到可信任的证书清单中,或
为导入因向 CA 提交证书签名请求(参见 -certreq 命令)而收到的来自该 CA 的认证答复。

-alias 选项的值指明要进行何种类型的导入。如果数据库中存在别名,且该别名标识具有私钥的项,则将假定您要导入认证答复。keytool 将检查认证答复中的公钥是否与用别名储存的私钥相匹配,如果两者不同,则程序退出。如果别名标识另一种类型的密钥仓库项,则不导入该证书。如果该别名不存在,则它将被创建并与导入的证书关联。
有关导入可信任证书的警告
重要:将证书作为可信任的证书导入之前,请务必先仔细检查该证书!
先查看一下(用 -printcert 命令,或用不带 -noprompt 选项的 -import 命令),确保所显示的证书指纹与所预计的相匹配。例如,假设某人给您送来或用电子邮件发来一个证书,您将它放在名为 /tmp/cert 的文件中。在将它加到可信任证书的清单中之前,可通过执行 -printcert 命令来查看它的指纹,如下所示:
keytool -printcert -file /tmp/cert
Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
Serial Number: 59092b34
Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997
Certificate Fingerprints:
MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F
SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE
然后给向您发送证书的人打电话或用其它方式联系,将您将您所看到的指纹与他们所提供的比较。只有两者相等才可保证证书在传送途中没有被其它人(例如,攻击者)的证书所更换。如果发生了这样的攻击,而您未检查证书即将其导入,您就会信任攻击者所签名的任何东西(例如,一个含有恶意类文件的 JAR 文件)。
注意:并不要求在导入证书前执行 -printcert 命令,因为在将证书添加到密钥仓库中可信任证书的清单中之前,-import 命令将会打印出该证书的信息,并提示您进行校验。这时,您可选择中止导入操作。但是注意,只有在调用不带 -noprompt 选项的 -import 命令时才能这样做。如果给出了 -noprompt 选项,则不存在与用户的交互

导出证书
要将证书导出到文件中,请用 -export 命令,如下所示:
keytool -export -alias jane -file janecertfile.cer
该样本命令将 jane 的证书导出到文件 janecertfile.cer 中。也就是说,如果 jane 是某个密钥项的别名,该命令将导出该密钥仓库项中所含证书链底部的证书。这是认证 jane 的公钥用的证书。
相反,如果 jane 是某个可信任证书项的别名,则导出的是该可信任的证书。
显示证书
要打印某个密钥仓库项的内容,请用 -list 命令,如下所示:
keytool -list -alias joe
如果未指定别名,如下所示:
keytool -list
则打印整个密钥仓库的内容。
要显示储存在文件中的证书的内容,请用 -printcert 命令,如下所示:
keytool -printcert -file certfile.cer
这将打印储存在文件 certfile.cer 中的有关证书的信息。
注意:此操作与密钥仓库无关,也就是说,不需要密钥仓库即可显示储存在文件中的证书。
生成自签名证书
自签名证书是一个这样的证书:其签发人(签名人)与主体(证书所认证的公钥所属的实体)相同。当调用 -genkey 命令来生成新的公钥/私钥对时,它同时也把公钥打包进自签名证书中。
有时您也许希望生成新的自签名证书。例如,您也许想对不同身份(特征名)使用相同的密钥对。例如,假设您换了个部门。此时您可以:
复制原始的密钥项。请参见 -keyclone。
用新特征名为该复制项生成新的自签名证书。参见下文。
为该复制项生成证书签名请求,并导入答复证书或证书链。参见 -certreq 和 -import 命令。
删除原始(现在已过时)项。参见 -delete 命令。
要生成自签名证书,请用 -selfcert 命令,如下所示:
keytool -selfcert -alias dukeNew -keypass b92kqmp
-dname "cn=Duke Smith, ou=Purchasing, o=BlueSoft, c=US"
所生成的证书作为指定别名(本例中为“dukeNew”)所标识的密钥仓库项中的单元素证书来存储,它将取代现有的证书链。
命令和选项注意事项
下面列出各种命令及其选项,并对它们进行描述。注意:
所有的命令和选项名之前都有减号 (-) 。
每个命令的选项都可按任意顺序提供。
所有非斜体项或不在花括号和方括号内的项都不能改动。
选项周围的花括号通常表示如果在命令行中没有指定该选项,则使用缺省值。花括号还用在 -v、-rfc 和 -J 选项周围,这些选项只有在命令行中出现时才有意义(也就是说,它们没有任何缺省值,不然就是不存在该选项)。
选项周围的方括号表示如果在命令行中没有指定该选项,则用户将得到要求输入其值的提示。(对于 -keypass 选项,如果在命令行中没有指定该选项,keytool 将先是尝试用密钥仓库口令来访问私钥,如果失败,再提示您输入私钥口令。)
斜体项(选项)代表必须提供实际值。例如,下面是 -printcert 命令的格式:
keytool -printcert {-file cert_file} {-v}
当指定 -printcert 命令时,请用实际文件名来替代 cert_file,如下所示:
keytool -printcert -file VScert.cer
如果选项值含有空白(空格),必须用引号把它们括起来。
-help 命令是缺省命令。因此,命令行
keytool
等价于
keytool -help
选项缺省值
下面是各选项的缺省值。
-alias "mykey"
-keyalg "DSA"
-keysize 1024
-validity 90
-keystore 用户宿主目录中名为 .keystore 的文件
-file 读时为标准输入,写时为标准输出

签名算法(-sigalg 选项)是由所涉及私钥的算法推导而来的:如果所涉及的私钥是“DSA”类型,则 -sigalg 选项将缺省为“带 DSA 的 SHA1”,如果所涉及的私钥是“RSA”类型,则 -sigalg 选项将缺省为“带 RSA 的 MD5”。
出现在大多数命令中的选项
-v 选项可出现在除 -help 之外的所有命令中。如果出现该选项,表示处在“长格式”模式下;将输出详细的证书信息。
-Jjavaoption 选项也可在任何命令中出现。如果出现该选项,则所指定的 javaoption 字符串将被直接传给 Java 解释器。(keytool 实际上是解释器周围的一个 “wrapper”。) 该选项不应含有任何空格。它有助于调整执行环境或内存使用。要获得可用的解释器选项的清单,可在命令行键入 java -h 或 java -X。
有三个选项可出现在用于操作密钥仓库的所有命令中:
-storetype storetype
此限定符指定将被实例化的密钥仓库类型。缺省的密钥仓库类型是安全属性文件中“keystore.type”属性值所指定的那个类型,由 java.security.KeyStore 中的静态方法 getDefaultType 返回。
-keystore keystore
密钥仓库(数据库文件)的位置。缺省情况下,密钥仓库指的是用户宿主目录的 .keystore 文件,它是由“user.home”的系统属性确定的。在 Solaris 系统中,“user.home”缺省为用户宿主目录。
-storepass storepass
口令,用来保护密钥仓库的完整性。
storepass 的长度必须至少为 6 个字符。所有访问密钥仓库内容的命令都必须提供这一选项。对于这些命令,如果没有给出 -storepass 选项,则用户将得到要求输入该选项的提示。
当从密钥仓库中检索信息时,口令属于可选项;如果未给出口令,就不能检查所检索信息的完整性,而且将出现警告。
使用口令时必须小心 - 参见与口令有关的警告。
与口令有关的警告
大多数对密钥仓库操作的命令都要求仓库口令。一些命令要求私钥口令。
口令可以在命令行上(分别在 -storepass 和 -keypass 选项上)指定。但是,除非是作为测试目的或是在一个安全的系统上,否则不应在命令行或脚本中指定口令。
如果没有在命令行上指定所要求的口令选项,您将会得到要求输入口令的提示。当在口令提示符下键入口令时,口令将被即时地显示出来(键入什么就显示什么),因此,要小心,不要当着任何人的面键口令。
命令
另请参阅命令和选项注释。
向密钥仓库添加数据
-genkey {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
产生密钥对(公钥和与之关联的私钥)。将公钥打包进 X.509 v1 的自签名证书中,该证书以单元素证书链的形式储存。该证书链和私钥将储存于 alias 所标识的新密钥仓库项中。
keyalg 指定了用于生成密钥对的算法,而 keysize 指定要生成的每个密钥的大小。sigalg 指定签名自签名证书所用的算法;这一算法必须与 keyalg 兼容。参见支持的算法和密钥大小。
dname 指定与 alias 关联的 X.500 特征名,并用作自签名证书中的 issuer 和 subject 域。如果在命令行中没有提供特征名,用户将得到要求输入该信息的提示。
keypass 是口令,用来保护所生成密钥对中的私钥。如果没有提供口令,用户将得到要求输入口令的提示。如果在提示符下按 RETURN 键,则密钥口令将被设置为与密钥仓库所用的口令相同。keypass 的长度必须至少为 6 个字符。使用口令时必须小心 - 参见 与口令有关的警告。
valDays 指定证书的有效期。
-import {-alias alias} {-file cert_file} [-keypass keypass] {-noprompt} {-trustcacerts} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-v} {-Jjavaoption}
从文件 cert_file 中读取证书或证书链(后者在 PKCS#7 格式的答复所给出)并将其储存在 alias 所标识的密钥仓库项中。如果没有给出文件,则从标准输入设备中读取证书或 PKCS#7 答复。keytool 可导入 X.509 v1、v2 和 v3 的证书以及由该类证书所组成的 PKCS#7 格式的证书链。要导入的数据必须是二进制编码格式或 Internet RFC 1421 标准所定义的可打印的编码格式(也称 Base64 编码)。在后一种情况下,编码必须用以“-----BEGIN”开头的字符串开始,用以“-----END”结尾的字符串来结束。

posted on 2007-05-18 17:18 junky 阅读(806) 评论(0)  编辑  收藏 所属分类: security


只有注册用户登录后才能发表评论。


网站导航: