在上一篇博客中,说到SSL的第一步就是要创建证书。(或者向第三方购买)
PS:最终上线的产品,证书会是向第三方认证机构购买的,但在开发过程中,是自己创建的。
创建证书的常用工具是keytool,这个是jdk自带的工具,只要电脑上装了jdk(并且环境变量里配置好了)就可以使用。
linux系统不能用keytool,要用openssl。
本篇所列的命令为keytool命令。
首先,列出参考文章:
1、创建证书过程参考:
http://wenku.baidu.com/link?url=uWTSct_uZYrcbG0RPpWTZ4Lmhz177Uv4xlMyBw6554YkzCG00GmKDscP36LSFDb3vdhpq2EW4VHUUzkyLjQdmepZbBpp29QxsAYzmRfJe9O
http://www.blogjava.net/icewee/archive/2012/06/04/379947.html
http://czj4451.iteye.com/blog/1487684
2、keytool命令解释参考:
http://blog.csdn.net/ygc87/article/details/7620942
http://www.cnblogs.com/benio/archive/2010/09/15/1826990.html(非常详细)
下面,简单介绍几个常用命令的说明:
keytool常用命令
-alias 产生别名
-keystore 指定密钥库的名称(就像数据库一样的证书库,可以有很多个证书,cacerts这个文件是jre自带的,
你也可以使用其它文件名字,如果没有这个文件名字,它会创建这样一个)
-storepass 指定密钥库的密码
-keypass 指定别名条目的密码
-list 显示密钥库中的证书信息
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目
-import 将已签名数字证书导入密钥库
-keypasswd 修改密钥库中指定条目口令
-dname 指定证书拥有者信息
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
接下来,进入本文的重点——keytool命令创建ssl证书:
PS:仅仅用下面的命令创建bks是不能成功的,因为缺少一个bks支持的jar,具体的解决办法可以百度一下,网上很多。很简单,就是下载一个jar放到jdk的两个目录下,然后修改对于的两个配置文件就好了。
一、单向验证成功:
1、生产服务器端证书:
keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore D:\ssl\bks\server.jks -dname "CN=10.100.100.24,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
2、导出证书
keytool -exportcert -v -alias server -keystore D:\ssl\bks\server.jks -storepass 123456 -rfc -file D:\ssl\bks\server.cert
3、生产Android可用的客户端证书
keytool -importcert -keystore D:\ssl\bks\client.bks -file D:\ssl\bks\server.cert -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 123456
PS:ios单项验证不需要证书
二、同一个server,两份不同的client证书(一份bks,Android用的,一份是jks,ios用的),双向认证成功:
1、创建server端证书:
keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore D:\ssl\server.keystore -dname "CN=10.100.100.24,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
2、创建Android客户端证书:(双向(Android)验证成功)
最终要给客户端用的证书是:client-bks-trust.bks、client-bks.bks
keytool -validity 365 -genkeypair -v -alias client-bks -keyalg RSA -storetype BKS -keystore D:\ssl\client-bks.bks -dname "CN=client,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
keytool -export -v -alias client-bks -keystore D:\ssl\client-bks.bks -storetype BKS -storepass 123456 -rfc -file D:\ssl\client-bks.crt
keytool -export -v -alias server -keystore D:\ssl\server.keystore -storepass 123456 -rfc -file D:\ssl\server.crt
keytool -importcert -keystore D:\ssl\client-bks-trust.bks -file D:\ssl\server.crt -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 123456
keytool -import -v -alias client-bks -file D:\ssl\client-bks.crt -keystore D:\ssl\server.keystore -storepass 123456
3、创建ios客户端证书(ios:双向验证成功)
最终发给ios客户端的证书是:client-ios.truststore(该格式也可以为.p12,但此处的文件与下面第一行生成的client-ios.p12文件是不同的文件)
keytool -validity 365 -genkeypair -v -alias client-ios -keyalg RSA -storetype PKCS12 -keystore D:\ssl\client-ios.p12 -dname "CN=client-ios,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
keytool -export -v -alias client-ios -keystore D:\ssl\client-ios.p12 -storetype PKCS12 -storepass 123456 -rfc -file D:\ssl\client-ios.cer -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 123456
keytool -export -v -alias server -keystore D:\ssl\server.keystore -storepass 123456 -rfc -file D:\ssl\server-ios.cer
keytool -import -v -alias server -file D:\ssl\server-ios.cer -keystore D:\ssl\client-ios.truststore -storepass 123456
keytool -import -v -alias client-ios -file D:\ssl\client-ios.cer -keystore D:\ssl\server.keystore -storepass 123456
三、(也可以用java代码测试)
ios-jks:双向成功
keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore D:\ssl\ios-jks\server.keystore -dname "CN=10.100.100.24,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
keytool -validity 365 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:\ssl\ios-jks\client.p12 -dname "CN=client,OU=test,O=test,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456
keytool -export -v -alias client -keystore D:\ssl\ios-jks\client.p12 -storetype PKCS12 -storepass 123456 -rfc -file D:\ssl\ios-jks\client.cer -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass 123456
keytool -export -v -alias server -keystore D:\ssl\ios-jks\server.keystore -storepass 123456 -rfc -file D:\ssl\ios-jks\server.cer
keytool -import -v -alias server -file D:\ssl\ios-jks\server.cer -keystore D:\ssl\ios-jks\client.truststore -storepass 123456
keytool -import -v -alias client -file D:\ssl\ios-jks\client.cer -keystore D:\ssl\ios-jks\server.keystore -storepass 123456