Сертификат не подписан должным образом
Я создаю некоторые самозаверяющие сертификаты через C#, используя вызовы p/invoke CryptoAPI для использования в приложении. Я присваиваю правильную информацию структуре CERT_INFO, получая открытый ключ с помощью CryptExportPublicKey. Когда я шифрую сертификат с помощью CryptSignAndEncryptCertificate, полученное значение выглядит правильным, но при тестировании с помощью openssl -verify я получаю следующие ошибки:
6704:error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01:.\crypto\rsa\rsa_pk1.c:100:
6704:error:04067072:rsa routines:RSA_EAY_PUBLIC_DECRYPT:padding check failed:.\crypto\rsa\rsa_eay.c:721:
6704:error:0D0C5006:asn1 encoding routines:ASN1_item_verify:EVP lib:.\crypto\asn1\a_verify.c:221:
При проверке сертификата в CSR-декодере по адресу http://certlogik.com/decoder/ поле модуля информации открытого ключа имеет начальный байт 00, которого нет при проверке открытого ключа с помощью KeyPal. Может кто-нибудь сказать мне, что мне нужно сделать, чтобы исправить эту ошибку?
1 ответ
Для тех, кто заинтересован:
Структура CERT_INFO, которая передается в CryptSignAndEncodeCertificate, содержит поле SubjectPublicKeyInfo, которое является структурой CERT_PUBLIC_KEY_INFO. Первоначально я пытался взять указатель, полученный от CryptExportPublicKeyInfo, и назначить его SubjectPublicKeyInfo через Marshal.PtrToStructure. Как оказалось, Marshal.PtrToSTructure просто заставляет SubjectPublicKeyInfo указывать на ту же область памяти, что и возвращаемый указатель. Когда указатель освобождается, память становится недействительной, а SubjectPublicKeyInfo остается в неопределенном состоянии. Способ обойти это состоит в том, чтобы создать новую структуру и затем назначить эту новую структуру SubjectPublicKeyInfo. Это приводит к тому, что значения из новой структуры копируются в SubjectPublicKeyInfo, поэтому его расположение в памяти никогда не будет аннулировано. Или, по крайней мере, это самое близкое, что я могу понять. Если у кого-нибудь есть лучшее объяснение, я бы с удовольствием его услышал.