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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline wwq  
#1 Оставлено : 22 апреля 2021 г. 8:04:01(UTC)
wwq

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

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

пытаюсь подписать сообщение на lazarus с помощью cades plugin:


function SignData(bl_Detached: boolean; S_in: ANSIString; var S_out: AnsiString; g_Cert:OleVariant; g_Cert_Pass:string) :boolean;
const
CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
CADESCOM_BASE64_TO_BINARY = 1;
var
v_Signer, v_SignedData : Variant;

begin
Result := False;
try
v_Signer := CreateOLEObject('CadesCOM.CPSigner');
v_Signer.Certificate := g_Cert;

if g_Cert_Pass<>'' then
v_Signer.KeyPin := g_Cert_Pass;

v_Signer.Options := 1;// CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN := 1;

V_SignedData := CreateOLEObject('CAdESCOM.CadesSignedData');

v_SignedData.ContentEncoding := CADESCOM_BASE64_TO_BINARY;

s_in := EncodeStringBase64(s_in);
v_SignedData.Content := s_in;
s_out := v_SignedData.SignCades(v_Signer, CADESCOM_CADES_TYPE, bl_Detached,0);

Result := True;
finally
if not VarIsNull(v_Signer) then v_Signer := Unassigned;
if not VarIsNull(v_SignedData) then v_SignedData := Unassigned;
end;
end;

на этапе v_SignedData.Content := s_in; получаю ошибку "Параметр задан не верно".

на входе:
s_in := 'LTHNSNHGVUSLTDARDNXDKZATUJHTBK';

в base64:
TFRITlNOSEdWVVNMVERBUkROWERLWkFUVUpIVEJL

что я делаю не так? уже голову сломал...
в delphi вся конструкция работает нормально.
Offline Андрей *  
#2 Оставлено : 23 апреля 2021 г. 23:12:06(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
Автор: wwq Перейти к цитате
пытаюсь подписать сообщение на lazarus с помощью cades plugin:


function SignData(bl_Detached: boolean; S_in: ANSIString; var S_out: AnsiString; g_Cert:OleVariant; g_Cert_Pass:string) :boolean;
что я делаю не так? уже голову сломал...
в delphi вся конструкция работает нормально.




ANSIString нет в COM.

Цитата:

S_in: ANSIString; var S_out: AnsiString


Заменить на WideString и всё заработает.


Snimok ehkrana ot 2021-04-24 00-11-42.png (19kb) загружен 10 раз(а).
Техническую поддержку оказываем тут
Наша база знаний
Offline wwq  
#3 Оставлено : 26 мая 2021 г. 17:55:47(UTC)
wwq

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

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

да, спасибо, все получилось, проблемы была не совсем в этом, я 2 раза преобразовывал в base64 )))
Offline Андрей *  
#4 Оставлено : 26 мая 2021 г. 18:00:07(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
Автор: wwq Перейти к цитате
да, спасибо, все получилось, проблемы была не совсем в этом, я 2 раза преобразовывал в base64 )))


а теперь попробовать с ANSIString запустить код...
Техническую поддержку оказываем тут
Наша база знаний
Offline wwq  
#5 Оставлено : 26 мая 2021 г. 18:02:22(UTC)
wwq

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

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

Автор: Андрей * Перейти к цитате
Автор: wwq Перейти к цитате
да, спасибо, все получилось, проблемы была не совсем в этом, я 2 раза преобразовывал в base64 )))


а теперь попробовать с ANSIString запустить код...


уже в работе gateway для честного знака (подписывает/преобразует запросы и т.д.), клиенты на win2k3/winxp/linux сервер на win10
Offline Андрей *  
#6 Оставлено : 26 мая 2021 г. 18:14:34(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
Автор: wwq Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: wwq Перейти к цитате
да, спасибо, все получилось, проблемы была не совсем в этом, я 2 раза преобразовывал в base64 )))


а теперь попробовать с ANSIString запустить код...


уже в работе gateway для честного знака (подписывает/преобразует запросы и т.д.), клиенты на win2k3/winxp/linux сервер на win10


и там указано как есть в коде и ничего больше не менялось?

Т.е. Я зря ставил\собирал и воспроизвёл? Не может быть такого)

Lazarus "из коробки" и код при вызове приведёт к такому:
Snimok ehkrana ot 2021-05-26 19-07-02.png (51kb) загружен 10 раз(а).

