2012-04-05 28 views
6

Uso bouncycastle (JAVA) para firmar, encriptar, desencriptar y verificar firmas en la implementación de SSO. Tengo claves PGP públicas y privadas sin formato y necesito almacenarlas en el almacén de claves Java. Estas claves públicas de PGP no tienen certificado.Tienda de llaves PGP (públicas) en java keystore - Bouncycastle

Entiendo que para las claves públicas (de acuerdo con javadoc de Keystore: http://docs.oracle.com/javase/6/docs/api/java/security/KeyStore.html) tengo que crear el certificado. Una vez que se crea el certificado, puedo importarlo al almacén de claves como KeyStore.TrustedCertificateEntry. Sin embargo, no puedo crear una entrada de certificado para el tipo org.bouncycastle.openpgp.PGPPublicKey.

He buscado a través de la web, pero no pude encontrar ningún ejemplo válido:

  1. documentación BouncyCastle: http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation Genera certificado X.509 para las llaves -
  2. ejemplos BouncyCastle - org.bouncycastle.openpgp. examples.DirectKeySignature: Agregue certificat (objeto de tipo PGPSignature) directamente a PGPPublicKey. Para concluir, he firmado PGPPublicKey (certificado) pero no puedo almacenar este tipo de clave en el almacén de claves de Java.

    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(); 
    

estoy interesado principalmente en solución programática (código fuente de Java) pero los ejemplos que utilizan algunas herramientas será útil también.

Gracias!

Respuesta

0

Creo que debería extraer un java.security.PublicKey de su PGPPublicKey y usarlo para construir un X509Certificate que se puede almacenar en un almacén de claves.

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 

para crear un X509Certificate de un PublicKey véase: Generate random certificates.

0

Si solo quiere guardar la clave pública, ¿por qué no puede simplemente guardar el contenido clave en el almacén de claves Java? A continuación, recupere el contenido y conviértalo en un objeto PGPPublicKey cuando lo necesite.

Crear una clase contenedora primera

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

A continuación, puede hacer esto para guardarlo

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

Cuando se desea recuperarlo

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

Para readPublicKey(), se puede encontrar muchos ejemplos en línea sobre cómo leer InputStream a un objeto PGPPublicKey.

Cuestiones relacionadas