В статье asn1 0x8009310b криптопро и ПКЗО ошибка. Модули «Межевой план», “Технический план”,”Карта-план”;

В статье asn1 0x8009310b криптопро и ПКЗО ошибка. Модули «Межевой план», "Технический план","Карта-план"; Электронная цифровая подпись

Обновлено 21. 2021

В статье asn1 0x8009310b криптопро и ПКЗО ошибка. Модули «Межевой план», "Технический план","Карта-план";

1799 / 611 / 37

Регистрация: 22. 2009

2012, 09:48. Показов 17143. Ответов 2

Всем привет!
Пишу код –

C#1
2
3
4
5
6
7
8
9
10
 ContentInfo plainContent = new ContentInfo(msg);
 
            // EnvelopedCms represents encrypted data
            EnvelopedCms encryptedMessage = new EnvelopedCms(plainContent);
 
            // add a recipient
            CmsRecipient recipient = new CmsRecipient(recipientCert);
 
            // encrypt data with public key of recipient
            encryptedMessage. Encrypt(recipient);

C#1
2
            // encrypt data with public key of recipient
            encryptedMessage. Encrypt(recipient);

Вылетает ошибка –

Встречено неверное значение тега ASN1

System. Security. Cryptography. C ryptographicException was unhandled
Message=Встречено неверное значение тега ASN1.

Кто может подсказать, в чем дело?
Заранее всем спасибо!

hStoreHandle := CertOpenSystemStore(0,CERT_STORE_NAME);

if hStoreHandle = nil then
begin
Memo. Lines. Add(‘ОШИБКА ПРИ ОТКРЫТИИ ХРАНИЛИЩА ‘+ CERT_STORE_NAME);
exit;
end
else
Memo. Lines. Add(‘ХРАНИЛИЩЕ ‘ + CERT_STORE_NAME + ‘ ОТКРЫТО’);

enctype := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;

//получаем сертификат
GetMem(pSignerName,2*Length(SIGNER_NAME)+1);
StringToWideChar(SIGNER_NAME,pSignerName,2*Length(SIGNER_NAME)+1);
pSignerCert:= CertFindCertificateInStore(hStoreHandle,enctype,0,CERT_FIND_SUBJECT_STR,pSignerName,nil);
FreeMem(pSignerName);

if pSignerCert = nil then
begin
err := getErrorString(GetLastError);
Memo. Lines. Add(‘НЕ НАЙДЕН СЕРТИФИКАТ ‘ + SIGNER_NAME + ‘ ‘ + err);
exit;
end
else
Memo. Lines. Add(‘СЕРТИФИКАТ ‘ + SIGNER_NAME + ‘ НАЙДЕН’);

if CertCloseStore(hStoreHandle,0) then
Memo. Lines. Add(‘ХРАНИЛИЩЕ ‘ + CERT_STORE_NAME + ‘ ЗАКРЫТО’)
else
begin
Memo. Lines. Add(‘ОШИБКА ПРИ ЗАКРЫТИИ ХРАНИЛИЩА ‘+ CERT_STORE_NAME);
exit;
end;

