В общем, для цифровой подписи документа вам нужен закрытый ключ и сертификат (и, возможно, цепочку сертификации), и вы оба:
закрытый ключ используется для подписания запроса на подпись сертификата, отправленного на сервер (который включает некоторые данные сертификата, такие как CN
и открытый ключ)
Сертификат (и, возможно, цепь) возвращается сервером
Я не эксперт в IText, но вы можете увидеть в this example, что подпись сделана с закрытым ключом и цепью. Хранилище pkcs12 используется только для извлечения ключа и цепочки.
public void signPdfFirstTime(String src, String dest)
throws IOException, DocumentException, GeneralSecurityException {
String path = properties.getProperty("PRIVATE");
String keystore_password = properties.getProperty("PASSWORD");
String key_password = properties.getProperty("PASSWORD");
KeyStore ks = KeyStore.getInstance("pkcs12", "BC");
ks.load(new FileInputStream(path), keystore_password.toCharArray());
String alias = (String)ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, key_password.toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);
// reader and stamper
PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
// appearance
PdfSignatureAppearance appearance = stamper .getSignatureAppearance();
appearance.setImage(Image.getInstance(RESOURCE));
appearance.setReason("I've written this.");
appearance.setLocation("Foobar");
appearance.setVisibleSignature(new Rectangle(72, 732, 144, 780), 1, "first");
// digital signature
ExternalSignature es = new PrivateKeySignature(pk, "SHA-256", "BC");
ExternalDigest digest = new BouncyCastleDigest();
MakeSignature.signDetached(appearance, digest, es, chain, null, null, null, 0, CryptoStandard.CMS);
}
привет, письменным свидетельством, вы имеете в виду общественную часть, которая является? – BekaBot
Да, сертификат является публичной частью. Файл .cer содержит сертификат – pedrofb