Статус: Активный участник
Группы: Участники
Зарегистрирован: 21.03.2022(UTC) Сообщений: 33 Откуда: Краснодарский край
Сказал(а) «Спасибо»: 17 раз
|
 CheckGetSpecification.xml.xmlresponse.xml (7kb) загружен 3 раз(а).Пытался реализовать пример с использованием JwaWinCrypt тоже ничего не получилось. Нужно из сертификата X509 вытащить название клиента,ИНН,КПП. Хотим сделать свой документооборот - Создается XML файл УПД ,подписываетсяи отправляется клиенту. Клиент проверяет подпись и проверяет соответствие ИНН и КПП и далее загружается документ в программу Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i, n: Integer;
M: TMemoryStream;
BPos, EPos: Integer;
Name,Value: String;
SL: TStringList;
pc:PCERT_INFO ;
pb:PByte;
encType: DWORD;
PS: Pbyte;
sz: DWORD;
skip: DWORD;
flags: DWORD;
// I: Integer;
pCert:PCCERT_CONTEXT;
begin
SL := TStringList.Create;
M := TMemoryStream.Create;
if OpenDialog1.Execute then
SL.LoadFromFile(OpenDialog1.FileName);
Memo1.Clear;
BPos := Pos('<'+Edit1.Text+'X509Certificate>', SL.Text) + Length('<'+Edit1.Text+'X509Certificate>');
EPos := Pos('</'+Edit1.Text+'X509Certificate>', SL.Text);
Value := ToBase64( Copy(SL.Text, BPos, EPos - BPos));
//Value:=IdEncoderMIME1.EncodeString(Value);
Memo1.Lines.Add(Value);
//CertCreateCertificateContext( https://www.cyberforum.ru/delphi/thread302892.html
{CertCreateCertificateContext(X509_ASN_ENCODING or
PKCS_7_ASN_ENCODING, M.Memory, M.Size);}
label1.Caption:=IntToStr(Length(Value)) ;
// dwSize := CertGetName////(CERT_CONTEXT, dwType, dwFlags, pvTypePara, nil, 0);
// Win32Check(dwSize <> 0);
pCert:= CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PByte(Value),Length(Value) );
// CertGetNameStringA(pCert, dwType, dwFlags, pvTypePara, nil, 0)
// IntToStr(pCert.cbCertEncoded);
//pc:=pCert^.pCertInfo;
//Memo1.Lines.Add(pCertCont^);
// pCert^.pCertInfo^.NotBefore ;
//pcert^.pCertInfo^.NotAfter ;
//Pb:=pcert^.pCertInfo^.Issuer.pbData ;
//pcert^.pCertInfo^.Issuer ;
//pcert^.pCertInfo^.Subject ;
//pcert^.pCertInfo^.SerialNumber ;
try
// Byte
// pc:= pCert.pCertInfo ;
// pCert.pCertInfo.Issuer;
// (GetSerialNumber(pCert));
// DecodeSerialNumber(pCert.pCertInfo.SerialNumber) ;
finally
if Assigned(pCert) then
try
ShowMessage(GetSerialNumber(pCert)) ;
finally
if not CertFreeCertificateContext(pCert) then
ShowMessage(SysErrorMessage(GetLastError)) ;
end
else
SL.Text:= Value;
//M.;
flags := CRYPT_STRING_BASE64REQUESTHEADER;
//CryptStri
// CryptStringToBinary(
//https://delphisources.ru/forum/showthread.php?t=27645
// M.Write(SL.)
// M.LoadFromStream(SL.);
// CryptStringToBinary(PChar(SL.Text), Length(SL.Text), flags, nil, sz, skip, flags);
// ShowMessage(PS.);
GetMem(PS, sz);
// Pchar(sz);
//PS:=PByte(SL.Text);
try
// CryptStringToBinary(PChar(SL.Text), Length(SL.Text), flags, Pointer(PS), sz, skip, flags);
pCert := CertCreateCertificateContext({encType}X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, PS, sz);
finally
FreeMem(PS);
end;
if Assigned(pCert) then
ShowMessage(GetSerialNumber(pCert));
{LOG(FormatDateTime('Äåéñòâèòåëåí ñ: dd.mm.yyyy',
FileTime2DateTime(cert^.pCertInfo^.NotBefore)));
LOG(FormatDateTime('Äåéñòâèòåëåí äî: dd.mm.yyyy',
FileTime2DateTime(cert^.pCertInfo^.NotAfter)));
LOG('Ñóáúåêò: ' + DecodeName(cert^.pCertInfo^.Subject));
LOG('Ïîñòàâùèê: ' + DecodeName(cert^.pCertInfo^.Issuer));
LOG('******');
LOG('Ïàðñèì ìûëî ñóáúåêòà: ' + GetValue('',
DecodeName(cert^.pCertInfo^.Subject), 'E=', ',', I));
LOG('******');
LOG('Ñåðèéíûé íîìåð: ' + DecodeSerialNumber
(cert^.pCertInfo^.SerialNumber));}
// M.Read()
end;
// CertFreeCertificateContext( CertInfo) ;
// ByteArrayToStr(CertInfo.pCertInfo.SerialNumber.pbData,CertInfo.pCertInfo.SerialNumber.cbData);
// GetSerialNumber(pCert) ;
SL.Free;
M.Free;
end;
Отредактировано пользователем 3 июня 2023 г. 15:30:10(UTC)
| Причина: Не указана
|