2012-04-05 6 views
6

Ich verwende Bouncycastle (JAVA) zum Signieren, Verschlüsseln, Entschlüsseln und Signaturen Verifikation in der Umsetzung von SSO. Ich habe öffentliche und private PGP-Schlüssel und muss sie im Java-Keystore speichern. Diese öffentlichen PGP-Schlüssel haben kein Zertifikat.Store PGP (öffentliche) Schlüssel in Java Keystore - Bouncycastle

Ich verstehe, dass für öffentliche Schlüssel (nach Javadoc Keystore: http://docs.oracle.com/javase/6/docs/api/java/security/KeyStore.html) ich Zertifikat erstellen muss. Sobald das Zertifikat erstellt wurde, kann es als KeyStore.TrustedCertificateEntry in den Keystore importiert werden. Ich kann jedoch keinen Zertifikatseintrag für den Typ org.bouncycastle.openpgp.PGPPublicKey erstellen.

Ich habe durch das Web durchsucht, konnte aber keine gültige Beispiel finden:

  1. BouncyCastle Dokumentation: http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation Erzeugt Zertifikat für X.509-Schlüssel -
  2. BouncyCastle Beispiele - org.bouncycastle.openpgp. examples.DirectKeySignature: Fügen Sie certificat (Objekt vom Typ PGPSignature) direkt zum PGPPublicKey hinzu. Zum Schluss - Ich habe (zertifiziert) PGPPublicKey unterzeichnet, aber ich bin nicht in der Lage, diese Art von Schlüssel in den Java Keystore zu speichern.

    OutputStream out = new ByteArrayOutputStream(); 
    
    if (armor) 
    { 
        out = new ArmoredOutputStream(out); 
    } 
    
    PGPPrivateKey pgpPrivKey = secretKey.extractPrivateKey(secretKeyPass.toCharArray(), "BC"); 
    
    PGPSignatureGenerator  sGen = new PGPSignatureGenerator(secretKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1, "BC"); 
    
    sGen.initSign(PGPSignature.DIRECT_KEY, pgpPrivKey); 
    
    BCPGOutputStream   bOut = new BCPGOutputStream(out); 
    
    sGen.generateOnePassVersion(false).encode(bOut); 
    
    PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator(); 
    
    boolean isHumanReadable = true; 
    
    spGen.setNotationData(true, isHumanReadable, notationName, notationValue); 
    
    PGPSignatureSubpacketVector packetVector = spGen.generate(); 
    sGen.setHashedSubpackets(packetVector); 
    
    bOut.flush(); 
    
    return PGPPublicKey.addCertification(keyToBeSigned, sGen.generate()).getEncoded(); 
    

Ich bin vor allem interessiert an programatic Lösung (Java-Quellcode), sondern Beispiele, die einige Werkzeuge verwenden zu hilfreich sein.

Danke!

Antwort

0

Ich denke, Sie sollten eine java.security.PublicKey aus Ihrer PGPPublicKey extrahieren und daraus eine X509Certificate erstellen, die in einem Keystore gespeichert werden kann.

JcaPGPKeyConverter c = new JcaPGPKeyConverter(); 
PublicKey publicKey = c.getPublicKey(pgpPublicKey); 
// ... Use Bouncy's X509V3CertificateGenerator or X509v3CertificateBuilder 
// ... to construct a self-signed cert 
X509Certificate x509Certificate = // ... 
// ... add cert to KeyStore 

Um eine X509Certificate von einem PublicKey siehe zu erstellen: Generate random certificates.

0

Wenn Sie nur den öffentlichen Schlüssel speichern möchten, warum können Sie den Schlüsselinhalt nicht einfach im Java Keystore speichern? Rufen Sie dann den Inhalt ab und konvertieren Sie ihn bei Bedarf in ein PGPPublicKey-Objekt.

Erstellen Sie eine Wrapper-Klasse zuerst

public class PgpPublicKeyWrapper implements Key { 
    private final String keyContent; 
    public PgpPublicKeyWrapper(final String keyContent) { 
     this.keyContent = keyContent; 
    } 
    @Override 
    public String getAlgorithm() { 
     return "PGP-PublicKey"; // you can call whatever you want 
    } 
    @Override 
    public String getFormat() { 
     return "RAW"; // has to be raw format 
    } 
    @Override 
    public byte[] getEncoded() { 
     return keyContent.getBytes(); 
    } 
} 

Dann können Sie dies tun, um sie speichern

keyStore.setKeyEntry("think a name for alias", new PgpPublicKeyWrapper(key), PASSWORD, null); 

Wenn Sie es

Key key = this.keyStore.getKey(alias, PASSWORD); 
InputStream is = new ByteArrayInputStream(key.getEncoded()); 
PGPPublicKey publicKey = readPublicKey(is); 

Für readPublicKey() abrufen möchten, können Sie kann online viele Beispiele finden, wie InputStream zu einem PGPPublicKey-Objekt gelesen werden kann.