Как получить сертификат из файла pkcs7 с помощью bouncycastle?

Всем привет! Моя проблема следующая: у меня есть файл .pkcs7, который состоит из предварительно упакованного CSR, и я хочу получить из него CSR. Как я могу сделать это с помощью bouncycastle?

Я пытался использовать PEMReader, но это не сработало.


    private void getCertificatesPKCS7File(String filename){
        try {
            certificates = new ArrayList();

            FileReader fileReader = new FileReader(filename);
            PEMReader pemReader = new PEMReader(fileReader);
           // Object obj = pemReader.readObject();
           // PKCS10CertificationRequest csr = (PKCS10CertificationRequest) obj;
            Object obj = pemReader.readPemObject().getContent();
            PKCS10CertificationRequest csr = new PKCS10CertificationRequest(obj);

            pemReader.close(); 

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Исключение следующее:


Exception in thread "main" java.lang.IllegalArgumentException: unknown object in factory: org.bouncycastle.asn1.ASN1ObjectIdentifier
    at org.bouncycastle.asn1.pkcs.CertificationRequestInfo.getInstance(Unknown Source)
    at org.bouncycastle.asn1.pkcs.CertificationRequest.(Unknown Source)
    at org.bouncycastle.jce.PKCS10CertificationRequest.(Unknown Source)

Спасибо всем!


person blackhard    schedule 10.04.2013    source источник
comment
Какую ошибку вы получаете?   -  person laz    schedule 11.04.2013


Ответы (1)


Я нашел решение.

KeyStore keystore = KeyStore.getInstance("PKCS12", "BC");
keystore.load (new FileInputStream(PATH+"//test.p12"), "testpassword".toCharArray());
PrivateKey privateKey = (PrivateKey)keystore.getKey("testclientcert", "testpassword".toCharArray());

PEMReader pemReader = new PEMReader(new FileReader(filename));
ContentInfo object = (ContentInfo)pemReader.readObject();

CMSEnvelopedDataParser envDataParser = new CMSEnvelopedDataParser(object.getEncoded());
RecipientInformationStore recipients = envDataParser.getRecipientInfos();
Collection envCollection = recipients.getRecipients();
Iterator it = envCollection.iterator();
RecipientInformation recipient = (RecipientInformation) it.next();
byte[] result = recipient.getContent(privateKey, "BC");
String base64Encoded = new String(Base64.encode(result));

System.out.println(base64Encoded);

base64Encoded будет соответствовать закодированному csr.

person blackhard    schedule 12.04.2013
comment
Кажется, это действительно решение для PKCS12? - person not2savvy; 24.07.2018