2015-06-29 8 views
1

У меня есть файл pkcs7, и я хочу загрузить его и извлечь его содержимое.Как загрузить файл PKCS7 (.p7b) в java

Я попробовал эти два метода:

byte[] bytes = Files.readAllBytes(Paths.get("myfile.p7b")); 
FileInputStream fi = new FileInputStream(file); 

//Creating PKCS7 object 
PKCS7 pkcs7Signature = new PKCS7(bytes); 

или это

FileInputStream fis = new FileInputStream(new File("myfile.p7b")); 
PKCS7 pkcs7Signature = new PKCS7(fis); 

, но я получил IOException: Sequence tag error

Так как я могу загрузить этот файл .P7B?

+0

Какой пакет является вашим классом 'PKCS7'? – mkl

+0

@mkl Пакет sun.security.pkcs. – Hakim

+0

Но я думаю, что Sun JCE не имеет прямой поддержки PKCS #. Наконец, я использовал библиотеку BouncyCastle. Я отправлю свое решение в разделе ответов. – Hakim

ответ

0

Попробуйте с этим. Он работает с другим модулем PKCS, не уверенным около 7.

final String KEYSTORE_FILE = "file path"; 
final String KEYSTORE_INSTANCE = "PKCS7"; 
final String KEYSTORE_PWD = "password"; 
final String KEYSTORE_ALIAS = "Key1"; 

KeyStore ks = KeyStore.getInstance(KEYSTORE_INSTANCE); 
ks.load(new FileInputStream(KEYSTORE_FILE), KEYSTORE_PWD.toCharArray()); 
Key key = ks.getKey(KEYSTORE_ALIAS, KEYSTORE_PWD.toCharArray()); 
PrivateKey privKey = (PrivateKey) key; 
0

Наконец-то я сделал это с библиотекой BouncyCastle.

PKCS # 7 - сложный формат, также называемый CMS. Sun JCE не имеет прямой поддержки PKCS # 7.

Это код, который я использовал для извлечения моего содержания:

// Loading the file first 
    File f = new File("myFile.p7b"); 
    byte[] buffer = new byte[(int) f.length()]; 
    DataInputStream in = new DataInputStream(new FileInputStream(f)); 
    in.readFully(buffer); 
    in.close(); 

    //Corresponding class of signed_data is CMSSignedData 
    CMSSignedData signature = new CMSSignedData(buffer); 
    Store cs = signature.getCertificates(); 
    SignerInformationStore signers = signature.getSignerInfos(); 
    Collection c = signers.getSigners(); 
    Iterator it = c.iterator(); 

    //the following array will contain the content of xml document 
    byte[] data = null; 

    while (it.hasNext()) { 
     SignerInformation signer = (SignerInformation) it.next(); 
     Collection certCollection = cs.getMatches(signer.getSID()); 
     Iterator certIt = certCollection.iterator(); 
     X509CertificateHolder cert = (X509CertificateHolder) certIt.next(); 

     CMSProcessable sc = signature.getSignedContent(); 
     data = (byte[]) sc.getContent(); 
    } 

Если вы хотите, чтобы проверить подпись этого pkcs7 файла с X509 сертификата, необходимо добавить следующий код в то время цикла:

// ************************************************************* // 
// ********************* Verify signature ********************** // 
//get CA public key 
// Create a X509 certificat 
CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509"); 

// Open the certificate file 
FileInputStream fileinputstream = new FileInputStream("myCA.cert"); 

//get CA public key 
PublicKey pk = certificatefactory.generateCertificate(fileinputstream).getPublicKey(); 

X509Certificate myCA = new JcaX509CertificateConverter().setProvider("BC").getCertificate(cert); 

myCA.verify(pk); 
System.out.println("Verfication done successfully "); 
Смежные вопросы