обращаем внимание на 65 строку, меняем всё и в функции на правильный тип - WideString и получаем подпись:

Snimok ehkrana ot 2021-05-26 19-13-17.png (37kb) загружен 7 раз(а).

Техническую поддержку оказываем тут
Наша база знаний
Offline tonax  
#7 Оставлено : 20 июля 2021 г. 13:16:38(UTC)
tonax

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Автор: wwq Перейти к цитате
пытаюсь подписать сообщение на lazarus с помощью cades plugin:


function SignData(bl_Detached: boolean; S_in: ANSIString; var S_out: AnsiString; g_Cert:OleVariant; g_Cert_Pass:string) :boolean;
const
CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
CADESCOM_BASE64_TO_BINARY = 1;
var
v_Signer, v_SignedData : Variant;

begin
Result := False;
try
v_Signer := CreateOLEObject('CadesCOM.CPSigner');
v_Signer.Certificate := g_Cert;

if g_Cert_Pass<>'' then
v_Signer.KeyPin := g_Cert_Pass;

v_Signer.Options := 1;// CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN := 1;

V_SignedData := CreateOLEObject('CAdESCOM.CadesSignedData');

v_SignedData.ContentEncoding := CADESCOM_BASE64_TO_BINARY;

s_in := EncodeStringBase64(s_in);
v_SignedData.Content := s_in;
s_out := v_SignedData.SignCades(v_Signer, CADESCOM_CADES_TYPE, bl_Detached,0);

Result := True;
finally
if not VarIsNull(v_Signer) then v_Signer := Unassigned;
if not VarIsNull(v_SignedData) then v_SignedData := Unassigned;
end;
end;


Подскажите, а параметр g_Cert:OleVariant как заполнить? Т.е. как получить сертификат? И g_Cert_Pass:string - это пароль на подпись?
Offline Андрей *  
#8 Оставлено : 20 июля 2021 г. 13:37:07(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
g_Cert - получить перечислением с сверкой нужных атрибутов или через .Find у хранилища сертификатов.
Если не указывать - будет диалог ОС выбора сертификата.

Цитата:

с помощью cades plugin

Это CAdESCOM, плагин это для браузеров...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#9 Оставлено : 20 июля 2021 г. 13:40:05(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
смотрите в документацию, описание интерфейсов, методов\свойств.
В данном случае - GetSignerCertificate в примере: Создание подписанного сообщения

Техническую поддержку оказываем тут
Наша база знаний
Offline tonax  
#10 Оставлено : 22 июля 2021 г. 11:57:38(UTC)
tonax

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
g_Cert - получить перечислением с сверкой нужных атрибутов или через .Find у хранилища сертификатов.
Если не указывать - будет диалог ОС выбора сертификата.

Цитата:

с помощью cades plugin

Это CAdESCOM, плагин это для браузеров...


