Добрый день,
Не проходить проверка ЭЦП. Передается 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));
}
}