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

Уведомление

Icon
Error

7 Страницы«<34567>
Опции
К последнему сообщению К первому непрочитанному
Offline city-med.info  
#41 Оставлено : 1 декабря 2021 г. 2:48:53(UTC)
city-med.info

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
Автор: Shuraken Перейти к цитате
Благодарю, разобрался. Необходимо выгрузить PCCERT_CONTEXT.pbCertEncoded.


ну вот же, я делаю так:
Result:=ByteArrayToStr(Cert.pbCertEncoded, Cert.cbCertEncoded);

и чет не взлетает.
ты можешь готовую функцию выложить? готов обсудить условия, если в публичный доступ не желаешь делиться
Online Андрей *  
#42 Оставлено : 1 декабря 2021 г. 9:48:08(UTC)
Андрей *

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

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

Сказал «Спасибо»: 493 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: city-med.info Перейти к цитате
Автор: Shuraken Перейти к цитате
Благодарю, разобрался. Необходимо выгрузить PCCERT_CONTEXT.pbCertEncoded.


ну вот же, я делаю так:
Result:=ByteArrayToStr(Cert.pbCertEncoded, Cert.cbCertEncoded);

и чет не взлетает.
ты можешь готовую функцию выложить? готов обсудить условия, если в публичный доступ не желаешь делиться


Кто, что делает?
А что делает ByteArrayToStr, кто-то смотрел?

Ещё раз: что требуется, что на выходе и почему ошибка?
Есть время вчитаться в детали?

Или взять сертификат, открыть в hex редакторе и сравнить, с тем, что на руках от функции?

p.s. а пробелы никак не влияют же?
Техническую поддержку оказываем тут
Наша база знаний
Online Андрей *  
#43 Оставлено : 1 декабря 2021 г. 10:30:36(UTC)
Андрей *

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

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

Сказал «Спасибо»: 493 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: city-med.info Перейти к цитате
ответа нет, придется заново путь проходить
очень жаль что в документации нет примеров на delphi

на данный момент непонятно как получить "Массив байт сертификата, используемого для создания ЭП, в виде строки шестнадцатеричных цифр."
это параметр certificateHEX

использовал два варианта, через CADESCOM.Export и через функции WCrypt2, и не один не сработал. Что сделал не так?

Код:
function StrToHex(source: String): String;
var i:integer;
    c:Char;
    s:String;
begin
    s := '';
    for i:=1 to Length(source) do
    begin
      c := source[i];
      s := s +  IntToHex(Integer(c),2)+' ';
    end;
    result := s;
end;

function ByteArrayToStr(pbData: PByte; cbData: DWORD): String;
var I, J: Integer;
    S: String;
begin
  Result := '';
  if not Assigned(pbData) or (cbData <= 0) then Exit;
  for I := 0 to cbData - 1 do begin
    J := PByteArray(pbData)^[i];
    S := IntToHex(J, 2);
    if (I > 0) and (I and 1 = 0) then
    S := S + ' ';
    Result := S + Result;
  end;
end;

function TForm1.GetCertificateHEX(Thumbprint: String; var Cert: PCCERT_CONTEXT): string;
var
 buf         :   array of byte;
 buflen      :   DWORD;
 hStore      :   HCERTSTORE;
 certHash    :   CRYPT_HASH_BLOB;
 thumb       :   string;
 certValue: string;
begin
 Result      :=  '';
 if Assigned(Cert) then CertFreeCertificateContext(Cert);
 thumb       :=  trim(Thumbprint);
 if length(thumb)=0 then Exit;
 buflen      :=  length(thumb) div 2;
 SetLength(buf,buflen);
 HexToBin(PChar(thumb),PChar(buf),buflen);

 certHash.cbData:= buflen;
 certHash.pbData:= PByte(buf);

 //ищем сертификат в CURRENT_USER\MY\
 hStore  :=  CertOpenSystemStore(0,'MY');
 Cert    :=  CertFindCertificateInStore(hStore,
                                        PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                                        0,
                                        CERT_FIND_SHA1_HASH,
                                        @certHash,
                                        nil);
 //Освобождаем ресурсы хранилища
 CertCloseStore(hStore, CERT_CLOSE_STORE_CHECK_FLAG);

 If not Assigned(Cert) then Exit;
 SetLength(certValue, Cert.pCertInfo.SubjectPublicKeyInfo.PublicKey.cbData);
 Result:=ByteArrayToStr(Cert.pbCertEncoded, Cert.cbCertEncoded);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MyStore,MyCertificates,MyCert:variant;
  Cert: PCCERT_CONTEXT;
  i, cnt: integer;