Пробую без указания сертификата, на выходе вроде красиво, но результат не соответствует ожидаемому и в процессе не запрашивает выбор сертификата :(

Не запрашивает, возможно потому, что он единственный, но почему подпись отличается от подписи ч-з https://www.cryptopro.ru...ge/cades_bes_sample.html непонятно... Подскажете, где искать ошибку? Может надо конвертировать ч-то ещё?

Код:

function SignData(bl_Detached: boolean; S_in: WideString; var S_out: WideString ; g_Cert:OleVariant; g_Cert_Pass:string) :boolean;
const
  CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
  CADESCOM_BASE64_TO_BINARY = 1;
var
  v_Signer, v_SignedData : Variant;

  s, Encoded: string;
  Base64: TBase64Encoding;

begin
  Result := False;
  try
    v_Signer := CreateOLEObject('CadesCOM.CPSigner');
    

    //v_Signer.Certificate := g_Cert; [b]// Сертификат не указан[/b]

    if g_Cert_Pass<>'' then
    v_Signer.KeyPin := g_Cert_Pass;

    v_Signer.Options := 1;// CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN := 1;

    V_SignedData := CreateOLEObject('CAdESCOM.CadesSignedData');

    v_SignedData.ContentEncoding := CADESCOM_BASE64_TO_BINARY;

    Base64 := TBase64Encoding.Create(0);

    s_in := Base64.Encode(s_in);

    v_SignedData.Content := s_in;
    s_out := v_SignedData.SignCades(v_Signer, CADESCOM_CADES_TYPE, bl_Detached,0);

    Result := True;
  finally
    if not VarIsNull(v_Signer) then v_Signer := Unassigned;
    if not VarIsNull(v_SignedData) then v_SignedData := Unassigned;
  end;
end;


так вызываю ф-цию SignData и результат отличается от https://www.cryptopro.ru...e/cades_bes_sample.html#

Код:

procedure TForm1.btn1Click(Sender: TObject);
var
  si,so: WideString;
begin
  si := edtString.Text;
  SignData(True, si, so, null, '');
  mmo1.Text := so;
end;

Offline tonax  
#11 Оставлено : 22 июля 2021 г. 11:58:35(UTC)
tonax

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
смотрите в документацию, описание интерфейсов, методов\свойств.
В данном случае - GetSignerCertificate в примере: Создание подписанного сообщения



Что-то не получается на Delphi перевести
Offline Андрей *  
#12 Оставлено : 22 июля 2021 г. 12:27:41(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
На тестовой странице присоединенная подпись формируется. В чем ещё отличие?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#13 Оставлено : 22 июля 2021 г. 12:35:19(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
смотрите в документацию, описание интерфейсов, методов\свойств.
В данном случае - GetSignerCertificate в примере: Создание подписанного сообщения



Что-то не получается на Delphi перевести


Вот готовый пример
https://www.cryptopro.ru...&m=113010#post113010

Техническую поддержку оказываем тут
Наша база знаний
Offline tonax  
#14 Оставлено : 22 июля 2021 г. 13:04:40(UTC)
tonax

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
смотрите в документацию, описание интерфейсов, методов\свойств.
В данном случае - GetSignerCertificate в примере: Создание подписанного сообщения



Что-то не получается на Delphi перевести


Вот готовый пример
https://www.cryptopro.ru...&m=113010#post113010



По серийный номер не находит, а вот по отпечатку находит :)
Offline tonax  
#15 Оставлено : 22 июля 2021 г. 13:08:18(UTC)
tonax

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
На тестовой странице присоединенная подпись формируется. В чем ещё отличие?


Разные результаты подписания строки, например KZEKPLILATPSQLIFKVVYILQFEPIZAW

Вот первая строка программное полученной подписанной строки:
MIIfHwYJKoZIhvcNAQcCoIIfEDCCHwwCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCC

А вот правильная с https://www.cryptopro.ru.../cades_bes_sample.html#:
MIIfbQYJKoZIhvcNAQcCoIIfXjCCH1oCAQExDjAMBggqhQMHAQECAgUAMC0GCSqGSIb3DQEHAaAg

и так в каждой строчке какие-то отличия
Offline Андрей *  
#16 Оставлено : 22 июля 2021 г. 13:22:54(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
На тестовой странице присоединенная подпись формируется. В чем ещё отличие?


Разные результаты подписания строки, например KZEKPLILATPSQLIFKVVYILQFEPIZAW

Вот первая строка программное полученной подписанной строки:
MIIfHwYJKoZIhvcNAQcCoIIfEDCCHwwCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCC

А вот правильная с https://www.cryptopro.ru.../cades_bes_sample.html#:
MIIfbQYJKoZIhvcNAQcCoIIfXjCCH1oCAQExDjAMBggqhQMHAQECAgUAMC0GCSqGSIb3DQEHAaAg

и так в каждой строчке какие-то отличия



Разные типы CMS, разный размер структур => разный base64
+ в конце всегда будет разное значение ЭП.



Техническую поддержку оказываем тут
Наша база знаний
Offline tonax  
#17 Оставлено : 22 июля 2021 г. 13:44:36(UTC)
tonax

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
На тестовой странице присоединенная подпись формируется. В чем ещё отличие?


Разные результаты подписания строки, например KZEKPLILATPSQLIFKVVYILQFEPIZAW

Вот первая строка программное полученной подписанной строки:
MIIfHwYJKoZIhvcNAQcCoIIfEDCCHwwCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCC

А вот правильная с https://www.cryptopro.ru.../cades_bes_sample.html#:
MIIfbQYJKoZIhvcNAQcCoIIfXjCCH1oCAQExDjAMBggqhQMHAQECAgUAMC0GCSqGSIb3DQEHAaAg

