上一篇整理了关于RSA算法Java实现的一些代码,演示性质更重一些。
实际的进行的项目中,要求基于RSA公钥证书的TLS1.0通信,因此重新写了一些代码,重点的东西记录一下:
1、RSA keystore以及公钥证书的生成。
a)RSA keystore的生成;
对于PC环境,直接使用jdk自带的keytool工具即可,我安装的jdk7,keytool的路径是java_install_path/jre/bin,使用命令:
keytool -genkey -validity 365 -alias RSA1024 -keyalg RSA -keystore d:\keystore.ks
默认使用了java自带的密库,如果是需要用在android上,则需要使用bks密库,安装步骤如下:
i)bks密库bcprov-jdk16-146.jar的下载链接:http://www.bouncycastle.org/latest_releases.html;
ii)bcprov-jdk16-146.jar存放至java安装路径/jre/lib/ext;
使用如下命令生成bks密库的key store:
keytool -genkey -validity 365 -alias RSA1024 -keyalg RSA -keystore d:\keystore.ks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
b)RSA 公钥证书的导出
JKS key store:
keytool -export -keystore d:\keystore.ks -alias RSA1024 -file d:\rsa1024.cer
BKS key store:
keytool -export -keystore d:\keystore.ks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -alias RSA1024 -file d:\rsa1024.cer
2、Java代码实现的注意事项:
i)修改java_install_path/jre/lib/security下的java.security以及java_install_path/jdk/jre/lib/security下的java.security,在
security.provider.10=sun.security.mscapi.SunMSCAPI
下面添加:
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
ii)对于JKS key store,获取KeyStore实例时,使用如下语句:
ks = KeyStore.getInstance(ksType);
对于BKS key store,获取KeyStore实例时,使用如下语句:
ks = KeyStore.getInstance(ksType, new org.bouncycastle.jce.provider.BouncyCastleProvider());
iii)在导入bcprov-jdk16-146.jar后,如果对于new org.bouncycastle.jce.provider.BouncyCastleProvider()提示编译错误,需要修改:
Window->Preferences->Java->Compiler->Errors/Warnings->Deprecated and restricted API->Forbidden reference选项,修改为 Warning或Ignore即可
遗留的问题:
按照上述方法生成的bks key store和对应的公钥证书在PC的Eclipse+JDK1.6环境下都测试通过(JKS和BKS),包括Public/Private key的提取、公钥加密/私钥解密以及私钥签名/公钥验证,但是尚未在android环境下进行验证,这也是接下来要做的事儿。