Как загрузить файл PKCS7 (.p7b) в Java

У меня есть pkcs7 файл, и я хочу загрузить его и извлечь его содержимое.

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

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?

1 ответ

Наконец я сделал это с библиотекой 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, вы должны добавить следующий код в цикл while:

// ************************************************************* //
// ********************* 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 ");

Попробуй с этим. Он работает с другим модулем 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;
Другие вопросы по тегам