FillChar(SigParams, sizeof(CRYPT_SIGN_MESSAGE_PARA), #0);

SetLength(MessageArray, sizeof(PByte));
SetLength(MessageSize, sizeof(DWORD));

//Закрываем провайдер
if not CryptReleaseContext(hProv, 0) then
begin
err := getErrorString(GetLastError);
Memo. Lines. Add(‘ОШИБКА ПРИ ЗАКРЫТИИ КОНТЕКСТА ПРОВАЙДЕРА: ‘ + err);
end
else
Memo. Lines. Add(‘КОНТЕКСТ ПРОВАЙДЕРА ‘+PROVIDER_NAME+’ ЗАКРЫТ’);

Подпись проходит без видимых ошибок, но проверка подписи с помощью CryptVerifyDetachedMessageSignature выдаёт, что подпись неверна:
procedure TForm1. N21Click(Sender: TObject);
var
hStoreHandle : HCERTSTORE; //хранилище
enctype: cardinal; //формат данных
pSignerCert: PCCERT_CONTEXT; //сертификат
pSignerName: PWideChar; //SIGNER
VerifyPara: CRYPT_VERIFY_MESSAGE_PARA;
err:string;
hProv: HCRYPTPROV;
Sign: PByte;
SignSize: DWORD;
f1: file;
MessageArray: pacarPbyte;
MessageSize : pacarDWORD;
function MySignerCertificateCallback(pvGetArg : pvoid;dwCertEncodingType : DWORD;pSignerId : PCERT_INFO;hMsgCertStore : HCERTSTORE): PCCERT_CONTEXT ;
begin
result := PCCERT_CONTEXT(pvGetArg);
end;

Читайте также:  как найти ключ от криптопро в системе

//Считываем подпись
AssignFile(f1,detSignFile);
Reset(f1, 1);

SignSize := FileSize(f1);
GetMem(Sign, SignSize);

//Считываем Исходный файл
SetLength(MessageArray, sizeof(PByte));
SetLength(MessageSize, sizeof(DWORD));

AssignFile(f1,srcFile);
Reset(f1, 1);

2006 14:35:38Kirill Sobolev

//Подписать
procedure TForm1. N4Click(Sender: TObject);
var
hStoreHandle : HCERTSTORE; //хранилище

pSignerCert: PCCERT_CONTEXT;
hProv: HCRYPTPROV;
err : string;

enctype: Cardinal;
SigParams: CRYPT_SIGN_MESSAGE_PARA;

MessageArray: array of PByte;
MessageSize : array of DWORD;

Signed_MessageBlob: PByte;
cbSignedMessageBlob: DWord;

f1:file;
pSignerName: PWideChar; //SIGNER
begin

end
else
Memo. Lines. Add(‘CryptSignMessage second – Error’);

end;
//Проверить
procedure TForm1. N5Click(Sender: TObject);
var
hStoreHandle : HCERTSTORE; //хранилище
enctype: cardinal; //формат данных
pSignerCert: PCCERT_CONTEXT; //сертификат
pSignerName: PWideChar; //SIGNER
VerifyPara: CRYPT_VERIFY_MESSAGE_PARA;
err:string;
hProv: HCRYPTPROV;
Sign: PByte;
SignSize: DWORD;
f1: file;

DecMessageBlob: PByte;
cbDecMessageBlob: DWord;

function MySignerCertificateCallback( pvGetArg : pvoid; dwCertEncodingType : DWORD;pSignerId : PCERT_INFO;hMsgCertStore : HCERTSTORE): PCCERT_CONTEXT ;
begin
Result := PCCERT_CONTEXT(pvGetArg);
end;
begin

2006 16:20:00Kirill Sobolev

2006 17:41:37Kirill Sobolev

2006 10:18:07Kirill Sobolev

2006 12:11:24Kirill Sobolev

То же сообщение.

Пишет: Detached Signature war verified OK. Но вот в программе то не получается.

2006 14:04:45Kirill Sobolev

Подписываю с помощью delphi, проверяю на csptest -> Режим проверки записи (VERIFY) отключен.

csptest -sfsign -in src_mes. txt -out detached_sign. txt -my basil_sign -sign -detached

ВОЗВРАЩАЕТ:
CSP (Type:71) v3. 3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED. CSP (Type:75) v3. 3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED. #0: basil_sign, RU
Valid from 24. 2006 to 24. 2007

ПРОВЕРКА
csptest -sfsign -in src_mes. txt -my basil_sign -verify -signature detached_sign. txt

Получается проблема не в Delphi – коде?!

2006 10:52:20Kirill Sobolev

Для чего нужно выгружать сертификат

Как я и писал выше, основная задача, это подключение пользователя в закрытую, корпоративную сеть, так как это безопасно. Сертификаты выступают в роли дополнительной защиты, в случае компрометации пароля учетной записи. Узнал так вот злоумышленник пароль жертвы, но подключиться не сможет, так как не будет иметь сертификата.

Читайте также:  криптопро вебинар

Случай из практики, есть подрядчик, который должен выполнить работу, так как он не сидит в офисе как обычные сотрудники, то у него нет доменного компьютера, а значит он не может автоматически получить сертификат, а так как для его запроса, он должен быть внутри корпоративной сети, то он не может это осуществить, и не сможет подключиться по VPN, чтобы выполнить свою работу. Или пользователь потерял или сломал свой компьютер и ему срочно, необходимо получить доступ к корпоративной, локальной сети, он просит вас помочь в этой ситуации. И единственным способом это сделать, является ручная выгрузка его сертификата в формате pfx с закрытым ключом, чтобы вы в дальнейшем передали его по электронной почте, для последующей установки.

Восстановление сертификата в Active Directory

И так, чтобы произвести выгрузку открытого и закрытого ключа из центра сертификации, у вас должны на это быть права. Делать это может группа или отдельные пользователи, у которых есть права на определенный шаблон. Давайте дадим определение агента восстановления ключей.

Агент восстановления ключа – это лицо, которому разрешено восстановить сертификат от имени конечного пользователя. Поскольку роль агентов восстановления ключей может касаться важных данных, эту роль можно назначать только заслуживающим доверия лицам.

Если вы хотите иметь возможность восстанавливать сертификаты на центре сертификации Windows, то вам необходимо дать права на шаблон сертификата агента восстановления ключей (Key Recovery Agent). Как только вы это сделаете, то сможете подавать заявки на восстановление.

Настройка шаблона сертификата агента восстановления ключей

  • Откройте оснастку “Шаблоны сертификатов (Certification Authority)”.
  • Щелкните правым кликом по шаблонам сертификатов (Certificate Templates) и выберите пункт управление (Manage)
  • В дереве консоли щелкните правой кнопкой мыши шаблон сертификата Агент восстановления ключей.
  • Нажмите кнопку Скопировать шаблон.
  • В диалоговом окне Копирование шаблона щелкните Windows Server 2003 Enterprise, если не все центры сертификации и клиентские компьютеры работают под управлением операционной системы Windows Server 2008 R2, Windows Server 2008, Windows 7 или Windows Vista.
  • В поле Шаблон введите новое отображаемое имя шаблона, а затем при необходимости измените все другие свойства.
  • На вкладке Безопасность нажмите кнопку Добавить, введите имя пользователей, которым нужно выдать сертификаты агентов восстановления ключа, а затем нажмите кнопку ОК.
  • В списке Имена групп или пользователей выберите только что добавленные имена пользователей. В группе Разрешения установите флажки Чтение и Заявка, затем нажмите кнопку ОК.
Читайте также:  криптоарм лицензия такая же что и криптопро

Так же убедитесь, что у вас выставлена галка, разрешающая экспорт закрытых ключей (Allow private key to be exported)

В статье asn1 0x8009310b криптопро и ПКЗО ошибка. Модули «Межевой план», "Технический план","Карта-план";

Теперь когда вы убедились в наличии необходимых разрешений на процедуру восстановления сертификата, мы можем произвести его выгрузку. Для этого откройте cmd От имени администратора в сессии той учетной записи у которой есть права на шаблон (Агент восстановления ключей). Для экспорта сертификата с закрытым ключом, нам поможет консольная утилита certutil, если вы готовились к экзаменам по MCSE, то вы ее должны знать.

Первым шагом нам необходимо выполнить запрос, на нахождение сертификата, по пользователю или его серийному номеру, использовать можно одну из двух.

  • certutil -view -restrict “RequesterName=pyatilistnikseminivan” –out StatusCode
  • certutil -view -restrict “SerialNumber=7554505294e900781a46b1f39300014564563” -out StatusCode. Ваш серийный номер сертификата вы можете посмотреть в оснастке ADUC, выбрав пользователя и перейдя в его свойствах на вкладку “Опубликованные сертификаты”. Далее переходите в состав и находите серийный номер, который будем использовать для выгрузки сертификата.

В статье asn1 0x8009310b криптопро и ПКЗО ошибка. Модули «Межевой план», "Технический план","Карта-план";

В итоге у меня команда отработала на ура.

В статье asn1 0x8009310b криптопро и ПКЗО ошибка. Модули «Межевой план», "Технический план","Карта-план";

Далее вы получаете BLOB файл

certutil -getkey “7554505294e900781a46b1f39300014564563”  C:TEMPOutputseminivan_BLOB

После чего выгружаете с помощью BLOB файла открытый и закрытый ключ в виде pfx архива,

certutil -recoverkey C:TEMPOutputseminivan_BLOB C:TEMPOutputseminivan_BLOB. pfx

Утилита certutil попросит вас задать пароль на архив, для большей безопасности.

В статье asn1 0x8009310b криптопро и ПКЗО ошибка. Модули «Межевой план», "Технический план","Карта-план";

Все теперь вы спокойно передаете архив с ключами по электронной почте, пользователю или подрядчику и на этом можно считать выгрузку сертификата из Active Directory завершенным. Вообще у утилиты cetrutil огромные возможности, которых нет в графическом интерфейсе.

Оцените статью
ЭЦП Эксперт
Добавить комментарий