и так в каждой строчке какие-то отличия



Разные типы CMS, разный размер структур => разный base64
+ в конце всегда будет разное значение ЭП.



Дело в том, что честный знак не принимают программную подпись, а с https://www.cryptopro.ru...ge/cades_bes_sample.html прекрасно принимает... Видимо что-то все-таки неправильно формируется ч-з function SignData(), только не могу понять что. Base64 верная, проверял в https://helpers.work/ru/encription/base64
Offline Андрей *  
#18 Оставлено : 22 июля 2021 г. 13:51:27(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
На тестовой странице присоединенная подпись формируется. В чем ещё отличие?


Разные результаты подписания строки, например KZEKPLILATPSQLIFKVVYILQFEPIZAW

Вот первая строка программное полученной подписанной строки:
MIIfHwYJKoZIhvcNAQcCoIIfEDCCHwwCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCC

А вот правильная с https://www.cryptopro.ru.../cades_bes_sample.html#:
MIIfbQYJKoZIhvcNAQcCoIIfXjCCH1oCAQExDjAMBggqhQMHAQECAgUAMC0GCSqGSIb3DQEHAaAg

и так в каждой строчке какие-то отличия



Разные типы CMS, разный размер структур => разный base64
+ в конце всегда будет разное значение ЭП.



Дело в том, что честный знак не принимают программную подпись, а с https://www.cryptopro.ru...ge/cades_bes_sample.html прекрасно принимает... Видимо что-то все-таки неправильно формируется ч-з function SignData(), только не могу понять что. Base64 верная, проверял в https://helpers.work/ru/encription/base64




Еще раз.
Ответ выше был дан.
На тестовой странице - присоединенная подпись.

В коде на Delphi\Lazarus:

SignData(True, si, so, null, ''); - что делает этот вызов?


Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
tonax оставлено 22.07.2021(UTC)
Offline Андрей *  
#19 Оставлено : 22 июля 2021 г. 13:53:00(UTC)
Андрей *

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

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

Сказал «Спасибо»: 388 раз
Поблагодарили: 1587 раз в 1221 постах
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
смотрите в документацию, описание интерфейсов, методов\свойств.
В данном случае - GetSignerCertificate в примере: Создание подписанного сообщения



Что-то не получается на Delphi перевести


Вот готовый пример
https://www.cryptopro.ru...&m=113010#post113010



По серийный номер не находит, а вот по отпечатку находит :)


Предполагаю, что ошибка в 17 строке, на вашей стороне.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
tonax оставлено 22.07.2021(UTC)
Offline tonax  
#20 Оставлено : 22 июля 2021 г. 14:14:49(UTC)
tonax

Статус: Участник

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

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: tonax Перейти к цитате
Автор: Андрей * Перейти к цитате
На тестовой странице присоединенная подпись формируется. В чем ещё отличие?


Разные результаты подписания строки, например KZEKPLILATPSQLIFKVVYILQFEPIZAW

Вот первая строка программное полученной подписанной строки:
MIIfHwYJKoZIhvcNAQcCoIIfEDCCHwwCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCC

А вот правильная с https://www.cryptopro.ru.../cades_bes_sample.html#:
MIIfbQYJKoZIhvcNAQcCoIIfXjCCH1oCAQExDjAMBggqhQMHAQECAgUAMC0GCSqGSIb3DQEHAaAg

и так в каждой строчке какие-то отличия



Разные типы CMS, разный размер структур => разный base64
+ в конце всегда будет разное значение ЭП.



Дело в том, что честный знак не принимают программную подпись, а с https://www.cryptopro.ru...ge/cades_bes_sample.html прекрасно принимает... Видимо что-то все-таки неправильно формируется ч-з function SignData(), только не могу понять что. Base64 верная, проверял в https://helpers.work/ru/encription/base64




Еще раз.
Ответ выше был дан.
На тестовой странице - присоединенная подпись.

В коде на Delphi\Lazarus:

SignData(True, si, so, null, ''); - что делает этот вызов?



Не могу понять ход мысли :) На тестовой странице https://www.cryptopro.ru...ge/cades_bes_sample.html мы используем подпись и результат получается верный.

