Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9267561
  • 博文数量: 1669
  • 博客积分: 16831
  • 博客等级: 上将
  • 技术积分: 12594
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 07:23
个人简介

柔中带刚,刚中带柔,淫荡中富含柔和,刚猛中荡漾风骚,无坚不摧,无孔不入!

文章分类

全部博文(1669)

文章存档

2023年(4)

2022年(1)

2021年(10)

2020年(24)

2019年(4)

2018年(19)

2017年(66)

2016年(60)

2015年(49)

2014年(201)

2013年(221)

2012年(638)

2011年(372)

分类: 系统运维

2011-12-30 19:26:23

Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的 数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。

Keytool是一个Java数据证书的管理工具。

keystore
Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:
密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
可信任的证书实体(trusted certificate entries)——只包含公钥

Alias(别名)
每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写

keystore的存储位置
在没有制定生成位置的情况下,keystore会存在与用户的系统默认目录,
如:对于window xp系统,会生成在系统的C:\Documents and Settings\UserName\
文件名为“.keystore”

keystore的生成

引用keytool -genkey -alias tomcat -keyalg RSA   -keystore d:\mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass -validity 180

参数说明:
-genkey表示要创建一个新的密钥
-dname表示密钥的Distinguished Names, 表明了密钥的发行者身份
CN=commonName
OU=organizationUnit
O=organizationName
L=localityName
S=stateName
C=country
-keyalg使用加密的算法,这里是RSA
-alias密钥的别名
-keypass私有密钥的密码,这里设置为changeit
-keystore 密钥保存在D:盘目录下的mykeystore文件中
-storepass 存取密码,这里设置为changeit,这个密码提供系统从mykeystore文件中将信息取出
-validity该密钥的有效期为 180天 (默认为90天)


1,产生一个密钥对
keytool -genkey -alias mykeypair -keypass mykeypairpwd
这样将产生一个keypair,同时产生一个keystore.默认名是.keystore,存放到user-home目录
假如你想修改密码,可以用:keytool -keypasswd -alias mykeypair -keypass mykeypairpwd -new newpass
2,产生一个密钥对,存放在指定的keystore中(加上-keystore 参数)
keytool -genkey -alias mykeypair -keypass mykeypairpwd -keystore mykeystore
过程与上面的相同。
执行完后,在当前目录下产生一个名为mykeystore的keystore,里面有一个别名为mykeypair的keypair。
3,检查一个keystore中的内容
keytool -list -v -alias mykeypair -keystore mykeystore
参数    -v指明要列出详细信息
-alias指明列出指定的别名为mykeypair的keypair信息(不指定则列出所有)
-keystore指明要列出名字为mykeystore的keystore中的信息

4,Keystore的产生:
当使用-genkey 或-import或-identitydb命令添加数据到一个keystore,而当这个keystore不存在时,产生一个keystore.默认名是.keystore,存放到user-home目录.
当用-keystore指定时,将产生指定的keystore.

5,Keystore的实现:
Keytool 类位于java.security包下,提供一个非常好的接口去取得和修改一个keystore中的信息. 目前有两个命令行:keytool和jarsinger,一个GUI工具Policy 可以实现keystore.由于keystore是公开的,用户可以用它写一些额外的安全应用程序.
Keystore还有一个sun公司提供的內在实现.它把keystore作为一个文件来实现.利用了一个keystore类型(格式)"JKS".它用单独的密码保护每一个私有钥匙.也用可能不同的密码保护整个keystore的完整性.
支持的算法和钥匙大小:
keytool允许用户指定钥匙对和注册密码服务供应者所提供的签名算法.缺省的钥匙对产生算法是"DSA".假如私有钥匙是"DSA"类型,缺省签名算法是"SHA1withDSA",假如私有钥匙是"RSA"类型,缺省算法是"MD5withRSA".
当产生一个DSA钥匙对,钥匙必须在512-1024位之间.对任何算法的缺省钥匙大小是1024位.

