Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline AlenaPopova  
#1 Оставлено : 6 марта 2020 г. 11:57:13(UTC)
AlenaPopova

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.03.2020(UTC)
Сообщений: 1

Здарвствуйте, я пытаюсь пописать PDF документ подписью приходящей с клиетам вида :

Цитата:
private static final String base64 =
"MIIJAgYJKoZIhvcNAQcCoIII8zCCCO8CAQExDjAMBggqhQMHAQECAgUAME8GCSqGSIb3DQEHAaBC" +
"BEAwYjQ1NWIxYTRkODM0MWY1MzYzYjYzZDRiMWNiNWRhOGNiNDRkOWFkYmFlZjYxMGU4YmE3NGI4" +
"ZGFiMmM3NDQxoIIGEDCCAnMwggIioAMCAQICEDdBiIL1OaWSStROPeAC6jwwCAYGKoUDAgIDMH8x" +
"IzAhBgkqhkiG9w0BCQEWFHN1cHBvcnRAY3J5cHRvcHJvLnJ1MQswCQYDVQQGEwJSVTEPMA0GA1UE" +
"BxMGTW9zY293MRcwFQYDVQQKEw5DUllQVE8tUFJPIExMQzEhMB8GA1UEAxMYQ1JZUFRPLVBSTyBU" +
"ZXN0IENlbnRlciAyMB4XDTE5MDUyNzA3MjQyNloXDTI0MDUyNjA3MzQwNVowfzEjMCEGCSqGSIb3" +
"DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cx" +
"FzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVy" +
"IDIwYzAcBgYqhQMCAhMwEgYHKoUDAgIjAQYHKoUDAgIeAQNDAARAFJ8WBKirdlE7n2I7kcS8vMms" +
"YCxnesNFBe7mqMou1et7wvSJgTNSsyvHyuBtygTWK7PXEf7Dw9SNvBsb83vDkqN4MHYwCwYDVR0P" +
"BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE6DPhRp7+xdepUrXxH+NzIWSVUrMBIG" +
"CSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFARiVSkLDrHN0Xl9mrjIH2meNofzMAgG" +
"BiqFAwICAwNBAMTFstWxO3+hKCqD7nNz8mrQ9miOHV8RdVp7dRFPA58W5e4+JVghUpw+7fxOBkPx" +
"9UFeKRlnAiS7I93krlhKWkgwggOVMIIDRKADAgECAhMSAECsg2NxzP6oka1xAAEAQKyDMAgGBiqF" +
"AwICAzB/MSMwIQYJKoZIhvcNAQkBFhRzdXBwb3J0QGNyeXB0b3Byby5ydTELMAkGA1UEBhMCUlUx" +
"DzANBgNVBAcTBk1vc2NvdzEXMBUGA1UEChMOQ1JZUFRPLVBSTyBMTEMxITAfBgNVBAMTGENSWVBU" +
"Ty1QUk8gVGVzdCBDZW50ZXIgMjAeFw0yMDAyMTAxMTU2NDdaFw0yMDA1MTAxMjA2NDdaMIGZMSIw" +
"IAYJKoZIhvcNAQkBFhN2b3ZhbmVzc2FAbW1tYWlsLnJ1MRswGQYDVQQDDBLQktC+0LLQsNC90LXR" +
"gdGB0LAxDDAKBgNVBAsMA2JpYTEMMAoGA1UECgwDYmlhMRMwEQYDVQQHDApHb3JvZCBHcmV6MRgw" +
"FgYDVQQIDA9SYXNrYSBGZWRlcmFza2ExCzAJBgNVBAYTAlJGMGYwHwYIKoUDBwEBAQEwEwYHKoUD" +
"AgIkAAYIKoUDBwEBAgIDQwAEQIv3jje7b3mlXKsEyjSb6Rt/ovY+Az6NuKZBeeeleOxkGs8FGpwk" +
"ejZ90FWIIfw0Nf7tNPmclTsr1EvF1XZUdjOjggF3MIIBczAPBgNVHQ8BAf8EBQMDB/AAMBMGA1Ud" +
"JQQMMAoGCCsGAQUFBwMCMB0GA1UdDgQWBBTay33ATzz3+nnMle6cC1XxxYXtPjAfBgNVHSMEGDAW" +
"gBROgz4Uae/sXXqVK18R/jcyFklVKzBcBgNVHR8EVTBTMFGgT6BNhktodHRwOi8vdGVzdGNhLmNy" +
"eXB0b3Byby5ydS9DZXJ0RW5yb2xsL0NSWVBUTy1QUk8lMjBUZXN0JTIwQ2VudGVyJTIwMigxKS5j" +
"cmwwgawGCCsGAQUFBwEBBIGfMIGcMGQGCCsGAQUFBzAChlhodHRwOi8vdGVzdGNhLmNyeXB0b3By" +
"by5ydS9DZXJ0RW5yb2xsL3Rlc3QtY2EtMjAxNF9DUllQVE8tUFJPJTIwVGVzdCUyMENlbnRlciUy" +
"MDIoMSkuY3J0MDQGCCsGAQUFBzABhihodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9vY3NwL29j" +
"c3Auc3JmMAgGBiqFAwICAwNBAGyw1tmCq4aMXLk1dVvruuUDe/ZxhD/rZ1Reabj2HabnvuLVncUV" +
"O+AiBbIZe/cx1v8X6lyAyyN4Ms8IcPOdmWExggJzMIICbwIBATCBljB/MSMwIQYJKoZIhvcNAQkB" +
"FhRzdXBwb3J0QGNyeXB0b3Byby5ydTELMAkGA1UEBhMCUlUxDzANBgNVBAcTBk1vc2NvdzEXMBUG" +
"A1UEChMOQ1JZUFRPLVBSTyBMTEMxITAfBgNVBAMTGENSWVBUTy1QUk8gVGVzdCBDZW50ZXIgMgIT" +
"EgBArINjccz+qJGtcQABAECsgzAMBggqhQMHAQECAgUAoIIBcTAYBgkqhkiG9w0BCQMxCwYJKoZI" +
"hvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yMDAzMDMwOTU3MzZaMB0GCisGAQQBgjdYAgExDwQNRG9j" +
"dW1lbnQgTmFtZTAvBgkqhkiG9w0BCQQxIgQgOUzu38jfujfOzd+gclbtVpWhnsoUpyBVI9mjbQRU" +
"i3YwgeYGCyqGSIb3DQEJEAIvMYHWMIHTMIHQMIHNMAoGCCqFAwcBAQICBCB4xIE4DsAdaJ7tgD0r" +
"tGfvs5nNu4YlTpH3lkncxb1AeDCBnDCBhKSBgTB/MSMwIQYJKoZIhvcNAQkBFhRzdXBwb3J0QGNy" +
"eXB0b3Byby5ydTELMAkGA1UEBhMCUlUxDzANBgNVBAcTBk1vc2NvdzEXMBUGA1UEChMOQ1JZUFRP" +
"LVBSTyBMTEMxITAfBgNVBAMTGENSWVBUTy1QUk8gVGVzdCBDZW50ZXIgMgITEgBArINjccz+qJGt" +
"cQABAECsgzAMBggqhQMHAQEBAQUABEC2Mlm54/dY+H8xBosYFpcGqqvqJy3jSIa3nMGeXccHbE65" +
"ZDoD6htyKbvkA8666iWCFQ3Ozv8UsgQxwqkGbvBX";


