2016-04-26 302 views

回答

0

你不能。私钥不在证书中。它在KeyStore中。这是您在证书存在之前做出的第一件事。

+0

是的我知道,在网络领域我的密钥库已配置 从我在IBM web球体上运行的后端应用程序中,我想从密钥存储区中读取公钥和私钥。 我想知道是否有我可以访问密钥存储的任何API – user3797766

+0

是的,它被称为错误'KeyStore'。令人惊讶的足够。我建议你编辑你的问题,以反映你真正想问的问题。 – EJP

0

您可以在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

+0

感谢您的帮助。 – user3797766

+0

在应用程序启动时,我们正在考虑从Websphere SSL证书读取私钥和公钥,基本上来自SSL内部的密钥存储库。为此,我们需要如上所述使用CMSProvider? – user3797766

+0

如果它是* .kdb,是的。 – covener

0

如果你不担心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()); 
0

此代码适用于我读取*.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.jaribmcmsprovider.jar