keytool是java管理秘钥和证书的命令行工具。
配置https服务器,以及给java web start应用做数字签名时都会用到它。
keystore:
java把秘钥和证书都存储在秘钥库(keystore)里。
keystore是一个磁盘文件,默认的keystore存放在用户的home文件夹里的.keystore。
也可以通过keytool的-keystore参数来指定keystore文件。
访问keystore需要用户输入密码(以前版本的java默认密码是changeit)。
可以通过-storepass提供密码。创建keystore时会要求用户设置密码。
alias:
秘钥库中的所有条目(秘钥及证书)都有一个别名,必须通过别名来访问条目。
别名不区分大小写。通过-alias参数指定别名。
上面说过秘钥库有访问密码,而每一个别名也可以设置自己的访问密码。
当需要操作私钥(比如-certreq)时,需要提供此别名的密码。通过-keypass来指定。
(-list,-delete都不需要keypass)
在下面的示例中,会创建一个x509自签名的CA证书,
然后创建一个https服务器证书,并用这个CA证书来给服务器证书做数字签名。
只要在客户端把CA证书导入到【受信任的根证书颁发机构】中,这样一来,
访问https服务器时,浏览器就会认为服务器是可信任的了。
(各版本java中,参数可能不太一样。下面命令运行在java1.8版本上;
示例中为了方便,把密码都写在命令行上了,实际应用中应该避免。)
# 创建CA证书
# -genkeypair会生成x509自签名证书,注意用-validity设置有效期,
# 另外,需要-ext bc:c来标明这是一个CA证书。
# -ext的详细说明参见
keytool -genkeypair -keystore mystore.jks -storepass 123456 -alias myca -validity 365 -dname CN=ca,C=cn -ext bc:c
# 查看keystore中,有了一条myca的条目。
keytool -list -keystore mystore.jks -storepass 123456
# 导出ca证书
keytool -exportcert -keystore mystore.jks -storepass 123456 -alias myca -rfc -file myca.cer
# 创建server证书
# -dname中的CN应该是服务器的域名.
keytool -genkeypair -keystore mystore.jks -storepass 123456 -alias server -keypass sv123456 -validity 365 -dname CN=127.0.0.1,C=cn -ext ku:c=dig,keyE -ext eku=serverAuth
# 生成证书请求
keytool -certreq -keystore mystore.jks -storepass 123456 -alias server -keypass sv123456 -file server.csr
# 用CA证书签署server证书请求
# 还需要-ext ku:c=dig,keyE指定用途为digitalSignature,keyEncipherment
# 还需要-ext eku=serverAuth指定用途为serverAuth
keytool -gencert -keystore mystore.jks -storepass 123456 -alias myca -keypass ca123456 -infile server.csr -outfile server.cer -ext ku:c=dig,keyE -ext eku=serverAuth
# 导入CA签署的server证书
# 需要先把ca证书导入到自己的库中使其成为信任证书,
# 否则会报错:keytool 错误: java.lang.Exception: 无法从回复中建立链
keytool -importcert -keystore mystore.jks -storepass 123456 -alias server -keypass sv123456 -file server.cer
下面示例创建了一个root证书,用于代码签名。
# 创建root证书
keytool -genkeypair -keystore mystore.jks -storepass 123456 -alias root -keypass rt123456 -dname CN=root,C=cn
keytool -certreq -keystore mystore.jks -storepass 123456 -alias root -keypass rt123456 -file root.csr
# 用CA证书签署。-ext ku:c=dig -ext eku=codeSigning
keytool -gencert -keystore mystore.jks -storepass 123456 -alias myca -keypass ca123456 -validity 365 -infile root.csr -outfile root.cer -ext ku:c=dig -ext eku=codeSigning
keytool -importcert -keystore mystore.jks -storepass 123456 -alias root -keypass rt123456 -file root.cer
# 签署jar文件。用于java web start应用。
jarsigner -keystore mystore.jks -storepass 123456 log4j-1.2.17.jar root -keypass rt123456
# 加时间戳
jarsigner -keystore mystore.jks -storepass 123456 log4j-1.2.17.jar root -keypass rt123456 -tsa
补充,keytool的其他功能:
-printcert 打印证书内容(可以打印证书文件,或签名的jar文件,或https服务器的证书信息)
-
keytool -printcert -file root.cer
-
keytool -printcert -jarfile log4j-1.2.17.jar
-
keytool -printcert -sslserver
关于openssl证书的使用,请参见另一篇文章
http://blog.chinaunix.net/uid-24648266-id-4257284.html
阅读(5047) | 评论(0) | 转发(0) |