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