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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей Писарев  
#11 Оставлено : 8 августа 2014 г. 16:37:39(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
заменить szOID_RSA_MD5 на то, что ты изначально указывал,
My := CertOpenSystemStore(0,'MY')
и хотя бы так:
CryptUIDlgSelectCertificateFromStore(My, 0, '', '', 0, 0, nil);

и все заработает (поверь мне)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Stalp оставлено 08.08.2014(UTC)
Offline Stalp  
#12 Оставлено : 8 августа 2014 г. 17:05:44(UTC)
Stalp

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

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

Сказал(а) «Спасибо»: 5 раз
Спасибо, обязательно попробую.
Offline Stalp  
#13 Оставлено : 10 августа 2014 г. 14:02:11(UTC)
Stalp

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

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

Сказал(а) «Спасибо»: 5 раз
Андрей *, а j2me - это тоже вы?
szOID_RSA_MD5 пока не менял, т.к. нет под рукой внешнего ключа, экспериментирую на другом сертификате.
Вот что получилось:
Код:
function CryptSignMessage(pSignPara: PCRYPT_SIGN_MESSAGE_PARA;
  fDetachedSignature: BOOL; cToBeSigned: DWORD; rgpbToBeSigned: PByte;
  rgcbToBeSigned: Pointer; pbSignedBlob: PByte; var pcbSignedBlob: DWORD): BOOL;
  stdcall; external 'Crypt32.dll';

procedure SignStream(SignerCert: PCCERT_CONTEXT; ASourceStream: TStream;
  ADestStream: TStream; DetachedSignature: Boolean);
var
  SignPara: CRYPT_SIGN_MESSAGE_PARA;
  bToBeSigned: array of PByte;
  cToBeSigned: array of DWORD;
  pMsgCrl: array of PCCERT_CONTEXT;
  pbSignedBlob: PByte;
  cbSignedBlob: DWORD;
begin
  SetLength(bToBeSigned, 1);
  SetLength(cToBeSigned, 1);
  SetLength(pMsgCrl, 1);
  bToBeSigned[0] := GetMemory(ASourceStream.Size);
  cToBeSigned[0] := ASourceStream.Size;
  pMsgCrl[0] := SignerCert;
  cbSignedBlob := 0;
  try
    ASourceStream.Read(bToBeSigned[0]^, ASourceStream.Size);
    ZeroMemory(@SignPara, SizeOf(CRYPT_SIGN_MESSAGE_PARA));
    SignPara.cbSize := SizeOf(CRYPT_SIGN_MESSAGE_PARA);
    SignPara.dwMsgEncodingType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
    SignPara.pSigningCert := SignerCert;
    SignPara.HashAlgorithm.pszObjId := szOID_RSA_MD5;
    SignPara.HashAlgorithm.Parameters.cbData := 0;
    SignPara.HashAlgorithm.Parameters.pbData := nil;
    SignPara.cMsgCert := 1;
    SignPara.rgpMsgCert := Pointer(pMsgCrl);
    if not(CryptSignMessage(@SignPara, DetachedSignature, 1,
      Pointer(bToBeSigned), Pointer(cToBeSigned), nil, cbSignedBlob)) then
      RaiseLastOSError;
    pbSignedBlob := GetMemory(cbSignedBlob);
    try
      if not CryptSignMessage(@SignPara, DetachedSignature, 1,
        Pointer(bToBeSigned), Pointer(cToBeSigned), pbSignedBlob,
        cbSignedBlob) then
        RaiseLastOSError;
      ADestStream.Write(pbSignedBlob^, cbSignedBlob);
    finally
      FreeMemory(pbSignedBlob);
    end;
  finally
    FreeMemory(bToBeSigned[0]);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  cert: PCCERT_CONTEXT;
  pStreamIn, pStreamOut: TMemoryStream;
  afile: string;
  my: hcertstore;
begin
  my := CertOpenSystemStore(0, 'MY');
  cert := CryptUIDlgSelectCertificateFromStore(my, 0, '', '', 0, 0, nil);
  afile := 'D:\ttt\request.xml';
  pStreamIn := TMemoryStream.Create;
  pStreamOut := TMemoryStream.Create;
  pStreamIn.LoadFromFile(afile);
  SignStream(cert, pStreamIn, pStreamOut, true);
  pStreamOut.SaveToFile(afile + '.sig');
  FreeAndNil(pStreamOut);
  FreeAndNil(pStreamIn);