Если мы пытаемся выполнить подпись аналогичной строки, той же самой подписью, что и используется для проверки подписи на тестовой странице, но из программы Delphi, то получаем другой (неверный) результат

SignData(True, si, so, null, ''); как раз выполняет вызов функции подписи строки si и возвращает результат в so. null указывали, до того, как смогли получить сертификат.

Сейчас весь год выглядит так:

Код:


//Поиск сертификата по отпечатку
function GetCertificateOfStamp(thumbprint: string; var oCertificate: olevariant; var onErr: string): boolean;
const
  CAPICOM_MY_STORE = 'MY';
  CAPICOM_CERTIFICATE_FIND_SHA1_HASH = $00000000;
  CAPICOM_CURRENT_USER_STORE = 2;
  CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
var
  oStore, oCertificates: olevariant;
  x: integer;
begin
  onErr := '';
  result := false;
  try
    oStore := CreateOleObject('CAdESCOM.Store');
    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

    oCertificates := oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, widestring(thumbprint));

    x := oCertificates.Count;
    if x = 0 then
    begin
      onErr := 'Не найден сертификат с отпечатком: [' + thumbprint + ']';
      exit;
    end;
    oCertificate := oCertificates.Item[1]; // oCertificates.Item(1);
    result := true;
  except
    on e: exception do
    begin
      onErr := 'Не удалось получить доступ к сертификату с отпечатком: [' + thumbprint + '] ' + e.Message;
    end;
  end;
end;


Поиск проходит успешно, т.к. по отпечатку после поиска получаем верный серийный номер

Ниже идет основная функция подписания, в параметры которой передаются True(bl_Detached), строка для подписания, ссылка на переменную для подписанной строки, Сертификат и его пароль. А на что влияет первый параметр bl_Detached ?

Код:


//Функция подписания строки
function SignData(bl_Detached: boolean; S_in: WideString; var S_out: WideString ; g_Cert:OleVariant; g_Cert_Pass:string) :boolean;
const
  CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
  CADESCOM_BASE64_TO_BINARY = 1;
var
  v_Signer, v_SignedData : Variant;

  s, Encoded: string;
  Base64: TBase64Encoding;

begin
  Result := False;
  try
    v_Signer := CreateOLEObject('CadesCOM.CPSigner');
    v_Signer.Certificate := g_Cert;

    //v_Signer.Certificate := GetSignerCertificate('0171ed4800daab20a54de41e513396cbae');

    if g_Cert_Pass<>'' then
    v_Signer.KeyPin := g_Cert_Pass;

    v_Signer.Options := 1;// CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN := 1;

    V_SignedData := CreateOLEObject('CAdESCOM.CadesSignedData');

    v_SignedData.ContentEncoding := CADESCOM_BASE64_TO_BINARY;

    Base64 := TBase64Encoding.Create(0);

  //s := 'Some larger text that needs to be encoded in Base64 encoding';
  //Base64 := TBase64Encoding.Create(10, '');

    s_in := Base64.Encode(s_in);

    //s_in := EncodeStringBase64(s_in);
    v_SignedData.Content := s_in;
    s_out := v_SignedData.SignCades(v_Signer, CADESCOM_CADES_TYPE, bl_Detached, 0);

    Result := True;
  finally
    if not VarIsNull(v_Signer) then v_Signer := Unassigned;
    if not VarIsNull(v_SignedData) then v_SignedData := Unassigned;
  end;
end;



Затем вызов: Сначала ищем сертификат по отпечатку, после чего выполняем подписание строки

Код:


procedure TForm1.btn1Click(Sender: TObject);
const
  certStamp = 'тут указываем отпечаток сертификата';
var
  si,so: WideString;
  Cert: OleVariant;
  errStr: string;
  crtRes: boolean;
begin
  si := edtString.Text; //Строка для подписания

  crtRes := GetCertificateOfStamp(certStamp, Cert, errStr); //поиск по сертификату

  if not crtRes then //Если сертификат не найден
    begin
      ShowMessage(errStr);
      exit;
    end;

  ShowMessage('Серийный номер: ' + Cert.SerialNumber); //Печатаем серийный номер найденного по отпечатку сертификата

  SignData(True, si, so, Cert, ''); //Подписываем строку si сертификатом Cert, пароль не указываем, т.к. его нет

  mmo1.Text := so; //Результат подписания выводим по поле формы
end;



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