6,关于证书
一个证书是一个实体的数字签名,还包含这个实体的公共钥匙值.
公共钥匙 :是一个详细的实体的数字关联,并有意让所有想同这个实体发生信任关系的其他实体知道.公共钥匙用来检验签名;
数字签名:是实体信息用实体的私有钥匙签名(加密)后的数据.这条数据可以用这个实体的公共钥匙来检验签名(解密)出实体信息以鉴别实体的身份;      
签名:用实体私有钥匙加密某些消息,从而得到加密数据;
私有钥匙:是一些数字,私有和公共钥匙存在所有用公共钥匙加密的系统的钥匙对中.公共钥匙用来加密数据,私有钥匙用来计算签名.公钥加密的消息只能用私钥解密,私钥签名的消息只能用公钥检验签名。
实体:一个实体可以是一个人,一个组织,一个程序,一台计算机,一个商业,一个银行,或其他你想信任的东西.
实际上,我们用[1]中的命令已经生成了一个自签名的证书,没有指定的参数都使用的是默认值。
我们也可以用如下命令生成一个自签名的证书:
keytool -genkey -dname "CN=fingki,OU=server,O=server,L=bj,ST=bj,C=CN" -alias myCA -keyalg RSA -keysize 1024 -keystore myCALib -keypass 654321 -storepass 123456 -validity 3650
这条命令将生成一个别名为myCA的自签名证书,证书的keypair的密码为654321,证书中实体信息为 "CN=fingki,OU=server,O=server,L=bj,ST=bj,C=CN",存储在名为myCALib的keystore中(如果 没有将自动生成一个),这个keystore的密码为123456,密钥对产生的算法指定为RSA,有效期为10年。
7,将证书导出到证书文件
keytool -export -alias myCA -file myCA.cer -keystore myCALib -storepass 123456 -rfc
使用该命令从名为myCALib的keystore中,把别名为myCA的证书导出到证书文件myCA.cer中。(其中-storepass指定keystore的密码,-rfc指定以可查看编码的方式输出,可省略)。

8,通过证书文件查看证书信息
keytool -printcert -file myCA.cer

9,密钥库中证书条目口令的修改
Keytool -keypasswd -alias myCA -keypass 654321 -new newpass -storepass 123456 -keystore myCALib

10,删除密钥库中的证书条目
keytool -delete -alias myCA -keystore myCALib

11,把一个证书文件导入到指定的密钥库
keytool -import -alias myCA -file myCA.cer -keystore truststore
(如果没有名为truststore的keystore,将自动创建,将会提示输入keystore的密码)

12,更改密钥库的密码
keytool -storepasswd -new 123456 -storepass 789012 -keystore truststore
其中-storepass指定原密码,-new指定新密码。

将[keystore]导入java信任证书库

keytool -import -trustcacerts -alias tomcat_pso -file [keystore] -keypass changeit -keystore "%JAVA_HOME%/jre/lib/security/cacerts"

注:%JAVA_HOME%/jre/lib/security/cacerts为java自带的证书库,默认密码为changeit

keytool -list -v -keystore c:/jdk15/jre/lib/security/cacerts (列出信任库中已经存在的证书)
keytool -delete -trustcacerts -alias tomcat -keystore c:/jdk15/jre/lib/security/cacerts -storepass changeit(删除某一个证书)

13 把X509证书导入到keystore
keytool -importcert -file cacert.pem -alias cacert -keystore mykeystore
 
 
数字证书中keytool命令使用说明

这个命令一般在JDK\jre\lib\security\目录下操作
keytool常用命令
-alias       产生别名
-keystore    指定密钥库的名称(就像数据库一样的证书库,可以有很多个证书,cacerts这个文件是jre自带的,
             你也可以使用其它文件名字,如果没有这个文件名字,它会创建这样一个)
-storepass   指定密钥库的密码
-keypass     指定别名条目的密码
-list        显示密钥库中的证书信息
-v           显示密钥库中的证书详细信息
-export      将别名指定的证书导出到文件
-file        参数指定导出到文件的文件名
-delete      删除密钥库中某条目
-import      将已签名数字证书导入密钥库
-keypasswd   修改密钥库中指定条目口令
-dname       指定证书拥有者信息
-keyalg      指定密钥的算法
-validity    指定创建的证书有效期多少天
-keysize     指定密钥长度

使用说明:
导入一个证书命令可以如下:
keytool -import -keystore cacerts -storepass 666666 -keypass 888888 -alias alibabacert -file C:\alibabajava\cert\test_root.cer
其中-keystore cacerts中的cacerts是jre中默认的证书库名字,也可以使用其它名字
-storepass 666666中的666666是这个证书库的密码
-keypass 888888中的888888是这个特定证书的密码
-alias alibabacert中的alibabacert是你导入证书的别名,在其它操作命令中就可以使用它
-file C:\alibabajava\cert\test_root.cer中的文件路径就是要导入证书的路径

浏览证书库里面的证书信息,可以使用如下命令:
keytool -list -v -alias alibabacert -keystore cacerts -storepass 666666

要删除证书库里面的某个证书,可以使用如下命令:
keytool -delete -alias alibabacert -keystore cacerts -storepass 666666

要导出证书库里面的某个证书,可以使用如下命令:
keytool -export -keystore cacerts -storepass 666666 -alias alibabacert -file F:\alibabacert_root.cer

