Keytool 是一个Java应用程序,用于管理和维护数字证书和密钥。它通过命令行界面提供了一系列的操作,使得用户可以方便地创建、导入、导出和管理密钥库(keystore)中的证书和密钥。以下是关于keytool命令的详细介绍:
(1)-genkeypair
-genkeypair命令可以产生密钥对(一个公钥与关联的私钥),将公钥打包至X.509 v3自签名证书中,证书以单元素证书链的形式存储。该证书链与私钥存储在密钥库的新条目中,通过-alias选项进行标识
(2)-genseckey
可以创建一个秘密密钥并将其存储在新的SecretKeyEntry中,通过-alias选项进行标识。
(3)-importcert
读取file选项指定的证书或证书链(证书链为PKCS#7格式回复),并将其保存至密钥库中alias选项指定的条目中。若未指定file选项,则从标准输入读取证书或PKCS#7回复。
keytool可以导入X.509版本1、版本2、版本3的证书,以及PKCS#7格式的证书组成的证书链。被导入的数据需要为二进制格式,或可打印的编码格式(即Base64编码)。当导入Base64编码格式的证书时,证书数据的头部需要以"-----BEGIN"开头,尾部需要以"-----END"开头。
以下两种情况需要将证书导入密钥库:
a.将证书添加到密钥库的受信任证书列表中;
b.将提交给CA的证书签名请求对应的CA返回的证书回复导入密钥库。
在早期的版本中,该命令的名字为-import。在当前版本与以后的版本中,旧名称仍然被支持,但推荐使用新名字-importcer
(4)-list
用于打印-alias选项标识的密钥库条目的内容。如果未指定-alias选项,密钥库的全部内容将会被打印。
该命令默认打印证书的MD5指纹。当指定了-v选项时,会使用可读的形式进行打印,包含额外的信息,如所有者、所有者、序列号等。当指定了-rfc选项时,证书内容会以Internet RFC 1421标准定义的可打印编码格式进行输出。
-v与-rfc选项不可以同时指定。
(5)-printcert
从-file选项指定的文件中读取证书,并将其内容以可读的形式进行指定。若未指定-file选项,则从标准输入读取证书。
被查看的证书可为二进制编码形式或Internet RFC 1421标准定义的可打印编码格式。
(6)-delete
用于从密钥库中删除-alias选项对应的条目。当未指定-alias选项时,将会提示输入。
(7)-storepass
storepass选项对应的密码用于保护密钥库的完整性。storepass必须为至少6个字节。当需要操作密钥库内容时,所有的命令都需要指定storepass选项。对于这些命令,如果-storepass选项未在命令行中指定,keytool将会提示用户。
当从密钥库检索信息时,密码是可选的;如果不指定密码,被检索信息的完整性将无法检查,且会有警告显示。
3、相关选项默认值:
(1)-alias
指定密钥库操作的条目对应的别名,默认值为"mykey"。
(2)-keyalg
keyalg选项指定生成密钥对或私钥时使用的算法,1.6版本后默认值与生成秘钥的命令有关。如下:
JRE版本 keyalg默认值
1.5 DSA
1.6 DSA(-genkeypair) & DES(-genseckey)
1.7 DSA(-genkeypair) & DES(-genseckey)
1.8 DSA(-genkeypair) & DES(-genseckey)
(3)-keystore
指定密钥库文件位置,默认值为用户目录(C:\Users\Administrator)的.keystore文件。
(4)-sigalg
sigalg选项指定对自签名证书或证书签名请求进行签名时使用的算法,sigalg对应的算法需要与keyalg对应的算法兼容。在生成公/私钥对时,sigalg选项对应的签名算法从底层私钥的算法衍生而来。
JRE版本 sigalg选项默认值
1.5 SHA1withDSA(底层私钥为DSA类型),MD5withRSA(底层私钥为RSA类型)
1.6 SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型)
1.7 SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型),SHA256withECDSA (底层私钥为EC类型)
1.8 SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型),SHA256withECDSA (底层私钥为EC类型)
(5)-keysize
指定生成的密钥长度,默认值如下:
JRE版本 keysize默认值
1.5 1024
1.6
1024 (使用-genkeypair)
56 (使用-genseckey且-keyalg选项为"DES")
168 (使用-genseckey且-keyalg选项为"DESede")
1.7
2048 (使用-genkeypair且-keyalg为"RSA")
1024 (使用-genkeypair且-keyalg为"DSA")
256 (使用-genkeypair且-keyalg为"EC")
56 (使用-genseckey且-keyalg为"DES")
168 (使用-genseckey且-keyalg为"DESede")
1.8
2048 (使用-genkeypair且-keyalg为"RSA")
1024 (使用-genkeypair且-keyalg为"DSA")
256 (使用-genkeypair且-keyalg为"EC")
56 (使用-genseckey且-keyalg为"DES")
168 (使用-genseckey且-keyalg为"DESede")
(6)-validity
指定有效期,单位为天,默认值为90
(7)-storetype
指定密钥库的存储类型,默认值为Java安全属性文件java.security中的"keystore.type"属性值(jks)
秘钥说明:
JKS:
JKS是内置的默认密钥库实现类型,由Sun Microsystems提供。JKS类型将密钥库以文件形式实现,利用专有的密钥库类型。它对每个私钥使用其私有的密码进行保护,同时对整个密钥库使用一个密码(有可能不同)保护其完整性。密钥库类型名称不区分大小写。例如,“jks"被认为等同于"JKS”。
JCEKS:
"JCEKS"是另一种替代的专用密钥库格式,与"JKS"相比,"JCEKS"使用更健全的加密方式,使用基于口令的3DES加密。
Sun的"JCEKS"实现可以对"JKS"密钥库解析并转换为"JCEKS"格式。你可以将"JKS"类型的密钥库升级为"JCEKS"类型,通过修改密钥库中私钥条目的密码,需要指定"-storetype jceks"作为密钥库类型。
PKCS12:
"PKCS12"是另一种选项,这是一种跨平台的密钥库,基于RSA PKCS12个人信息交换标准。这个标准主要用于存储或传输用户的私钥、证书以及各种秘密。
DKS:
"dks"是域密钥库,它是密钥库的集合,表现为一个逻辑上单独的密钥库
PKCS11:
当密钥库的类型为pkcs11时,为支持PKCS#11令牌的密钥库。
JDK版本 支持的秘钥库类型
1.5 JKS,PKCS12
1.6 JKS,PKCS12,JCEKS
1.7 JKS,PKCS12,JCEKS
1.8 JKS,PKCS12,JCEKS,DKS,PKCS11