前一段时间在项目中用到了信息的加解密和生成数字签名和验签,其中使用了CA给提供的安全证书和工具jar包--javasafeengine.jar,项目在Tomcat下跑的一切正常,但当项目部署到WebSphere时却签名模块跟加密模块却无法工作,在网上查了很多的资料,基本确定了是由于WebSphere使用的是IBM自己的JDK引起的问题,在Tomcat环境下,加密工具jar包所采用的都是Sun公司所提供的加密和签名算法,而在IBM-JDK环境下这些算法都被IBM重新写过,因此需要对原先的参数做一些修改;
另,由于WebSphere部署于linux中,因此原先的PKCS12格式的密钥无法使用,需要把PKCS12格式的密钥文件转换为JKS格式的密钥,方法是在cmd中输入命令:
keytool -importkeystore -v -srckeystore src.pfx -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore dest.keystore -deststoretype jks -deststorepass 123456
在使用的过程中,需要做出以下几点修改:
1.在进行生成签名的过程中,首先需要加载密钥文件,就是刚才那个.jks结尾的文件,但是如果使用工具包中的方法:
private static javasafeengine oSE=SafeEngine.getInstance();
KeyStore ks=oSE.getKeyStore("JKS","SUN","/opt/my/test.jks","123456");
会在加载过程中出现莫名的错误,在加载过程中不会暴露,但是会造成之后的签名失败。因此需要我们手工编写读入JKS文件的方法:
KeyStore ks=null;
try {
ks= KeyStore.getInstance("JKS");
} catch (KeyStoreException e1) {
// TODO Auto-generated catch block
logger.warn("KeyStore instance error:"+e1);
e1.printStackTrace();
}
BufferedInputStream bufferinput = new BufferedInputStream(new FileInputStream(KEYSTORE_FILE));
ks.load(bufferinput,"123456".toCharArray());
bufferinput.close();
然后在使用工具包中的签名方法就可以了:
byte[] bSign=oSE.sign(data.getBytes("UTF-8"),ks,"","123456","SHA1WithRSA","IBMJCE");
其中IBMJCE是WebSphere所特有的,如果是在Tomcat下,应该替换为SunRsaSign;
进行加密的方法是:
byte[] bCipher=oSE.encrypt(str.getBytes("UTF-8"),bten,"DESege","IBMJCE")
bten是加密密钥 类型是byte[]
IBMJCE也是WebSphere特有的,Tomcat下替换为SunJCE
在类文件的最前边要手动加载Sun的相关类:
static{
Security.addProvider(new SunJCE());
Security.addProvider(new sun.security.provider.Sun());
Security.addProvider(new SunRsaSign());
}