要修改某个证书的密码(注意:有些数字认证没有私有密码,只有公匙,这种情况此命令无效)
这个是交互式的,在输入命令后,会要求你输入密码
keytool -keypasswd -alias alibabacert -keystore cacerts
这个不是交互式的,输入命令后直接更改
Keytool -keypasswd -alias alibabacert -keypass 888888 -new 123456 -storepass 666666 -keystore cacerts

以上转自:http://fruitking.javaeye.com/blog/435971

 

Owner: CN=BOCTestCA, O=BOCTest, C=CN

Issuer: CN=BOCTestCA, O=BOCTest, C=CN

Serial number: 31e60001

Valid from: Tue Oct 28 16:54:26 CST 2008 until: Sat Oct 28 16:54:26 CST 2028

Certificate fingerprints:

         MD5:  F0:35:F9:69:31:AE:87:01:6C:2D:56:BD:02:0A:16:4A

         SHA1: 24:EF:84:14:4E:BD:0D:37:59:2D:70:28:79:10:88:EA:0A:06:13:20

         Signature algorithm name: SHA1withRSA

         Version: 3

 

Extensions:

 

#1: ObjectId: 2.5.29.19 Criticality=true

BasicConstraints:[

  CA:true

  PathLen:2147483647

]

 

#2: ObjectId: 2.5.29.15 Criticality=false

KeyUsage [

  DigitalSignature

  Non_repudiation

  Key_Encipherment

  Data_Encipherment

  Key_Agreement

  Key_CertSign

  Crl_Sign

]

 

#3: ObjectId: 2.5.29.14 Criticality=false

SubjectKeyIdentifier [

KeyIdentifier [

0000: E3 81 66 00 7B C9 8F 3F   5A 77 E0 6D 5C EB 41 42  ..f....?Zw.m\.AB

0010: C7 48 5A 10                                        .HZ.

]

]

 

#4: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false

AuthorityInfoAccess [

  [

   accessMethod: 1.3.6.1.5.5.7.48.1

   accessLocation: URIName: ]

]

 

#5: ObjectId: 2.5.29.31 Criticality=false

CRLDistributionPoints [

  [DistributionPoint:

     [CN=crl1, OU=crl, O=BOCTest, C=CN]

]]

 

#6: ObjectId: 2.5.29.32 Criticality=false

CertificatePolicies [

  [CertificatePolicyId: [2.5.29.32.0]

[PolicyQualifierInfo: [

  qualifierID: 1.3.6.1.5.5.7.2.1

  qualifier: 0000: 16 1E 68 74 74 70 3A 2F   2F 31 38 32 2E 31 31 39  ..

82.119

0010: 2E 31 37 31 2E 31 30 36   2F 63 70 73 2E 68 74 6D  .171.106/cps.htm

 

]]  ]

]

 

#7: ObjectId: 2.16.840.1.113730.1.1 Criticality=false

NetscapeCertType [

   SSL CA

   S/MIME CA

   Object Signing CA]

 

#8: ObjectId: 2.5.29.35 Criticality=false

AuthorityKeyIdentifier [

KeyIdentifier [

0000: E3 81 66 00 7B C9 8F 3F   5A 77 E0 6D 5C EB 41 42  ..f....?Zw.m\.AB

0010: C7 48 5A 10                                        .HZ.

]

 

]

 

Trust this certificate? [no]:  yes

Certificate was added to keystore

[root@orange3c bin]#

NOTE: (xp: %JAVA_HOME%/jre/lib/security/cacerts,  linux: $JAVA_HOME/jre/lib/security/cacerts)

验证是否已创建过同名的证书
keytool -list -v -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/cacerts " -storepass changeit


删除已创建的证书
keytool -delete -alias tomcat -keystore "%%JAVA_HOME%/jre/lib/security/cacerts " -storepass changeit

Keytool是一个Java数据证书的管理工具。
keystore

Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中
在keystore里,包含两种数据: 密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
                                               可信任的证书实体(trusted certificate entries)——只包含公钥

Alias(别名)
每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写

keystore的存储位置
在没有制定生成位置的情况下,keystore会存在与用户的系统默认目录,
如:对于window xp系统,会生成在系统的C:\Documents and Settings\UserName\
文件名为“.keystore”

keystore的生成

引用

keytool -genkey -alias tomcat -keyalg RSA   -keystore d:\mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass -validity 180

参数说明:
-genkey表示要创建一个新的密钥
-dname表示密钥的Distinguished Names,
CN=commonName
OU=organizationUnit
O=organizationName
L=localityName
S=stateName
C=country
Distinguished Names表明了密钥的发行者身份
-keyalg使用加密的算法,这里是RSA
-alias密钥的别名
-keypass私有密钥的密码,这里设置为changeit
-keystore 密钥保存在D:盘目录下的mykeystore文件中
-storepass 存取密码,这里设置为changeit,这个密码提供系统从mykeystore文件中将信息取出
-validity该密钥的有效期为 180天 (默认为90天)

