Chinaunix首页 | 论坛 | 博客
  • 博客访问: 610121
  • 博文数量: 142
  • 博客积分: 116
  • 博客等级: 入伍新兵
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-28 08:37
文章分类

全部博文(142)

文章存档

2017年(7)

2016年(57)

2015年(48)

2014年(30)

我的朋友

分类: Java

2016-06-04 18:59:51

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服务器的证书信息)
  1. keytool -printcert -file root.cer
  2. keytool -printcert -jarfile log4j-1.2.17.jar
  3. keytool -printcert -sslserver

关于openssl证书的使用,请参见另一篇文章
http://blog.chinaunix.net/uid-24648266-id-4257284.html
阅读(4992) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~