2016-04-26 15 views

Antwort

0

Sie können nicht. Der private Schlüssel ist nicht im Zertifikat enthalten. Es ist im KeyStore. Es ist das erste, was Sie gemacht haben, bevor das Zertifikat existierte.

+0

Ja, ich weiß, im Web-Bereich ist mein Keystore konfiguriert Von meiner Back-End-Anwendung auf IBM Web-Sphäre, möchte ich öffentliche und private Schlüssel aus dem Schlüsselspeicher lesen. Ich möchte wissen, gibt es eine API, mit der ich Schlüsselspeicher zugreifen kann – user3797766

+0

Ja, es heißt, err, 'KeyStore'.Erstaunlicherweise. Ich schlage vor, dass Sie Ihre Frage bearbeiten, um zu reflektieren, wonach Sie wirklich fragen. – EJP

0

Sie können Ikeyman oder ikeycmd in IBM JRE verwenden, um die * .kdb-Datei in eine PKCS12-Datei zu konvertieren. Sie können dann die privaten Schlüssel und die zugehörigen Zertifikate trivialer extrahieren:

# 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 

Aber wenn Ihr Endziel das Zertifikat und den Schlüssel in WebSphere zu verwenden ist, sind Sie besser konvertiert es nur mit IKEYCMD oder ikeyman zu einem nativen Java Format.

Schließlich, wenn Sie wirklich eine API wollen Ihr eigenes Zertifikat/Schlüsselspeicher-Management-Tool zu schreiben, genau das zu tun, was bestehende GUIs und Tools bereits für Sie tun:

Verwenden java.security.KeyStore und Freunde mit der "IBMCMSKS" Typ. Wenn Sie verwenden kein WAS/IHS JRE, fügen Sie diesen Anbieter: com.ibm.security.cmskeystore.CMSProvider

+0

Danke für Hilfe. – user3797766

+0

Beim Start der Anwendung denken wir darüber nach, den privaten Schlüssel und den öffentlichen Schlüssel aus dem Websphere-SSL-Zertifikat zu lesen, im Wesentlichen aus dem Schlüsselspeicher, der sich innerhalb von SSL befindet. Dazu müssen wir CMSProvider wie oben erwähnt verwenden? – user3797766

+0

Wenn es eine * .kdb ist, ja. – covener

0

Wenn Sie nicht über RACF Schlüsselspeicher auf Z kümmern, gibt es einfache Anweisungen in der java.security.KeyStore javadoc: 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()); 

Wenn Sie Schlüssel von einem zentralen Schlüsselspeicher lesen möchten, können Sie das Kennwort für den Schlüsselspeicher nicht benötigen, aber Sie können den Verwaltungsbereich brauchen, um herauszufinden des Keystores. Zum Beispiel:

(Zelle): myCell: (node): myNode

Die Ersetzungen sind myCell und myNode. Manchmal kann man ohne den Verwaltungsbereich davonkommen und manchmal nicht. Versuchen Sie, getJavaKeyStore mit null für den Verwaltungsbereich aufzurufen, um zu sehen, ob er für Sie funktioniert. Wenn nicht, müssen Sie den Verwaltungsbereich definieren.

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

Dieser Code funktioniert bei mir den Inhalt einer *.kdb Datei zu lesen. Natürlich benötigen Sie das Passwort, das mit geschützt ist. Erstes Argument ist der Dateiname, zweites Argument der Schlüssel.

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"); 
    } 
} 

Die nur zwei Elemente, die aus einer .jks Datei verschieden sind

aus der Lektüre
Security.addProvider(new com.ibm.security.cmskeystore.CMSProvider()); 
KeyStore.getInstance("IBMCMSKS"); 

zu

Für diese (Sie auch die CMSProvider in $JAVA_HOME/lib/security/java.security statt Aufruf addProvider eingeben) arbeiten, benötigen Sie ibmpkcs.jar und ibmcmsprovider.jar in Ihrem Klassenpfad.

Verwandte Themen