Проверка ЭЦП на Java(Kalkan) в формате ЕСЭДО
(1 чел.) (1) гость
  • Страница:
  • 1

ТЕМА: Проверка ЭЦП на Java(Kalkan) в формате ЕСЭДО

Проверка ЭЦП на Java(Kalkan) в формате ЕСЭДО 1 год, 2 мес. назад #4173

  • karjaubayev
  • Новый участник
  • Постов: 7
  • Репутация: 0
Добрый день,
Не проходить проверка ЭЦП. Передается sign detached, то есть с проверкой вложенных файлов отдельно как data.
В формате ЕСЭДО говориться в data ЭЦП руководителя передается конкатенация содержимого вложений, вроде делаю что нужно, но проверка не валидна.
Думал может Хэш-сумму кидать в verify, но в форуме говорится Kalkan сам формирует хэш.
Для детальности могу скинуть исходный base64 signature.

СЭД - IBM Lotus Notes, SDK - Java(Kalkan), исходные данные - документ LotusNotes сформированный из переданного XML.


Делаю следующим образом:
Перевожу файлы в binary->Base64.encode()
Передаю sign(ЭЦП) и data(вложения) в метод checkSignM, который передает sign и data в виде Base64 на verifyCMSSignatureM
// Body - содержит вложенный файлы в виде docx, pdf
// doc - Lotus документ содержащий поля signature, data, author etc.
// P.S. некоторые части коды убрал для четабельности


/////////////////////////////////// перевод вложений в binary->Base64.encode() //////////////////////
if (doc.hasEmbedded()) {
    RichTextItem Body = (RichTextItem) doc.getFirstItem("Body");
    Vector atts = Body.getEmbeddedObjects();
    String f1 = "";
    for (int i = 0; i < atts.size(); i++) {
    EmbeddedObject att = (EmbeddedObject) atts.elementAt(i);
    if (att.getType() == EmbeddedObject.EMBED_ATTACHMENT && doc.getItemValue("file_linkFileName").get(i).equals(att.getName())) {
        InputStream In = att.getInputStream();
        ByteArrayOutputStream fos = new ByteArrayOutputStream();
        byte buffer[] = new byte[(int) att.getFileSize()];
        int read;
        do {
            read = In.read(buffer, 0, buffer.length);
            if (read > 0) {
                fos.write(buffer, 0, read);
            }
        } while (read > -1);
        fos.close();
        In.close();
        f1 = f1 + new String(Base64.getEncoder().encode(buffer));
    }
}
for (int i = 0; i < doc.getItemValue("SignatureECP").size(); i++) {
    if (checkSignM(doc.getItemValue("SignatureECP").get(i).toString(), f1, true)) {
        doc.replaceItemValue("SignStatus", "1");
    }
    else {
        errorlog = errorlog + " Подпись Главного из Вне не прошла успешно!";
    }
}
/////////////////////////////////// checkSignM //////////////////////
public static boolean checkSignM(String sign, String data, boolean fromDocumentolog) {
    ResultWrapper rw = null;
        if (fromDocumentolog) {
            rw = verifyCMSSignatureM(sign, data);
        }
}
/////////////////////////////////// verifyCMSSignatureM //////////////////////
public static ResultWrapper verifyCMSSignatureM(String sigantureToVerify, String signedData) {
    ResultWrapper rw;
    Provider provider = null;
    try {
        provider = new KalkanProvider();
        Security.addProvider(provider);
        CMSSignedData e = new CMSSignedData(Base64.getDecoder().decode(sigantureToVerify));
        boolean isAttachedContent = e.getSignedContent() != null;
        if (isAttachedContent) {
            e = new CMSSignedData(e.getEncoded());
        } else {
            CMSProcessableByteArray signers = new CMSProcessableByteArray(signedData.getBytes("UTF-8"));
            e = new CMSSignedData(signers, e.getEncoded());
        }
        SignerInformationStore signers1 = e.getSignerInfos();
        CertStore certs = e.getCertificatesAndCRLs("Collection", provider.getName());
        Iterator it = signers1.getSigners().iterator();
        boolean overAllResult = true;

        while (it.hasNext()) {
            SignerInformation signer = (SignerInformation) it.next();
            SignerId signerConstraints = signer.getSID();
            Collection certCollection = certs.getCertificates(signerConstraints);
            X509Certificate cert;
            for (Iterator certIt = certCollection.iterator(); certIt.hasNext(); overAllResult = overAllResult && signer.verify(cert, provider.getName())) {
                cert = (X509Certificate) certIt.next();
            }
        }
        rw = new ResultWrapper();
        rw.setResult(Boolean.valueOf(overAllResult));
    }
}
Изменено: 1 год, 2 мес. назад от karjaubayev. Причина: Дополнение информации

Re: Проверка ЭЦП на Java(Kalkan) в формате ЕСЭДО 1 год, 1 мес. назад #4194

  • Murat Seisenov
  • Модератор
  • Постов: 391
  • Репутация: 19
Добрый день!

Мы не знаем какие форматы используются в ЕСЭДО. Вам необходимо обратить в тех. поддержку ЕСЭДО.
Модератор
  • Страница:
  • 1
FaLang translation system by Faboba