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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline pavenko_sv  
#1 Оставлено : 24 августа 2017 г. 14:49:00(UTC)
pavenko_sv

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.08.2017(UTC)
Сообщений: 70
Мужчина
Российская Федерация
Откуда: Нижний Новгород

Сказал «Спасибо»: 39 раз
Доброе время суток,

Как я могу использую Крипто Про плаин решить следующие задачи:

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) Архив всего комплекта с вышеуказанными доками

Заранне благодарю.
Offline pavenko_sv  
#2 Оставлено : 8 сентября 2017 г. 9:08:41(UTC)
pavenko_sv

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline pavenko_sv  
#3 Оставлено : 8 сентября 2017 г. 9:09:55(UTC)
pavenko_sv

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.08.2017(UTC)
Сообщений: 70
Мужчина
Российская Федерация
Откуда: Нижний Новгород

Сказал «Спасибо»: 39 раз
Автор: pavenko_sv Перейти к цитате
Автор: 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 SignCreate(thumbprint, dataToSign) {

    let oCertificate;
    let oSigner;
    let oSignedData;
    let sSignedMessage;

    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_SHA1_HASH, thumbprint);

    if (oCertificates.Count == 0) {
        return "Certificate not found: " + thumbprint;
    }

    oCertificate = oCertificates.Item(1);
    oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
    oSigner.Certificate = oCertificate;
    oSigner.TSAAddress = "http://testca.cryptopro.ru/tsp/tsp.srf";

    oSignedData = cadesplugin.CreateObject("CAdESCOM.CadesSignedData");
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
    oSignedData.Content = dataToSign.replace('data:application/pdf;base64,', '');

    try {
        sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1, false);
    } catch (err) {
        return "Failed to create signature. Error: " + GetErrorMessage(err);
    }

    try {
        oSignedData.VerifyCades(sSignedMessage, CADESCOM_CADES_X_LONG_TYPE_1, false);
    } catch (err) {
        alert("Failed to verify signature. Error: " + cadesplugin.getLastError(err));
        return false;
    }

    oStore.Close();
    return sSignedMessage;
}


Определяется какую подпись возвращать 3-м значением "detach" (true/false) тут:

sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1, false);

Значение "CADESCOM_CADES_X_LONG_TYPE_1" определяет используется ли штамп времени:
oSigner.TSAAddress = "http://testca.cryptopro.ru/tsp/tsp.srf"; - это сервер для его корректной работы нужна тестовая подпись созданная в КриптоПро

Цитата:
-если тестовый личный сертификат выпускали здесь https://www.cryptopro.ru/ui/
то используйте стенд http://www.cryptopro.ru/tsp/tsp.srf

-если тестовый личный сертификат выпускали здесь https://www.cryptopro.ru/certsrv/
используйте стенд http://testca.cryptopro.ru/tsp/tsp.srf


По поводу своих пунктов:
Цитата:
2.2) подпись (и подписи ранних подписантов)

Подписывать один файл можно сколько угодно раз. Во всяком случае подписывал дважды в PDF и невижу пока трудностей подписать через браузер ный КриптоПро Плагин

Цитата:

2.3) протокол с перечнем данных всех подписантов ранее подписываемых текущий документ
2.4) Архив всего комплекта с вышеуказанными доками

Фичи Диадока видимо придётся делать самому. Выполняя требования: ГОСТ Р 7.0.97-2016
лучше читается тут



Оригиналы можно скачать отсюда: https://github.com/pavenkostanislav/GetingCertificatesList

PS: Ссылки на внешние ресурсы нормальные, если модераторы не против прошу оставить

Отредактировано пользователем 8 сентября 2017 г. 9:21:44(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.