begin
   MyStore := CreateOLEObject('CADESCOM.Store');
   MyStore.Open(2, 'My', 0);//(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
   MyCertificates := MyStore.Certificates;//.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
   cnt:=MyCertificates.Count;
   if (cnt = 0) then begin application.messagebox('в личном хранилище ключей не найдено',''); exit; end;

   for i:=1 to cnt do begin
     MyCert := MyCertificates.Item[i];
     Memo1.Lines.Add('');
     Memo1.Lines.Add(MyCert.PrivateKey);
     Memo1.Lines.Add(MyCert.serialnumber);      //добавляем в мемо серийный номер сертификата
     Memo1.Lines.Add(MyCert.SubjectName);
     Memo1.Lines.Add('');
     Memo1.Lines.Add(MyCert.Thumbprint);
     Memo1.Lines.Add('');
     Memo1.Lines.Add(StrToHex(MyCert.[h]Export[/h]));   
     Memo1.Lines.Add('');
     Memo1.Lines.Add([h]GetCertificateHEX[/h](MyCert.Thumbprint, Cert));
   end;
end;



Memo1.Lines.Add(StrToHex(MyCert.Export));

А если проверить, что выдаёт Export?
Задача - перевести байты (сертификата) в hex-строку,
а не отформатированную строку base64 в hex-строку.

Про GetCertificateHEX - почему там пробелы выдаются?

Техническую поддержку оказываем тут
Наша база знаний
Offline city-med.info  
#44 Оставлено : 3 декабря 2021 г. 2:55:01(UTC)
city-med.info

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
Автор: Андрей * Перейти к цитате
Задача - перевести байты (сертификата) в hex-строку,
а не отформатированную строку base64 в hex-строку.



с помощью Александра разобрался с hex-сертификатом, ниже рабочий код функции, поиск сертификата в хранилище происходит по отпечатку:



сейчас вопрос про оформление.
можно ли в принципе передать объект в виде строки? типа такого:

Код:
    jso.CPSign(GetCertificateHEX(MyCert.Thumbprint, Cert),      // certificateHEX
               '',                                              // pin
               1,                                               // pdfLockMode
               'Причина: тест',                                 // signReason
               'Местоположение: тестовое',                      // signLocation
               'контакт',                                       // signContactInfo
               'http://qs.cryptopro.ru/tsp/tsp.srf',            // timeStamp
               false,                                           // bShowCertificatesDialog
               false,                                           // bShowSignDialogs
               '{pageNumber: 0, coords: [122, 539, 422, 439], customAppearance: '
               +'{font: "Calibri", borderStyle: border.s, borderColor: color.black, '
               +' borderWidth: 1, textFields: [ {text: " ДОКУМЕНТ ПОДПИСАН \nЭЛЕКТРОННОЙ ПОДПИСЬЮ", '
               +' coords: [50, 100, 250, 60]}, {type: "CN", coords: [10, 60, 300, 40], fontSize: 11}, '
               +'{type: "SerialNumber", coords: [10, 40, 300, 20], fontSize: 11 }, '
               +'{ text: "Компания: ООО \"КРИПТО-ПРО\"", coords: [10, 20, 300, 0], fontSize: 11}]}}'));


или обязательно надо создавать объект
и еще: очень хотелось бы обойтись без правки файлов акробата, как это сделал Александр
Offline city-med.info  
#45 Оставлено : 6 декабря 2021 г. 2:02:40(UTC)
city-med.info

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
Автор: city-med.info Перейти к цитате
или обязательно надо создавать объект


похоже что так, ибо все игры со строкой приводят к ответу: Неправильно задан параметр отбражения подписи.

прошу привести рабочий пример создания объекта customAppearance

