目标:
从我们的Java应用程序中的WAS密钥库(在WAS控制台中导入的自定义私钥)中检索私钥以对数据进行签名。签名数据将使用公钥解密,该公钥已与其他应用程序共享。
我们如何处理当前(无法正常工作,无法生成或将Key转换为PrivateKey)
我们在KeyHelper API的帮助下检索了Websphere KeyPair对象,并从KeyPair获取了java.security.Key
对象。
我们用于开发引用知识中心的代码的链接 https://www.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/rsec_sslretgenkeysetgrp.html
代码段:
String keySetGroupName = "CMODSSOKeySet";
com.ibm.websphere.crypto.KeySetHelper ksh = com.ibm.websphere.crypto.KeySetHelper.getInstance();
Map generationKeys = ksh.getAllKeysForKeySet(keySetGroupName);
Iterator iKeySet = generationKeys.keySet().iterator();
String keyAlias = (String)iKeySet.next();
Object keyObject = generationKeys.get(keyAlias);
现在,我们将keyObject
作为com.ibm.websphere.crypto.KeyPair
的实例,当我们从keyObject
检索私钥时,如下所述,我们得到java.security.Key
对象但不是PrivateKey宾语。
java.security.Key privateKeyAsSecret = ((com.ibm.websphere.crypto.KeyPair)key).getPrivateKey();
我们需要将privateKeyAsSecret转换为PrivateKey,我们尝试了不同的方法。
选项1:
PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyContent.getEncoded()));
PrivateKey privKey = kf.generatePrivate(keySpecPKCS8);
选项2:
X509EncodedKeySpec keySpecPKCS8 = new X509EncodedKeySpec(Base64.decodeBase64(privateKeyAsSecret.getEncoded()));
PrivateKey tempPrivateKey = kf.generatePrivate(keySpecPKCS8);
选项3:
PrivateKey tempPrivateKey = (PrivateKey) ((com.ibm.websphere.crypto.KeyPair) key).getPrivateKey();
选项4:
String privateKeyContent = new String(privateKeyAsSecret.getEncoded());
privateKeyContent = privateKeyContent.replaceAll("\\n", "").replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "");
PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(DatatypeConverter.parseBase64Binary(privateKeyContent));
PrivateKey privKey = kf.generatePrivate(keySpecPKCS8);
我们无法通过上述所有选项生成或转换Key to PrivateKey。