Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.08.2017(UTC) Сообщений: 70   Откуда: Нижний Новгород Сказал «Спасибо»: 39 раз
|
Автор: pavenko_sv  Доброе время суток, Как я могу использую Крипто Про плаин решить следующие задачи: 1) Выбрав на странице неформализованный документ (например: docx, pdf...) подписать его полученным из коллекции сертификатом Код:
let oStore = cadesplugin.CreateObject("CAPICOM.Store");
oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
let oCertificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
2) Получить 4 файла: 2.1) подписанный докуменит 2.2) подпись (и подписи ранних подписантов) 2.3) протокол с перечнем данных всех подписантов ранее подписываемых текущий документ 2.4) Архив всего комплекта с вышеуказанными доками Заранне благодарю. Немного поразобрался и вот, для обозревателей инфушка: 1) Можно из коллекции если используется значение CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED, но проще передать какой-нибудь параметр поуникальнее, я использую отпечаток подписи (thumbprint) и найти повторно: Код:function FillCertList_NPAPI() {
let certList = [];
let dateObj = new Date();
let count = 0;
let text;
let certCnt;
let oStore;
let cert;
try {
oStore = cadesplugin.CreateObject("CAdESCOM.Store");
//https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa388130(v=vs.85).aspx
oStore.Open();
} catch (ex) {
return "Ошибка при открытии хранилища: " + GetErrorMessage(ex);
}
try {
certCnt = oStore.Certificates.Count;
if (certCnt == 0) {
return certList;
}
} catch (ex) {
let message = GetErrorMessage(ex);
if ("Cannot find object or property. (0x80092004)" == message ||
"oStore.Certificates is undefined" == message ||
"Объект или свойство не найдено. (0x80092004)" == message) {
oStore.Close();
return message;
}
}
for (let i = 1; i <= certCnt; i++) {
try {
cert = oStore.Certificates.Item(i);
} catch (ex) {
return "Ошибка при перечислении сертификатов: " + GetErrorMessage(ex);
}
try {
if (dateObj < cert.ValidToDate && cert.HasPrivateKey() && cert.IsValid().Result) {
let issuedBy = cert.GetInfo(1);
issuedBy = issuedBy || "";
let certObj = new CertificateObj(cert);
text = certObj.GetCertString();
//let oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
//oSigner.Certificate = cert;
let certBinary = cert.Export(CADESCOM_ENCODE_BASE64);
certList.push({
'value': text.replace(/^cn=([^;]+);.+/i, '$1'),
'text': text.replace("CN=", ""),
'subject': certObj.GetCertName(),
'issuer': certObj.GetIssuer(),
'from': certObj.GetCertFromDate(),
'till': certObj.GetCertTillDate(),
'algorithm': certObj.GetPubKeyAlgorithm(),
'provname': certObj.GetPrivateKeyProviderName(),
'thumbprint': cert.Thumbprint.split(" ").reverse().join("").replace(/\s/g, "").toUpperCase(),
'privateKey': cert.PrivateKey,
'signature': certBinary
});
count++;
} else { continue; }
} catch (ex) {
return "Ошибка при получении параметров установленных сертификатов: " + GetErrorMessage(ex);
}
}
oStore.Close();
return certList;
}
2) Подписать можно аж в двух вариантах: Прикреплённой и Отсоединённой подписью мой вариант работает для прикреплённой подписи (на выходе получается подпись с влеженным контентом файла припроверке сравнивает себя с кентентом): Код:function FillCertList_NPAPI() {
let certList = [];
let dateObj = new Date();
let count = 0;
let text;
let certCnt;
let oStore;
let cert;
try {
oStore = cadesplugin.CreateObject("CAdESCOM.Store");
//https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa388130(v=vs.85).aspx
oStore.Open();
} catch (ex) {
return "Ошибка при открытии хранилища: " + GetErrorMessage(ex);
}
try {
certCnt = oStore.Certificates.Count;
if (certCnt == 0) {
return certList;
}
} catch (ex) {
let message = GetErrorMessage(ex);
if ("Cannot find object or property. (0x80092004)" == message ||
"oStore.Certificates is undefined" == message ||
"Объект или свойство не найдено. (0x80092004)" == message) {
oStore.Close();
return message;
}
}
for (let i = 1; i <= certCnt; i++) {
try {
cert = oStore.Certificates.Item(i);
} catch (ex) {
return "Ошибка при перечислении сертификатов: " + GetErrorMessage(ex);
}
try {
if (dateObj < cert.ValidToDate && cert.HasPrivateKey() && cert.IsValid().Result) {
let issuedBy = cert.GetInfo(1);
issuedBy = issuedBy || "";
let certObj = new CertificateObj(cert);
text = certObj.GetCertString();
//let oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
//oSigner.Certificate = cert;
let certBinary = cert.Export(CADESCOM_ENCODE_BASE64);
certList.push({
'value': text.replace(/^cn=([^;]+);.+/i, '$1'),
'text': text.replace("CN=", ""),
'subject': certObj.GetCertName(),
'issuer': certObj.GetIssuer(),
'from': certObj.GetCertFromDate(),
'till': certObj.GetCertTillDate(),
'algorithm': certObj.GetPubKeyAlgorithm(),
'provname': certObj.GetPrivateKeyProviderName(),
'thumbprint': cert.Thumbprint.split(" ").reverse().join("").replace(/\s/g, "").toUpperCase(),
'privateKey': cert.PrivateKey,
'signature': certBinary
});
count++;
} else { continue; }
} catch (ex) {
return "Ошибка при получении параметров установленных сертификатов: " + GetErrorMessage(ex);
}
}
oStore.Close();
return certList;
}
Отредактировано пользователем 8 сентября 2017 г. 9:09:15(UTC)
| Причина: Не указана
|