如何从密钥库中读取私钥和公钥密钥库
你不能。私钥不在证书中。它在KeyStore中。这是您在证书存在之前做出的第一件事。
您可以在IBM JRE中使用Ikeyman或ikeycmd将* .kdb文件转换为PKCS12文件。然后,您可以平凡提取私钥和相关证书:
# Client Certificate
openssl pkcs12 -nokeys -in $MYP12 -clcerts -nokeys -out clientcert.pem $PKCSARGS
#Private Key
openssl pkcs12 -in $MYP12 -nocerts -out client_privkey.pem -nodes $PKCSARGS
#Public Key
openssl x509 -in clientcert.pem -pubkey -noout > client_pubkey.pem
但是,如果你的最终目标是使用WebSphere中的证书和密钥,你最好只是IKEYCMD或IKEYMAN将其转换成一个更原生的Java格式。
最后,如果你真的想要一个API来编写自己的证书/密钥库管理工具只是做现有的图形用户界面和工具已经为你做:
使用java.security.KeyStore中,并与朋友们“IBMCMSKS”类型。如果 你不使用WAS/IHS JRE,添加此提供商: com.ibm.security.cmskeystore.CMSProvider
感谢您的帮助。 – user3797766
在应用程序启动时,我们正在考虑从Websphere SSL证书读取私钥和公钥,基本上来自SSL内部的密钥存储库。为此,我们需要如上所述使用CMSProvider? – user3797766
如果它是* .kdb,是的。 – covener
如果你不担心Z上RACF密钥库,也有简单https://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html
import java.security.KeyStore;
import java.io.FileInputStream;
....
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = null;
try {
fis = new FileInputStream("keyStoreName");
ks.load(fis, ksPassword.toCharArray());
} finally {
if (fis != null) {
fis.close();
}
}
Key myKey = ks.getKey(alias,password.toCharArray());
如果你想从一个集中的密钥库读取键,你会不会需要密钥库的密码,但你可能需要弄清楚的经营范围:在java.security.KeyStore中的javadoc说明的密钥库。例如:
(小区):了myCell:(节点):MYNODE
这些替代了myCell和MYNODE。有时你可以在不使用管理范围的情况下离开,有时你不能。尝试使用null为管理范围调用getJavaKeyStore以查看它是否适用于您。如果不是,那么你必须定义管理范围。
import com.ibm.ws.ssl.config.KeyStoreManager;
import java.security.KeyStore;
import java.security.Key;
...
String mgmtScopeString="(cell):"+myCell+":(node):"+myNode;
KeyStore keystore =
KeyStoreManager.getInstance().getJavaKeyStore("NodeDefaultKeyStore",
mgmtScopeString);
Key myKey = keystore.getKey(alias,password.toCharArray());
此代码适用于我读取*.kdb
文件的内容。当然,您需要使用密码.kdb
。第一个参数是文件名,第二个参数是关键字。
import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.Certificate;
import java.text.SimpleDateFormat;
import java.util.Enumeration;
public class KdbReaderTest {
public static void main(String[] args) {
String certFile=args[0];
String password=args[1];
KeyStore ks;
Security.addProvider(new com.ibm.security.cmskeystore.CMSProvider());
try {
ks=KeyStore.getInstance("IBMCMSKS");
System.out.println("got instance");
ks.load(new FileInputStream(certFile), password.toCharArray());
Enumeration<String> alias=ks.aliases();
while (alias.hasMoreElements()) {
Certificate cert=null;
String aliasName=alias.nextElement();
System.out.printf("%-20s ", aliasName);
if (ks.isKeyEntry(aliasName)) {
Key key=ks.getKey(aliasName, password.toCharArray());
// do whatever you want with the key here
}
if (ks.isKeyEntry(aliasName)
|| ks.isCertificateEntry(aliasName)) {
cert=ks.getCertificate(aliasName);
java.security.cert.X509Certificate x509=(java.security.cert.X509Certificate)cert;
SimpleDateFormat iso = new SimpleDateFormat("yyyy-MM-dd");
System.out.print(iso.format(x509.getNotBefore())+ " - "+iso.format(x509.getNotAfter()));
if (!x509.getSubjectDN().getName().equals(aliasName))
System.out.println(" "+x509.getSubjectDN().getName());
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("done");
}
}
只有两个项目是不同的,从从.jks文件中读取是
Security.addProvider(new com.ibm.security.cmskeystore.CMSProvider());
KeyStore.getInstance("IBMCMSKS");
(您也可以在$JAVA_HOME/lib/security/java.security
进入,而不是调用addProvider的CMSProvider)
对于这个工作,你的类路径中需要ibmpkcs.jar
和ibmcmsprovider.jar
。
是的我知道,在网络领域我的密钥库已配置 从我在IBM web球体上运行的后端应用程序中,我想从密钥存储区中读取公钥和私钥。 我想知道是否有我可以访问密钥存储的任何API – user3797766
是的,它被称为错误'KeyStore'。令人惊讶的足够。我建议你编辑你的问题,以反映你真正想问的问题。 – EJP