cacerts证书文件(The cacerts Certificates File)
该证书文件存在于java.home\jre\lib\security目录下,是Java系统的CA证书仓库

创建证书
1.服务器中生成证书:(注:生成证书时,CN要和服务器的域名相同,如果在本地测试,则使用localhost)
keytool -genkey -alias tomcat -keyalg RSA -keystore d:\mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass changeit -storepass changeit
2.导出证书,由客户端安装:
keytool -export -alias tomcat -keystore d:\mykeystore -file d:\mycerts.cer -storepass changeit
3.客户端配置:为客户端的JVM导入密钥(将服务器下发的证书导入到JVM中)
keytool -import -trustcacerts -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/cacerts " -file d:\mycerts.cer -storepass changeit
生成的证书可以交付客户端用户使用,用以进行SSL通讯,或者伴随电子签名的jar包进行发布者的身份认证。

常出现的异常:“未找到可信任的证书”--主要原因为在客户端未将服务器下发的证书导入到JVM中,可以用
keytool -list -alias tomcat -keystore "%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS" -storepass changeit

linux: #keytool -list -alias tomcat -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit
来查看证书是否真的导入到JVM中。

 

keytool生成根证书时出现如下错误:

keytool错误:java.io.IOException:keystore was tampered with,or password was incorrect

原因是在你的home目录下是否还有.keystore存在。如果存在那么把他删除掉,然后再执行

或者删除"%JAVA_HOME%/jre/lib/security/cacerts 再执行


 

keytool 用法:

