2012-04-05 41 views
6

Tôi đang sử dụng bouncycastle (JAVA) để ký, mã hóa, giải mã và xác minh chữ ký khi triển khai SSO. Tôi có khóa PGP công khai và riêng tư và tôi cần lưu trữ chúng trong kho khóa Java. Các khóa công khai PGP này không có chứng chỉ.Lưu khóa PGP (công khai) trong kho khóa java - Bouncycastle

Tôi hiểu rằng đối với khóa công cộng (theo javadoc của Keystore: http://docs.oracle.com/javase/6/docs/api/java/security/KeyStore.html) Tôi phải tạo chứng chỉ. Sau khi chứng chỉ được tạo, tôi có thể nhập nó vào kho khóa là KeyStore.TrustedCertificateEntry. Tuy nhiên, tôi không thể tạo mục nhập chứng chỉ cho loại org.bouncycastle.openpgp.PGPPublicKey.

Tôi đã tìm kiếm thông qua các trang web nhưng không thể tìm thấy bất kỳ ví dụ hợp lệ:

  1. BouncyCastle tài liệu: http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation Tạo giấy chứng nhận cho các phím X.509 -
  2. BouncyCastle ví dụ - org.bouncycastle.openpgp. example.DirectKeySignature: Thêm certificat (đối tượng kiểu PGPSignature) trực tiếp vào PGPPublicKey. Để kết luận - Tôi đã ký (PGPPublicKey đã được chứng nhận) nhưng tôi không thể lưu loại khóa này vào kho khóa 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(); 
    

tôi chủ yếu quan tâm đến giải pháp programatic (mã nguồn java) nhưng ví dụ có sử dụng một số công cụ sẽ rất hữu ích quá.

Cảm ơn!

Trả lời

0

Tôi nghĩ bạn nên trích xuất số java.security.PublicKey từ số PGPPublicKey và sử dụng để tạo X509Certificate có thể được lưu trữ trong kho khóa.

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 

Để tạo một X509Certificate từ một see PublicKey: Generate random certificates.

0

Nếu bạn chỉ muốn lưu khóa công khai, tại sao bạn không thể lưu nội dung chính vào kho khóa Java? Sau đó truy xuất nội dung và chuyển đổi thành đối tượng PGPPublicKey khi bạn cần.

Tạo một lớp wrapper đầu tiên

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

Sau đó, bạn có thể làm điều này để lưu nó

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

Khi bạn muốn lấy nó

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

Đối readPublicKey(), bạn có thể tìm thấy rất nhiều ví dụ trực tuyến về cách đọc InputStream với đối tượng PGPPublicKey.

Các vấn đề liên quan