дело в том,что это нужно сделать без приватного ключа, я использую библиотеку itext патч 5 5 5

Цитата:

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSignatureAppearance;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfString;
import com.itextpdf.text.pdf.security.ExternalBlankSignatureContainer;
import com.itextpdf.text.pdf.security.ExternalSignatureContainer;
import com.itextpdf.text.pdf.security.MakeSignature;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.exception.CAdESException;
import ru.bia.traffic.exceptons.InternalException;
import ru.bia.traffic.models.BrowserSignatureContainer;
import ru.bia.traffic.models.Subject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Base64;

public class SignFilePdf {


public byte[] sign(byte[] document, String signature) throws CAdESException {
byte[] result;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
CAdESSignature cadesSignature = new CAdESSignature(Base64.getDecoder().decode(signature), null, null);
Subject subject = new Subject(cadesSignature
.getCAdESSignerInfo(0)
.getSignerCertificate()
.getSubjectX500Principal()
.getEncoded()
);
X509Certificate certificate = cadesSignature
.getCAdESSignerInfo(0)
.getSignerCertificate();
PdfReader reader = new PdfReader(getDocumentWithEmptySignatureContainer(
document,
subject,
certificate));
ExternalSignatureContainer container = new BrowserSignatureContainer(signature,
PdfName.ADOBE_CryptoProPDF,
PdfName.ADBE_PKCS7_DETACHED);
AcroFields af = reader.getAcroFields();
ArrayList<String> signatureNames = af.getSignatureNames();
if (signatureNames.isEmpty()) {
throw new InternalException("Document dont contains signature field!");
}
MakeSignature.signDeferred(reader, signatureNames.get(signatureNames.size() - 1), outputStream, container);
result = outputStream.toByteArray();
}
catch (IOException e) {
throw new InternalException("IO exception by edd empty signature field : ", e);
}
catch (GeneralSecurityException e) {
throw new InternalException("Security exception by edd empty signature field : ", e);
}
catch (DocumentException e) {
throw new InternalException("Document exception by edd empty signature field : ", e);
}
finally {
try {
outputStream.close();
}
catch (IOException e) {
log.error("Error close stream document {}", e.getMessage());
}
}
return result;
}

