Имеется слудющая задача:
1. Сформировать запрос на выпуск сертификата ключа ЭЦП (КриптоПро)
2. Сформировать заявление в печатной форме, в котором должен содержаться открытый ключ.
Первая задача решана следуюжщим образом:
var s: string;
.....
oEnroll:= CreateOLEObject('CEnroll.CEnroll.2');
oEnroll.ProviderType := 75;
oEnroll.ProviderName := 'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider';
oEnroll.ClientID := 0;
oEnroll.EnableSMIMECapabilities := False;
oEnroll.KeySpec := 1;
oEnroll.GenKeyFlags := 0;
s:=oEnroll.createPKCS10('CN=Ivanov', '1.3.6.1.5.5.7.3.2');
Сформировался вот такой запрос:
MIICRDCCAfECAQAwETEPMA0GA1UEAxMGSXZhbm92MGMwHAYGKoUDAgITMBIGByqF
AwICJAAGByqFAwICHgEDQwAEQOw4Z3XQy7GgtLDEaVbLiMfu2tVuUO2ALcea69rD
wfh5O6FnZqIweM9pEiQwZNdqB9PUb4CwK6TDoLeN95xdQEygggFyMBoGCisGAQQB
gjcNAgMxDBYKNS4xLjI2MDAuMjA1BgorBgEEAYI3AgEOMScwJTAOBgNVHQ8BAf8E
BAMCBPAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwggEbBgorBgEEAYI3DQICMYIBCzCC
AQcCAQEedgBDAHIAeQBwAHQAbwAtAFAAcgBvACAARwBPAFMAVAAgAFIAIAAzADQA
LgAxADAALQAyADAAMAAxACAAQwByAHkAcAB0AG8AZwByAGEAcABoAGkAYwAgAFMA
ZQByAHYAaQBjAGUAIABQAHIAbwB2AGkAZABlAHIDgYkAYi8S8VwjgMmPj5y0hubp
XT95lw8He//GfvwbW5yikmSG7U694CJKbix3DKSVpawYz9eNDkSko57Le+olE7gk
eHZg5CXUwqdKVvswjRk8b6xSudIwlOgUzMyJTXMgzO5hAFiu/Bokbo3/B4iaQr4n
4XHJsF930/4Rz/QAtc0rXFIAAAAAAAAAADAKBgYqhQMCAgMFAANBAIK9mLDIaXK8
Gy4SmlT7MyogWwmYcZcM/HT6ylW+05EL3B11FRegJUwph2375D6ibJ0y/OD1bjCS
zjmAgreFK1o=
Насколько я понимаю он в кодировке base64, и теперь, для того чтобы к нему применить функцию CryptDecodeObject (чтобы вытащить открытый ключа) его надо из base64 приобразовать в binary. Для этого я делаю следующее:
implementation
function CryptStringToBinary; external crypt32 name 'CryptStringToBinaryA';
.......
Flags := CRYPT_STRING_BASE64REQUESTHEADER;
CryptStringToBinary(pointer(s), Length(s), Flags, nil, sz, skip, Flags);
GetMem(buf, sz);
CryptStringToBinary(pointer(s), Length(s), Flags, buf, sz, skip, Flags);
Однако, получаю sz=0.
Подскажите в чём моя ошибка и как её можно исправить? Большое спасибо.
Здравствуйте, Аноним, Вы писали:
Вопрос закрыт, всё получилось
А>Имеется слудющая задача:
А>1. Сформировать запрос на выпуск сертификата ключа ЭЦП (КриптоПро)
А>2. Сформировать заявление в печатной форме, в котором должен содержаться открытый ключ.
А>Первая задача решана следуюжщим образом:
А>А> var s: string;
А> .....
А> oEnroll:= CreateOLEObject('CEnroll.CEnroll.2');
А> oEnroll.ProviderType := 75;
А> oEnroll.ProviderName := 'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider';
А> oEnroll.ClientID := 0;
А> oEnroll.EnableSMIMECapabilities := False;
А> oEnroll.KeySpec := 1;
А> oEnroll.GenKeyFlags := 0;
А> s:=oEnroll.createPKCS10('CN=Ivanov', '1.3.6.1.5.5.7.3.2');
А>
А>Сформировался вот такой запрос:
А>А>MIICRDCCAfECAQAwETEPMA0GA1UEAxMGSXZhbm92MGMwHAYGKoUDAgITMBIGByqF
А>AwICJAAGByqFAwICHgEDQwAEQOw4Z3XQy7GgtLDEaVbLiMfu2tVuUO2ALcea69rD
А>wfh5O6FnZqIweM9pEiQwZNdqB9PUb4CwK6TDoLeN95xdQEygggFyMBoGCisGAQQB
А>gjcNAgMxDBYKNS4xLjI2MDAuMjA1BgorBgEEAYI3AgEOMScwJTAOBgNVHQ8BAf8E
А>BAMCBPAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwggEbBgorBgEEAYI3DQICMYIBCzCC
А>AQcCAQEedgBDAHIAeQBwAHQAbwAtAFAAcgBvACAARwBPAFMAVAAgAFIAIAAzADQA
А>LgAxADAALQAyADAAMAAxACAAQwByAHkAcAB0AG8AZwByAGEAcABoAGkAYwAgAFMA
А>ZQByAHYAaQBjAGUAIABQAHIAbwB2AGkAZABlAHIDgYkAYi8S8VwjgMmPj5y0hubp
А>XT95lw8He//GfvwbW5yikmSG7U694CJKbix3DKSVpawYz9eNDkSko57Le+olE7gk
А>eHZg5CXUwqdKVvswjRk8b6xSudIwlOgUzMyJTXMgzO5hAFiu/Bokbo3/B4iaQr4n
А>4XHJsF930/4Rz/QAtc0rXFIAAAAAAAAAADAKBgYqhQMCAgMFAANBAIK9mLDIaXK8
А>Gy4SmlT7MyogWwmYcZcM/HT6ylW+05EL3B11FRegJUwph2375D6ibJ0y/OD1bjCS
А>zjmAgreFK1o=
А>
А>Насколько я понимаю он в кодировке base64, и теперь, для того чтобы к нему применить функцию CryptDecodeObject (чтобы вытащить открытый ключа) его надо из base64 приобразовать в binary. Для этого я делаю следующее:
А>А>implementation
А>function CryptStringToBinary; external crypt32 name 'CryptStringToBinaryA';
А>.......
А>Flags := CRYPT_STRING_BASE64REQUESTHEADER;
А>CryptStringToBinary(pointer(s), Length(s), Flags, nil, sz, skip, Flags);
А>GetMem(buf, sz);
А>CryptStringToBinary(pointer(s), Length(s), Flags, buf, sz, skip, Flags);
А>
А>Однако, получаю sz=0.
А>Подскажите в чём моя ошибка и как её можно исправить? Большое спасибо.