Offline Shuraken  
#46 Оставлено : 6 декабря 2021 г. 2:20:30(UTC)
Shuraken

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

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

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 2 раз в 2 постах
Автор: city-med.info Перейти к цитате
Автор: city-med.info Перейти к цитате
или обязательно надо создавать объект


похоже что так, ибо все игры со строкой приводят к ответу: Неправильно задан параметр отбражения подписи.

прошу привести рабочий пример создания объекта customAppearance



Посмотрите начальные посты темы. Там указано, что и как менять в js-файле подписи.
Offline city-med.info  
#47 Оставлено : 6 декабря 2021 г. 2:31:43(UTC)
city-med.info

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
Автор: Shuraken Перейти к цитате
Посмотрите начальные посты темы. Там указано, что и как менять в js-файле подписи.


мне это понятно, и такое решение заработает
но хотелось бы обойтись без костылей в виде правки файлов криптоПро
это прям костыль костыльный. Плюс придется делать правленные версии скрипта при выходе каждой новой версии КриптоПро ПДФ.
Очень неудобно будет внедрять решение.
Offline city-med.info  
#48 Оставлено : 6 декабря 2021 г. 13:44:52(UTC)
city-med.info

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
ларчик просто открывался, оказывается все-таки можно строку передавать
только я забыл что названия параметра тоже нужно в кавычки брать

Код:
    jso.CPSign(GetCertificateHEX(MyCert.Thumbprint, Cert),      // certificateHEX
               '',                                              // pin
               1,                                               // pdfLockMode
               'Причина: тест',                                 // signReason
               'Местоположение: тестовое',                      // signLocation
               'контакт',                                       // signContactInfo
               'http://qs.cryptopro.ru/tsp/tsp.srf',            // timeStamp
               false,                                           // bShowCertificatesDialog
               false,                                           // bShowSignDialogs
               '{"pageNumber": 0, "coords": [10, 12, 422, 239], "appearanceFilter": "Fancy"}'));


в таком виде подписывает, и создается видимая подпись по шаблону Fancy
thanks 1 пользователь поблагодарил city-med.info за этот пост.
Shuraken оставлено 06.12.2021(UTC)
Offline city-med.info  
#49 Оставлено : 7 декабря 2021 г. 6:07:07(UTC)
city-med.info

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
еще одна проблема. Хочу использовать свой стиль оформления, беру пример из документации

Код:
    jso.CPSign(GetCertificateHEX(MyCert.Thumbprint, Cert),      // certificateHEX
               '',                                              // pin
               1,                                               // pdfLockMode
               'Причина: тест',                                 // signReason
               'Местоположение: тестовое',                      // signLocation
               'контакт',                                       // signContactInfo
               'http://qs.cryptopro.ru/tsp/tsp.srf',            // timeStamp
               false,                                           // bShowCertificatesDialog
               false,                                           // bShowSignDialogs
               '{"pageNumber": 0, '
              +' "coords": [400, 110, 600, 10], '     // лев верх прав низ
              +' "customAppearance": '
                    +'{"font": "Arial", '
                    +' "borderStyle": border.b, '
                    +' "borderColor": color.black, '
                    +' "borderWidth": 2, '
                    +' "textFields": [{"text": "ДОКУМЕНТ ПОДПИСАН", "coords": [10, 100, 100, 10]}'
                           +']}}');


и в таком виде не принимает, говорит "Неправильно задан параметр отбражения подписи."
именно "отбражения" )))

что я пропустил, по-вашему? отчего скрипт не принимает такой json-объект?
Offline city-med.info  
#50 Оставлено : 7 декабря 2021 г. 6:29:02(UTC)
city-med.info

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
понял что не нравятся ему параметры "borderStyle": border.b и "borderColor": color.black

"borderColor": color.black заменил на описанный в документации вариант "borderColor": ["RGB", 0, 0, 255]
а вот что делать с "borderStyle": border.b непонятно. Если значение взять в кавычки, то вылазит ошибка
InvalidSetError: установка невозможна недопустима или неизвестна
а если без кавычек, то такое отказывается парситься что в дельфях, что скриптом, ну и скрипт соответственно отвечает
"Неправильно задан параметр отбражения подписи."

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