-certreq     [-v] [-protected]

             [-alias <别名>] [-sigalg ]

             [-file ] [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-changealias [-v] [-protected] -alias <别名> -destalias <目标别名>

             [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-delete      [-v] [-protected] -alias <别名>

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-exportcert  [-v] [-rfc] [-protected]

             [-alias <别名>] [-file <认证文件>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-genkeypair  [-v] [-protected]

             [-alias <别名>]

             [-keyalg ] [-keysize <密钥大小>]

             [-sigalg ] [-dname ]

             [-validity ] [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-genseckey   [-v] [-protected]

             [-alias <别名>] [-keypass <密钥库口令>]

             [-keyalg ] [-keysize <密钥大小>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-importcert  [-v] [-noprompt] [-trustcacerts] [-protected]

             [-alias <别名>]

             [-file <认证文件>] [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-importkeystore [-v]

             [-srckeystore <源密钥库>] [-destkeystore <目标密钥库>]

             [-srcstoretype <源存储类型>] [-deststoretype <目标存储类型>]

             [-srcstorepass <源存储库口令>] [-deststorepass <目标存储库口令>]

             [-srcprotected] [-destprotected]

             [-srcprovidername <源提供方名称>]

             [-destprovidername <目标提供方名称>]

             [-srcalias <源别名> [-destalias <目标别名>]

               [-srckeypass <源密钥库口令>] [-destkeypass <目标密钥库口令>]]

             [-noprompt]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-keypasswd   [-v] [-alias <别名>]

             [-keypass <旧密钥库口令>] [-new <新密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-list        [-v | -rfc] [-protected]

             [-alias <别名>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]


-printcert   [-v] [-file <认证文件>]


-storepasswd [-v] [-new <新存储库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]] ...

             [-providerpath <路径列表>]

if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = false; var cb_blogId = 58475; var cb_entryId = 1826990; var cb_blogApp = "benio"; var cb_blogUserGuid = "c6c4b644-a76f-de11-9510-001cf0cd104b"; var cb_entryCreatedDate = '2010/9/15 14:32:00';
 
JAVA Keytool命令详解
127人阅读 评论(0) 举报

JAVA Keytool 常用命令使用帮助

Keytool 是用于管理密钥和证书的工具,使用户和管理员能管理自己的公 / 私钥对以及相关的证书。

genkey ,用于生成公 / 私密钥对

keytool –genkey –alias mykey –keyalg RSA –keypass 123456 –keystore keystore.jks –storepass 123456

ˉkeyalg: 指定密钥使用的加密算法(如 RSA )。还可以使用选项 keysize 指定密钥的长度,如果没有指定长度,那么 keytool 将使用默认值 ———1024 位。
       ˉkeypass:
指定生成密钥的密码。
       ˉkeystore:
指定存储密钥的密钥库的名称(二进制文件),如果没有指定,那么将创建一个新的密钥库,并将其存储为 .keystore 文件。
       ˉstorepass:
指定访问密钥库的密码。密钥库创建后,要对其做任何修改都必须提供该密码,以便访问密钥库。
      
在执行 -genkey 时还会要求用户输入以下几项数据

CN       commen name

OU unit

O         organization

L          location

ST        state

C:           country

其中 CN 服务器根证书的 ip 或者域名,即查看证书时的颁发给项

list

用于列出密钥库中全部的项,以及查看与别名相关的项。

keytool –list –keystore keystore.jks

为了显示别名所指定的密钥库项的内容,命令 list 可以输出证书的 MD5 指纹。如果指定了选项 ˉv ,则证书将以人类可读的格式显示 ; 如果指定了选项 ˉrfc ,则将以 Base64 编码格式显示证书。

import

导入可信证书。 Keytool 选项 ˉimport 用于将可信证书导入密钥库,并将其同唯一的一个别名联系起来。如果客户端信任通信等对体的证书,并希望与其进行可信的客户端交互,则可以在客户端环境中导入可信证书。
将新证书导入密钥库时, keytool 工具将验证该证书的完整性和真实性。为此, keytool 工具将构建一条以该证书开始到颁发者的自签名证书结束的信任链。可信证书的列表将存储在 cacerts 文件中。
要将证书导入密钥库,则需要提供标识证书项的唯一 别名和密钥密码。

例如,下面的命令从文件 cert.cer 中将一个证书项导入到密钥库 keystore.jks ,并将该证书项标识为 newcert ,最后,该命令将显示证书的持有者和颁发者的信息,并询问用户是否信任该证书

keytool –import –alias newcert –file cert.cer –keystore keystore.jks

printcert

显示证书的信息。 Keytool 选项 ˉprintcert 用于显示已从密钥库中导出并存储为文件的证书的信息。由于证书的信息是以证书文件( .cer )的形式存储的,且不会导入密钥库,因此在执行该命令时,不需要指定相关的密钥库和密码。
       keytool –printcert –file cert.cer

certReq

创建证书签发请求( CSR )。可以使用 Keytool 选项 ˉcertreq 来生成向 CA 申请证书的证书签发请求。

keytool –certReq –keystore keystore.jks –file mycsr.csr

delete

删除密钥库。要删除密钥库,可以使用操作系统的删除命令来删除该密钥库文件。
修改密钥库的密码。

storepasswd

要修改密钥库的密码,可以使用 keytool 选项 -storepasswd -new 来设置新密码。

keytool –storepasswd –new newpassword –keystore keystore.jks

 

管理由私钥和认证相关公钥的 X.509 证书链组成的密钥仓库(数据库)。还管理来自可信任实体的证书。
结构
keytool [ 命令 ]
说明
keytool 是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。
证书是来自一个实体(个人、公司等)的经数字签名的声明,它声明某些其它实体的公钥(及其它信息)具有某一的特定值(参见证书)。当数据被数字化签名后,校验签名即可检查数据的完整性和真实性。完整性的意思是数据没有被修改或损坏过,真实性的意思是数据的确是来自声称创建了该数据和对它进行了签名的实体。

keytool 将密钥和证书储存在一个所谓的密钥仓库中。缺省的密钥仓库实现将密钥仓库实现为一个文件。它用口令来保护私钥。

jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名 (JAR 文件将类文件、图象、声音和/或其它数字化数据打包在一个文件中)。jarsigner 用 JAR 文件所附带的证书(包含于 JAR 文件的签名块文件中)来校验 JAR 文件的数字签名,然后检查该证书的公钥是否“可信任”,即是否包括在指定的密钥仓库中。

请注意:keytool 和 jarsigner 工具完全取代了 JDK 1.1 中提供的 javakey 工具。这些新工具所提供的功能比 javakey 提供的多,包括能够用口令来保护密钥仓库和私钥,以及除了能够生成签名外还可以校验它们。新的密钥仓库体系结构取代了 javakey 所创建和管理的身份数据库。可以利用 -identitydb keytool 命令将信息从身份数据库导入 密钥仓库。

密钥仓库项
在密钥仓库中有两种不同类型的项:
  
密钥项 - 每项存放极为敏感的加密密钥信息,这种信息以一种受保护的格式储存以防止未授权的访问。通常,储存在这类项中的密钥是机密密钥,或是伴有用于认证相应公钥用的证书“链”的私钥。keytool 和 jarsigner 工具只处理后一类型的项,即私钥及其关联的证书链。
可信任的证书项 - 每项包含一个属于另一团体的公钥证书。它之所以叫做“可信任的证书”,是因为密钥仓库的拥有者相信证书中的公钥确实属于证书“主体”(拥有者)识别的身份。证书签发人通过对证书签名来保证这点。
密钥仓库使用的别名
对所有的密钥仓库项(密钥项和可信任的证书项)的访问都要通过唯一的别名来进行。别名不区分大小写,即别名 Hugo 和 hugo 指的是同一密钥仓库项。
当用 -genkey 命令来生成密钥对(公钥和私钥)或用 -import 命令来将证书或证书链加到可信任证书的清单中,以增加一个实体到密钥仓库中,必须指定了一个别名。后续 keytool 命令必须使用这一相同的别名来引用该实体。

例如,假设您用别名 duke 生成了新的公钥/私钥密钥对并将公钥用以下命令打包到自签名证书中(参见证书链):

     keytool -genkey -alias duke -keypass dukekeypasswd
这指定了一个初始口令“dukekeypasswd”,接下来的命令都要使用该口令才能访问与别名 duke 相关联的私钥。以后如果您想更改 duke 的私钥口令,可用类似下述的命令:
     keytool -keypasswd -alias duke -keypass dukekeypasswd -new newpass
这将把口令从“dukekeypasswd”改为“newpass”。
请注意:实际上,除非是作为测试目的或是在安全的系统上,否则不应在命令行或脚本中指定口令。如果没有在命令行上指定所要求的口令选项,您将会得到要求输入口令的提示。当在口令提示符下键入口令时,口令将被即时显示出来(键入什么就显示什么),因此,要小心,不要当着任何人的面键入口令。

密钥仓库位置
每个 keytool 命令都有一个 -keystore 选项,用于指定 keytool 管理的密钥仓库的永久密钥仓库文件名称及其位置。缺省情况下,密钥仓库储存在用户宿主目录(由系统属性的“user.home”决定)中名为 .keystore 的文件中。在 Solaris 系统中“user.home”缺省为用户的宿主目录。
密钥仓库的创建
当用 -genkey、-import 或 -identitydb 命令向某个尚不存在的密钥仓库添加数据时,就创建了一个密钥仓库。
具体地说,如果在 -keystore 选项中指定了一个并不存在的密钥仓库,则该密钥仓库将被创建。

如果不指定 -keystore 选项,则缺省密钥仓库将是宿主目录中名为 .keystore 的文件。如果该文件并不存在,则它将被创建。

密钥仓库实现
java.security 包中提供的 KeyStore 类为访问和修改密钥仓库中的信息提供了相当固定的接口。可以有多个不同的具体实现,其中每个实现都是对某个特定类型的密钥仓库的具体实现。
目前,有两个命令行工具(keytool 和 jarsigner)以及一个名为 Policy Tool 的基于 GUI 的工具使用密钥仓库实现。由于密钥仓库是公用的,JDK 用户可利用它来编写其它的安全性应用程序。

Sun Microsystems 公司提供了一个内置的缺省实现。它利用名为“JKS” 的专用密钥仓库类型(格式),将密钥仓库实现为一个文件。它用个人口令保护每个私钥,也用口令(可能为另一个口令)保护整个密钥仓库的完整性。

密钥仓库的实现基于提供者 (provider)。更具体地说,由密钥仓库所提供的应用程序接口是借助于“服务提供者接口”(SPI) 来实现的。也就是说,在 java.security 包中还有一个对应的抽象 KeystoreSpi 类,它定义了“提供者”必须实现的服务提供者接口方法。(术语“提供者”指的是一个或一组包,这个或这组包提供了一部份可由 Java 安全 API 访问的服务子集的具体实现。因此,要提供某个密钥仓库实现,客户机必须实现一个“提供者”并实现 KeystoreSpi 子类,如如何为 Java 加密体系结构实现 Provider 中所述。

通过使用 KeyStore 类中提供的“getInstance”工厂方法,应用程序可从不同的提供者中挑选不同类型的密钥仓库实现。密钥仓库类型定义密钥仓库信息的存储和数据格式,以及用于保护密钥仓库中的私钥和密钥仓库自身完整性的算法。不同类型的密钥仓库实现是不兼容的。

keytool 使用基于文件的密钥仓库实现(它把在命令行中传递给它的密钥仓库位置当成文件名处理并将之转换为文件输入流,从该文件输入流中加载密钥仓库信息)。另一方面,jarsigner 和 policytool 工具可从任何可用 URL 指定的位置读取某个密钥仓库。

对于 keytool 和 jarsigner,可在命令行用 -storetype 选项指定密钥仓库类型。对于 Policy Tool,可通过 “编辑”菜单中的“更改密钥仓库”命令来指定密钥仓库类型。

如果没有明确指定一个密钥仓库类型,这些工具将只是根据安全属性文件中指定的 keystore.type 属性值来选择密钥仓库实现。安全属性文件名为 java.security,它位于 JDK 安全属性目录 java.home/lib/security 中,其中 java.home 为 JDK 的安装目录。

每个工具都先获取 keystore.type 的值,然后检查所有当前已安装的提供者直到找到一个实现所要求类型的密钥仓库的实现为止。然后就使用该提供者的密钥仓库实现。

KeyStore 类定义了一个名为 getDefaultType 的静态方法,它可让应用程序或 applet 检索 keystore.type 属性的值。以下代码将创建缺省密钥仓库类型(此类型由 keystore.type 属性所指定。)的一个实例:

     KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
缺省的密钥仓库类型是“jks”(这是由“SUN”提供者提供的密钥仓库实现的专用类型)。它在安全性属性文件中由下行进行指定:
     keystore.type=jks
要让工具使用不同于缺省类型的密钥仓库实现,可更改此行,指定不同的密钥仓库类型。
例如,如果您有一个这样的提供者包,它给出一个名为“pkcs12”的密钥仓库类型的密钥仓库实现,则可将上面那行改为:

     keystore.type=pkcs12
注意:密钥仓库类型的命名中大小写无关紧要。例如,“JKS”将被认为是与“jks”相同的。
支持的算法和密钥大小
keytool 允许用户指定任何注册了的加密服务提供者所提供的密钥对生成和签名算法。也就是说,各种命令中的 keyalg 和 sigalg 选项必须得到提供者的实现的支持。缺省的密钥对生成算法是“DSA”。签名算法是从所涉及私钥的算法推导来的:如果所涉及的私钥是“DSA”类型,则缺省的签名算法为“SHA1withDSA”,如果所涉及的私钥是“RSA”类型,则缺省的签名算法为“MD5withRSA”。
在生成 DSA 密钥对时,密钥大小的范围必须在 512 到 1024 位之间,且必须是 64 的倍数。缺省的密钥大小为 1024 位。

证书
证书(也叫公钥证书)是来自某个实体(签发人)的经数字签名的声明,它声明另一实体(主体)的公钥(及其它信息)具有某一特定的值。
下面详细解释本句中使用的主要术语:

  
公钥
是与特定实体相关联的数字。所有需要与该实体进行信任交互的人都应知道该数字。公钥用于校验签名。
经数字签名
如果某些数据经数字签名,说明它们已与某一实体的“身份”存储在一起,而且证明该实体的签名知道这些数据。通过用该实体的私钥进行绘制,这些数据就是不可伪造的了。
身份
用于声明实体的一种手段。某些系统中,身份是公钥,而在另一些系统中则可以是 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 个字符。使用口令时必须小心 - 参见与口令有关的警告。

它创建自签名证书(使用缺省的“带 DSA 的 SHA1”签名算法),该证书包括公钥和特征名信息。该证书的有效期为 180 天,且与别名“business”所代表的密钥仓库项关联。私钥被赋予口令“kpi135”。

如果采用选项的缺省值,可以大大缩短该命令。实际上,这些选项并不是必需的;对于有缺省值的选项,未指定时将使用缺省值,对于任何被要求的值,您将会得到要求输入它的提示。因此,您可以只使用下面的命令:

     keytool -genkey
这种情况下,将创建一个具有别名“mykey”的密钥仓库项,它含有新生成的密钥对和有效期为 90 天的证书。该项被放在您的宿主目录下一个名为“.keystore”的密钥仓库中(如果该密钥仓库并不存在,则将创建它)。您将得到要求输入特征名信息、密钥仓库口令和私钥口令的提示。
其余示例假设您执行了未指定选项的 -genkey 命令,且用上述第一个 -genkey 命令中给出的值来回答提示要求(私钥口令为“kpi135”等等)。

从认证机构请求已签名的证书
目前为止我们所具有的就是自签名证书。证书如果由认证机构 (CA) 签名,将更有可能得到别人的信任。要得到这样的签名,首先要用以下命令生成证书签名请求 (CSR):
     keytool -certreq -file MarkJ.csr
这将为缺省别名“mykey”所标识的实体生成 CSR,并将此请求放在名为“MarkJ.csr”的文件中。将此文件提交给某个 CA(例如 VeriSign, Inc.)。该 CA 将对您这个请求者进行认证(通常是离线的),然后返回它们所签名的证书,用于认证您的公钥。(某些情况下,它们实际上将返回证书链,链中每个证书都认证前一个证书的签名人的公钥。)
导入 CA 的证书
自签名证书必须用证书链代替,链中的每个证书都认证前一个证书的签名人的公钥,直到“根”CA 为止。
在导入 CA 的答复之前,在您的密钥仓库中或 cacerts 密钥仓库文件(如导入命令中所述)中需要有一个或多个“可信任”证书:

  
如果该认证答复是个证书链,您只需要链中最顶部的证书(即用于认证根 CA 的公钥的“根” CA 证书)。
如果该认证答复是单个证书,您需要发放 CA(即签名该证书的认证机构)的证书,如果此证书不是自签名的,则需其签名人的证书,以此类推,直到自签名的“根” CA 证书为止。
“cacerts”密钥仓库文件发送时附有五个 VeriSign 根 CA 证书,因此您可能并不需要导入 VeriSign 证书以作为密钥仓库中的可信任证书。但如果您请求由另一个 CA 签名的证书,而认证该 CA 的公钥的证书未被加到“cacerts”中,则您需要将来自该 CA 的证书作为“可信任证书”导入。
来自 CA 的证书通常是自签名的或是由另一个 CA 签名的(这种情况下您还需要认证该 CA 的公钥的证书)。假设 ABC, Inc. 公司是 CA,而您从该公司获得一个声称是自签名证书的名为“ABCCA.cer”的文件,它用于认证该 CA 的公钥。

在将证书作为一个“可信任”证书导入之前,要十分小心,务必保证该证书是有效的!先查看一下(用 keytool -printcert 命令,或用不带 -noprompt 选项的 keytool -import 命令)以确保所显示的证书指纹与所预计的相匹配。然后可以给发送证书的人打电话,将您所看到的指纹与他们所提供的(或安全公钥储存库所显示的)进行比较。只有两者相等才可保证证书在传送途中没有被其它人(例如,攻击者)的证书所更换。如果发生了这样的攻击,而您未检查证书即将其导入,那么您就会信任攻击者所签名的任何东西。

如果您相信证书是有效的,则您可以用以下命令将其加到密钥仓库中:

     keytool -import -alias abc -file ABCCA.cer
这将在密钥仓库中用文件“ABCCA.cer”中的数据创建“可信任证书”项,并将别名“abc”赋予该项。
导入来自 CA 的认证答复
一旦导入了用于认证 CA(该 CA 是您将证书签名请求送往之处)公钥的证书后,或在“cacerts”文件中已有这种证书时,就可以导入该认证答复,从而用证书链取代您的自签名证书。如果 CA 的答复是证书链,则该链是 CA 响应您的请求而返回的证书链;如果 CA 的答复是一个证书,则该链是用认证答复和可信任证书建立的证书链,这些可信任证书是密钥仓库(您要将认证答复导入之处)或“cacerts”密钥仓库文件中已有的。
例如,假设您将证书签名请求送往 VeriSign。您可用以下命令来导入认证答复,该命令假定所返回的证书名为“VSMarkJ.cer”:

     keytool -import -trustcacerts -file VSMarkJ.cer
导出用于认证您的公钥的证书
假设您用 jarsigner 工具来签名 Java 归档 (JAR) 文件。需要使用这一文件的客户机将认证您的签名。
认证签名的一种方法是先将您的公钥证书作为“可信任”项导入它们的密钥仓库中。您可以将证书导出并将其提供给客户机。例如,假设项的别名为“mykey”,您可以用以下命令将您的证书导出到名为 MJ.cer 的文件中:

     keytool -export -alias mykey -file MJ.cer
有了该证书以及已被签名的 JAR 文件,客户机就可以用 jarsigner 工具来认证您的签名。
更改特征名但保留密钥对
假设,譬如说因为您换了部门或搬到另一个城市去了而改变了您的特征名。如果愿意,您仍然可以使用您先前使用的公钥/私钥对而只对特征名进行更新。例如,假设您的名字叫 Susan Miller,并用别名 sMiller 和以下的特征名创建了初始密钥项:
   "cn=Susan Miller, ou=Finance Department, o=BlueSoft, c=us"
假设您从财务部门换到了会计部门。您仍然可使用先前所生成的公钥/私钥对,而用以下方法对特征名进行更新。首先,复制您的密钥项:
     keytool -keyclone -alias sMiller -dest sMillerNew
(您将得到要求输入密钥仓库口令和初始密钥口令及目标密钥口令的提示,因为在命令行没有提供这些信息。)现在,您需要更改与复制项关联的证书链以使链中的第一个证书使用您的新特征名。先用相应名称生成自签名证书:
     keytool -selfcert -alias sMillerNew
       -dname "cn=Susan Miller, ou=Accounting Department, o=BlueSoft, c=us"
然后根据该新证书中的信息生成证书签名请求:
     keytool -certreq -alias sMillerNew
当您得到 CA 认证答复后,将其导入:
     keytool -import -alias sMillerNew -file VSSMillerNew.cer
导入认证答复后,您也许会要删除使用旧特征名的初始密钥项:
     keytool -delete -alias sMiller

阅读(5980) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~