FPC и работа с КриптоПРО
Модератор: Модераторы
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
FPC и работа с КриптоПРО
У кого есть опыт по взаимодействию?
Надо подписывать УКЭП сообщения.
Кто посоветует - может у кого есть готовые решения?
Надо подписывать УКЭП сообщения.
Кто посоветует - может у кого есть готовые решения?
У КриптоПРО есть консольные утилиты, можно их использовать. Отсоединенную подпись для файлов так делал, давно.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Судя по всему - КриптоПро сделало ставку только на интеграцию в броузер
Консольные сейчас не поддерживают весь функционал, который нужен.
По ходу надо разбираться с их SDK и пытаться работать на низком уровне с DLL/SO
Консольные сейчас не поддерживают весь функционал, который нужен.
По ходу надо разбираться с их SDK и пытаться работать на низком уровне с DLL/SO
Я юзал криптопро только под шарп/винду по маркировки лек.препаратов.
сама крипторо предоставляет защищенные контенеры(сертификаты, реестр, ключи) + доп шифрование интегрированную в винду.
так что можно использовать стандартные виндовые вызовы crypto указывае какими GOSTами хочешь поработать.
Добавлено спустя 13 минут 27 секунд:
под линухом не в курсе
Добавлено спустя 2 минуты 24 секунды:
чтобы подписать TBytes нужно около 10 строк кода.
Добавлено спустя 3 минуты 52 секунды:
если надо завтра дам код под шарп, fpc должен быть такимже..
сама крипторо предоставляет защищенные контенеры(сертификаты, реестр, ключи) + доп шифрование интегрированную в винду.
так что можно использовать стандартные виндовые вызовы crypto указывае какими GOSTами хочешь поработать.
Добавлено спустя 13 минут 27 секунд:
под линухом не в курсе
Добавлено спустя 2 минуты 24 секунды:
чтобы подписать TBytes нужно около 10 строк кода.
Добавлено спустя 3 минуты 52 секунды:
если надо завтра дам код под шарп, fpc должен быть такимже..
olegy123 писал(а):под линухом не в курсе
Точно такие же вызовы
Код: Выделить всё
if not CryptAcquireCertificatePrivateKey(Cert, 0, nil, hProvider, @dwKeyType, @bReleaseContext) then
raise Exception.Create('CryptAcquireCertificatePrivateKey');
if Password <> NullString then
begin
sPasswd := (Password)+#0;
Passwd := AllocMem(Length(sPasswd));
Move(sPasswd[1], Passwd^, Length(sPasswd));
if not CryptSetProvParam(hProvider, PP_KEYEXCHANGE_PIN, Passwd, 0) then
raise Exception.Create('CryptSetProvParam');
Freemem(Passwd);
Passwd:=nil;
end;
end;
FillChar(SignParam, SizeOf(CRYPT_SIGN_MESSAGE_PARA), 0);
SignParam.cbSize:= SizeOf(CRYPT_SIGN_MESSAGE_PARA);
SignParam.dwMsgEncodingType:=MY_ENCODING;
SignParam.pSigningCert:=Cert;
SignParam.HashAlgorithm.pszObjId:= CertAlgIdToOID(CertOidToAlgId(cert^.CertInfo^.SignatureAlgorithm.pszObjId));
//SignParam.HashAlgorithm.pszObjId:= szOID_CP_GOST_R3411;
SignParam.cMsgCert:= 1;
SignParam.rgpMsgCert:=@Cert;
{$ifdef unix}
SignParam.dwFlags:=CRYPT_MESSAGE_SILENT_KEYSET_FLAG;
{$endif}
pbMessage:=AInBuf;
cbMessage:=AInBufSize;
try
MessageArray[0] := pbMessage;
MessageSize[0] := cbMessage;
cbSignMessage:= 0;
if not CryptSignMessage(@SignParam, True, 1, @MessageArray, @MessageSize, nil, cbSignMessage) then
raise Exception.Create('CryptSignMessage (size)');
pbSignMessage:= AllocMem(cbSignMessage);
if not CryptSignMessage(@SignParam, True, 1, @MessageArray, @MessageSize, pbSignMessage, cbSignMessage) then
raise Exception.Create('CryptSignMessage (sign)');
AOutBuf:= pbSignMessage;
AOutBufSize:= cbSignMessage;
Result := True;
finally
if bReleaseContext and (hProvider > 0) then
CryptReleaseContext(hProvider, 0);
end;
открыть хранилище и найти сертификат по отпечатку
Код: Выделить всё
StoreName := PAnsiChar('MY');
FEngine := CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, StoreName);;
if Engine = nil then
raise Exception.Create('store not opened');
if FThumbprint <> '' then
Hash := StrToHashBlob(FThumbprint)
else
Hash := StrToHashBlob(LowerCase(FCertInfo.Thumbprint));
FCert := CertFindCertificateInStore(Engine, MY_ENCODING, 0, CERT_FIND_SHA1_HASH, @Hash, nil);
Freemem(Hash.pbData, Hash.cbData);
if FCert = nil then
raise Exception.Create('certificate not found');
Последний раз редактировалось alps 07.02.2020 11:03:58, всего редактировалось 1 раз.
Извеняюсь, что долго.
Добавлено спустя 12 минут 26 секунд:
в самом сертификате указано какими инструментами нужно воспользоваться "ГОСТ Р..."
Добавлено спустя 5 минут 54 секунды:
Convert.ToBase64String - требуют подпись в Base64 формате.
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser); - искать сертификат у локального пользователя в "Хранилище сертификатов"
Код: Выделить всё
public string getH5(string message)
{
byte[] msg = Encoding.UTF8.GetBytes(message);
ContentInfo contentInfo = new ContentInfo(msg);
SignedCms signedCms = new SignedCms(contentInfo, true);
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.ReadOnly);
string singerName = "Тут имя сертификата (CN)";
X509Certificate2Collection certColl2 = storeMy.Certificates.Find(X509FindType.FindBySubjectName,
singerName, false);
storeMy.Close();
if (certColl2.Count == 0)
return "";
X509Certificate2 cert1 = certColl2[0];
CmsSigner cmsSigner = new CmsSigner(cert1);
signedCms.ComputeSignature(cmsSigner, false);
var r = signedCms.Encode();
return Convert.ToBase64String(r);
}Добавлено спустя 12 минут 26 секунд:
в самом сертификате указано какими инструментами нужно воспользоваться "ГОСТ Р..."
Добавлено спустя 5 минут 54 секунды:
Convert.ToBase64String - требуют подпись в Base64 формате.
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser); - искать сертификат у локального пользователя в "Хранилище сертификатов"
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
alps
Подскажи - где взять интерфейс к библиотекам криптопро на паскале?
А то самому заниматься переводом - не хочется. Времени много уйдёт.
Я пробую через комобъект - но это только для винды.
olegy123
Спасибо
Подскажи - где взять интерфейс к библиотекам криптопро на паскале?
А то самому заниматься переводом - не хочется. Времени много уйдёт.
Я пробую через комобъект - но это только для винды.
olegy123
Спасибо
alexs писал(а):alps
Подскажи - где взять интерфейс к библиотекам криптопро на паскале?
А то самому заниматься переводом - не хочется. Времени много уйдёт.
Я пробую через комобъект - но это только для винды.
https://yadi.sk/d/SVJdaE31nK0CMg