end;

Файл подписывается без ошибок. Но непонятно еще пару вещей.
1) Как сделать подпись в Base64-кодировке?
2) При вызове CryptUIDlgSelectCertificateFromStore открывается окно с выбором сертификата. Как выбрать сертификат по умолчанию, чтобы это окно не отображалось?
Offline Андрей Писарев  
#14 Оставлено : 10 августа 2014 г. 14:36:01(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
Нет, у меня логин там sql2012.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#15 Оставлено : 10 августа 2014 г. 14:49:33(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах
Цитата:
1) Как сделать подпись в Base64-кодировке?

А точно нужно(зачем) дополнительно кодировать?

Base64 - pStreamOut закодировать в base64, "встроенными" или внешними функциями... поиск?

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#16 Оставлено : 10 августа 2014 г. 14:52:46(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2046 раз в 1586 постах

Цитата:

2) При вызове CryptUIDlgSelectCertificateFromStore открывается окно с выбором сертификата. Как выбрать сертификат по умолчанию, чтобы это окно не отображалось?


открыть личное хранилище сертификатов,
перечислить сертификаты CertEnumCertificatesInStore или воспользоваться CertFindCertificateInStore,
вывести свойства сертификатов или определив нужный - получить контекст...

Далее можно запомнить выбранный сертификат (информацию о свойствах)
(рекомендую - отпечаток (thumbprint) использовать в качестве уникальности)

Примеры есть в SDK\ на этом форуме (поиск по названиям функций)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Stalp оставлено 10.08.2014(UTC)
Offline Stalp  
#17 Оставлено : 10 августа 2014 г. 15:04:38(UTC)
Stalp

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

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

Сказал(а) «Спасибо»: 5 раз
Автор: Андрей * Перейти к цитате
Цитата:
1) Как сделать подпись в Base64-кодировке?

А точно нужно(зачем) дополнительно кодировать?

Base64 - pStreamOut закодировать в base64, "встроенными" или внешними функциями... поиск?


Точно, по крайней мере в памятке к vigruzki.rkn.gov.ru описан метод запроса на получение выгрузки "sendRequest", и во входных параметрах указано "Электронная подпись файла запроса - base64Binary". Просто думал, что можно в процессе подписи перекодировать в Base64, как в КриптоАРМ или csptest. Но если нельзя, то буду через EncodeString, я так подписываемый файл как раз кодировал (тоже требуют зачем-то в base64).
Offline Stalp  
#18 Оставлено : 10 августа 2014 г. 16:14:12(UTC)
Stalp

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

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

Сказал(а) «Спасибо»: 5 раз
Автор: Андрей * Перейти к цитате

Цитата:

2) При вызове CryptUIDlgSelectCertificateFromStore открывается окно с выбором сертификата. Как выбрать сертификат по умолчанию, чтобы это окно не отображалось?


открыть личное хранилище сертификатов,
перечислить сертификаты CertEnumCertificatesInStore или воспользоваться CertFindCertificateInStore,
вывести свойства сертификатов или определив нужный - получить контекст...

Далее можно запомнить выбранный сертификат (информацию о свойствах)
(рекомендую - отпечаток (thumbprint) использовать в качестве уникальности)

Примеры есть в SDK\ на этом форуме (поиск по названиям функций)


Сделал так:
my := CertOpenSystemStore(0, 'MY');
cert:=CertFindCertificateInStore(my, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, PChar('CN из сертификата'), nil);
Offline SeregaZ  
#19 Оставлено : 27 марта 2015 г. 20:20:11(UTC)
SeregaZ

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

Группы: Участники
Зарегистрирован: 23.06.2012(UTC)
Сообщений: 65
Откуда: Almaty, KZ

можно как-то браузеру объяснить какой сертификат выбран без этого окошка выбора сертификатов? типа как на почту можно было зайти вбив строчку что-то типа: mail.ru/index.php?login=вася&password=крут то и на тот сайт с сертификатом войти вбив в ссылку браузера что-то типа: site.com/index.php?cert=WERERYRUIUOIOPIOPREERT серийный номер или какой там параметр отвечает за вход?
Offline Максим Коллегин  
#20 Оставлено : 27 марта 2015 г. 20:53:36(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Для ssl можно - сертификат сервера настраивается в диалоге учетных записей.
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.