Keytool用法說明
Keytool是一個key與cert的管理工具。使用keytool可以管理public key、private key,以及與key之相關的certificate。
1、command和option說明
1.1 command
使用keytool工具時,可以使用15種命令:
1.2 option
Option是命令的參數,要了解某個命令的參數可以使用keytool –command_name –help來獲取。例如:使用keytool –genkeypair –help可以查看genkeypair命令的參數說明:
這個命令中,有許多命令使用的參數是有默認值的,使用命令時可以不指定的,看看下表:
Option |
默認值 |
-alias |
“mykey” |
-keyalg |
“DSA” 使用-genkeypair命令時 |
“DES” 使用-genseckey命令時 |
|
-keysize |
2048 使用 –genkeypair命令,並且-keyalg選項是”RSA”時 |
1024 使用 –genkeypair命令,並且-keyalg選項是”DSA”時 |
|
256 使用 –genkeypair命令,並且-keyalg選項是”EC”時 |
|
56 使用 –genseckey 命令,並且-keyalg選項是”DES”時 |
|
168 使用 –genseckey 命令,並且-keyalg選項是”DESede”時 |
|
-validity |
90 |
-keystore |
默認的的文件名是 .keystore ,是一個隱藏文件。 |
-storetype |
默認值java.security中配置的,SUN指定的是JKS,可以人為修改 |
-file |
如果是寫,值為stout,如果是讀,值為stdin |
-protected |
false |
-sigalg |
SHA1withDSA 如果生成KeyPair使用的時DSA算法 |
SHA256withRSA 如果生成KeyPair使用的時RSA算法 |
|
SHA256withECDSA 如果生成KeyPair使用的時EC算法 |
2、Commands
2.1 生成keypair並查看
genkeypair
-genkeypair {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-startdate value} {-ext ext}* {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
生成KeyPair,並且生成使用X.509 v3 自簽名的證書。
看下面的例子:
查看命令詳情,可以使用list命令(參見下面list命令),也可以使用JAVA程序來查看。
下面是一個Java程序查看的例子:

package com.fjn.other.security; import java.io.File; import java.io.FileInputStream; import java.security.Key; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.cert.Certificate; import java.security.interfaces.DSAPrivateKey; import java.util.Enumeration; import org.junit.Test; public class KeyPaireReader { public void read(String file, String password) throws Exception { FileInputStream fis = null; fis = new FileInputStream(new File(file)); KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(fis, password.toCharArray()); System.out.println(keystore.containsAlias("mykey")); Enumeration<String> aliases=keystore.aliases(); while(aliases.hasMoreElements()){ String alias = aliases.nextElement(); String createDate = keystore.getCreationDate(alias) .toLocaleString(); System.out.println("createDate: " + createDate); Key key = keystore.getKey(alias, password.toCharArray()); if (key != null && key instanceof PrivateKey) { if ("DSA".equals(key.getAlgorithm().toUpperCase())) { DSAPrivateKey pik = (DSAPrivateKey) key; System.out.println(pik.getX()); } } Certificate[] certs= keystore.getCertificateChain(alias); for (Certificate cert : certs) { PublicKey puk = cert.getPublicKey(); System.out.println(puk); } } } @Test public void test() throws Exception { read("D:\\keytooltest\\ca1.jks", "111111"); } }
上面程序執行結果:
list
-list {-alias alias} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v | -rfc} {-protected} {-Jjavaoption}
打印出指定alias的信息,如果沒有指定alias,則顯示所有的。
下面的例子,就是打出了上面使用genkeypair生成的alias為mykey的key詳情:
2.2 證書簽名處理
這個過程涉及到3個命令:
certreq、gencert、importcert
1)機構A使用certreq生成一個證書簽名請求文件(CSR certificate sign request),生成的文件就代表一個請求。
2)CA(證書認證中心)接收到這個請求后,經過處理(使用gencert),會生成一個證書或者證書鏈。
3)機構A接收到響應,將證書導入(importcert)到keystore中。
在說明這個處理之前,先使用genkeypair生成2個keystore文件:
keytool -genkeypair -alias ca1 -keystore D:\keytooltest\ca1.jks keytool -genkeypair -alias ca2 -keystore D:\keytooltest\ca2.jks
certreq
把請求放到文件中:
keytool -certreq -alias ca1 -keystore D:\keytooltest\ca1.jks -file D:\keytooltest\ca1_to_ca2.req |
gencert
-gencert {-rfc} {-infile infile} {-outfile outfile} {-alias alias} {-sigalg sigalg} {-dname dname} {-startdate startdate {-ext ext}* {-validity valDays} [-keypass keypass] {-keystore keystore} [-storepass storepass] {-storetype storetype} {-providername provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
keytool -gencert -alias ca2 -infile D:\keytooltest\ca1_to_ca2.req -outfile D:\keytooltest\ca2_to_ca1.cert -keystore D:\keytooltest\ca2.jks
importcert
官方學習資料:
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/keytool.html
http://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html
深入了解:
http://www.ibm.com/developerworks/cn/java/j-lo-socketkeytool/index.html?ca=drs