public byte[] getDocumentWithEmptySignatureContainer(byte[] document,
Subject subject,
X509Certificate certificate)
throws GeneralSecurityException, IOException, DocumentException {
byte[] data;
ByteArrayOutputStream os = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(document);
try {
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setCertificate(certificate);
appearance.setLocation(subject.country());
appearance.setLocationCaption(subject.state().orElse(""));
appearance.setSignatureCreator(subject.commonName());
appearance.setContact(subject.email().orElse(""));
appearance.setReason("Я рецензировал этот документ");
appearance.setSignatureEvent(
sig -> sig.put(PdfName.NAME, new PdfString(subject.commonName()))
);
appearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);

ExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_CryptoProPDF,
PdfName.ADBE_PKCS7_DETACHED);
MakeSignature.signExternalContainer(appearance, external, 8192);
data = os.toByteArray();
}
finally {
reader.close();
os.close();
}
return data;
}
}



Цитата:

import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.security.ExternalSignatureContainer;

import java.io.InputStream;
import java.util.Base64;

public class BrowserSignatureContainer implements ExternalSignatureContainer {
private byte[] sinedData;
private PdfDictionary sigDic;

public BrowserSignatureContainer(String signature, PdfName filter, PdfName subFilter) {
this.sinedData = Base64.getDecoder().decode(signature);
this.sigDic = new PdfDictionary();
this.sigDic.put(PdfName.FILTER, filter);
this.sigDic.put(PdfName.SUBFILTER, subFilter);
}

public byte[] sign(InputStream is) {
return sinedData;
}

public void modifySigningDictionary(PdfDictionary pdfDictionary) {
sigDic.putAll(this.sigDic);
}
}


Подскажите,все ли правильно я делаю, когда созраняю полученные байты в pdf от метода sign, то отображается, что подпись недействительна, потому что документ был поврежден

Отредактировано пользователем 6 марта 2020 г. 11:58:48(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#2 Оставлено : 11 марта 2020 г. 16:22:00(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,215
Российская Федерация

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 285 раз в 265 постах
Добрый день!
посмотрите пример в
samples-sources.jar\PDF\*.java
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.