Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подпись xml и прикрепление сертификата. / 5 сообщений из 5, страница 1 из 1
21.05.2018, 18:52
    #39647721
Hommer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпись xml и прикрепление сертификата.
Разбираюсь с гостом и Crypto API.
С подписью вроде проблем нет. Есть проблема правильно заполнить тег <X509Certificate>.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
var
  Prov: HCRYPTPROV;
  hKey: HCRYPTKEY;
  UserCert: AnsiString;
  UserCertLength: DWORD;
  UserCertBase64: AnsiString;
begin
  if not CryptAcquireContext(Prov, PAnsiChar(ContainerName), PAnsiChar(CP_GR3410_2001_PROV_A), PROV_GOST_2001_DH, 0) then
    CryptoError('CryptAcquireContext');
  try
    if not CryptGetUserKey(Prov, AT_KEYEXCHANGE, hKey) then
      CryptoError('CryptGetUserKey');

    if not CryptGetKeyParam(hKey, KP_CERTIFICATE, nil, UserCertLength, 0) then
      CryptoError('CryptGetKeyParam(KP_CERTIFICATE length)');

    if UserCertLength = 0 then
      Assert(False);
    SetLength(UserCert, UserCertLength);

    if not CryptGetKeyParam(hKey, KP_CERTIFICATE, PByte(UserCert), UserCertLength, 0) then
      CryptoError('CryptGetKeyParam(KP_CERTIFICATE data)');

    UserCertBase64 := Base64EncodeStr(UserCert);
  finally
    CryptReleaseContext(Prov, 0);
  end;


В UserCertBase64 получается сертификат с PrivateKey. Это явно не то что должно быть в поле <X509Certificate>.
Что прописать в <X509Certificate>? Кто-нибудь поможет кодом? Правильно ли я понимаю, что там должен лежать тот же сертификат, но без PrivateKey?
...
Рейтинг: 0 / 0
22.05.2018, 00:55
    #39647809
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпись xml и прикрепление сертификата.
HommerВ UserCertBase64 получается сертификат с PrivateKeyКто сказал?

HommerCryptGetKeyParam(hKey, KP_CERTIFICATE..Копипаст без понимания, что делает функция?
...
Рейтинг: 0 / 0
22.05.2018, 00:57
    #39647811
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпись xml и прикрепление сертификата.
HommerPAnsiChar(CP_GR3410_2001_PROV_A), PROV_GOST_2001_DHВыноси это в настройки или перекомпилировать будешь под 2012.

А еще лучше - определять по контексту сертификата.

HommerAT_KEYEXCHANGEА у меня нет ключа обмена, только ключ подписи - нельзя мне подписывать, да?


HommerCryptGetKeyParam(hKey, KP_CERTIFICATEТребовать хранение сертификата в контейнере - норма?
...
Рейтинг: 0 / 0
22.05.2018, 01:02
    #39647813
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпись xml и прикрепление сертификата.
Hommer,

Итого:
лезем в ContainerName с надеждой встретить ключ обмена и сертификат.

Чтобы получить в UserCertBase64 закодированный в base64 сертификат.

Еще варианты:
а) вызвать диалог выбора сертификата
б) показать свой диалог - перечислить список сертификатов (попутно проверяя срок действия\наличие ссылки на закрытый ключ\алгоритм)
в) аналогично б) - только прочитать из настроек (после выбора пользователем) и загрузить необходимый сертификат и ссылку на контейнер.
...
Рейтинг: 0 / 0
22.05.2018, 01:06
    #39647815
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпись xml и прикрепление сертификата.
CryptUIDlgSelectCertificateFromStore - поиск в ветке Delphi
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подпись xml и прикрепление сертификата. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]