Как загрузить файл 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;