Статус: Новичок
Группы: Участники
Зарегистрирован: 27.03.2016(UTC) Сообщений: 5 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Поблагодарили: 2 раз в 1 постах
|
Добрый день! Подскажите как добавить несколько подписей к одному pdf документу? Первую подпись к pdf документу добавляю следующим образом Код:
public static void main(String args[]) throws Exception {
String source = "Y:\\Documents\\NetBeansProjects\\esign\\sample.pdf";
String signed_file = "Y:\\Documents\\NetBeansProjects\\esign\\signed_file.pdf";
PdfReader reader = new PdfReader(source);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfStamper stamper = PdfStamper.createSignature(reader, new FileOutputStream(signed_file), '\0');
PdfSignatureAppearance sap = stamper.getSignatureAppearance();
sap.setReason("Test");
sap.setLocation("On a server!");
sap.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
Certificate cert = getCertificate();
Certificate[] chain = {cert};
sap.setCertificate(chain[0]);
PdfSignature dic = new PdfSignature(
PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
dic.setReason(sap.getReason());
dic.setLocation(sap.getLocation());
dic.setContact(sap.getContact());
dic.setDate(new PdfDate(sap.getSignDate()));
sap.setCryptoDictionary(dic);
HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
Integer csize = 8192;
exc.put(PdfName.CONTENTS, new Integer(csize * 2 + 2));
sap.preClose(exc);
KeyStore ks = KeyStore.getInstance(JCP.HD_STORE_NAME);
String alias = "61a241ac4-ac58-22b4-2ba4-921b982a534";
ks.load(null, null);
PrivateKey pk = (PrivateKey) ks.getKey(alias, "12345678".toCharArray());
byte[] data = CMSSign(IOUtils.toByteArray(sap.getRangeStream()), pk, cert, true);
System.out.println(new String(data));
byte[] outc = new byte[csize];
PdfDictionary dic2 = new PdfDictionary();
System.arraycopy(data, 0, outc, 0, data.length);
dic2.put(PdfName.CONTENTS, new PdfString(outc).setHexWriting(true));
sap.close(dic2);
}
public static Certificate getCertificate() throws Exception {
String cert_path = "Y:\\Documents\\NetBeansProjects\\esign\\publicCert.crt";
FileInputStream is = new FileInputStream(cert_path);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate cert = cf.generateCertificate(is);
return cert;
}
public static byte[] CMSSign(byte[] data, PrivateKey key, Certificate cert,
boolean detached)
throws Exception {
// sign
//Возвращает объект Signature, который реализует указанный алгоритм подписи.
final Signature signature =
Signature.getInstance(JCP.GOST_EL_SIGN_NAME);
//Инициализировать объект для подписания.
signature.initSign(key);
//Обновление данных, которые должны быть подписаны.
signature.update(data);
//Возвращает байты сигнатуры
final byte[] sign = signature.sign();
//создаем cms подпись
return createCMS(data, sign, cert, detached);
}
public static byte[] createCMS(byte[] buffer, byte[] sign, Certificate cert,
boolean detached)
throws Exception {
final ContentInfo all = new ContentInfo();
//создаем формат записи
all.contentType = new Asn1ObjectIdentifier(new OID("1.2.840.113549.1.7.2").value);
//создаем подпись
final SignedData cms = new SignedData();
all.content = cms;
//целое число, обозначающее версию используемого синтаксиса
cms.version = new CMSVersion(1);
// digest
//идентификатор одной или нескольких хеш-функций которые используются при вычислении подписей.
cms.digestAlgorithms = new DigestAlgorithmIdentifiers(1);
//Идентификатор алгоритма хешировани
final DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(new OID(JCP.GOST_DIGEST_OID).value);
a.parameters = new Asn1Null();
cms.digestAlgorithms.elements[0] = a;
if (detached) {
cms.encapContentInfo = new EncapsulatedContentInfo(
new Asn1ObjectIdentifier(
new OID("1.2.840.113549.1.7.1").value), null);
} else {
cms.encapContentInfo =
new EncapsulatedContentInfo(new Asn1ObjectIdentifier(
new OID("1.2.840.113549.1.7.1").value),
new Asn1OctetString(buffer));
}
// certificate
cms.certificates = new CertificateSet(1);
final ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate certificate =
new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate();
final Asn1BerDecodeBuffer decodeBuffer =
new Asn1BerDecodeBuffer(cert.getEncoded());
certificate.decode(decodeBuffer);
cms.certificates.elements = new CertificateChoices[1];
cms.certificates.elements[0] = new CertificateChoices();
cms.certificates.elements[0].set_certificate(certificate);
// signer info
cms.signerInfos = new SignerInfos(1);
cms.signerInfos.elements[0] = new SignerInfo();
cms.signerInfos.elements[0].version = new CMSVersion(1);
cms.signerInfos.elements[0].sid = new SignerIdentifier();
final byte[] encodedName = ((X509Certificate) cert).getIssuerX500Principal().getEncoded();
final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName);
final Name name = new Name();
name.decode(nameBuf);
final CertificateSerialNumber num = new CertificateSerialNumber(
((X509Certificate) cert).getSerialNumber());
cms.signerInfos.elements[0].sid.set_issuerAndSerialNumber(
new IssuerAndSerialNumber(name, num));
cms.signerInfos.elements[0].digestAlgorithm =
new DigestAlgorithmIdentifier(new OID(JCP.GOST_DIGEST_OID).value);
cms.signerInfos.elements[0].digestAlgorithm.parameters = new Asn1Null();
cms.signerInfos.elements[0].signatureAlgorithm =
new SignatureAlgorithmIdentifier(new OID(JCP.GOST_EL_KEY_OID).value);
cms.signerInfos.elements[0].signatureAlgorithm.parameters = new Asn1Null();
cms.signerInfos.elements[0].signature = new SignatureValue(sign);
// encode
final Asn1BerEncodeBuffer asnBuf = new Asn1BerEncodeBuffer();
all.encode(asnBuf, true);
return asnBuf.getMsgCopy();
}
Как мне добавить еще одну подпись, другого человека, к подписанному документу? Те чтобы документ был подписан двумя разными ключами. Примеров в JCP/sample по данной проблеме не нашел(( Если есть образец кода то будет супер или направьте куда рыть) Спасибо Отредактировано пользователем 27 марта 2016 г. 17:43:07(UTC)
| Причина: Не указана
|