Сертификат не подписан должным образом

1

Я создаю некоторые самозаверяющие сертификаты через С#, используя вызовы CryptoAPI с использованием p/invoke для использования в приложении. Я назначаю правильную информацию структуре 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. Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы исправить эту ошибку?

  • 0
    Что такое CryptSignAndEncryptCertificate ? У тебя есть какой-нибудь код? При использовании OpenSSL API вы обычно просто создаете самоподписанный сертификат программно; Вы не проходите промежуточный этап КСО. Утилита req OpenSSL может создавать самоподписанные. Вы используете команду openssl req -x509 ... -x509 говорит ему создать собственную подпись, а не запрос. Вы можете найти исходный код в <openssl src>/apps/req.c .
  • 0
    CryptSignAndEncodeCertificate является одним из вызовов функций в Windows CryptoAPI. Я не использую openSSL.
Показать ещё 2 комментария
Теги:
ssl
certificate
pinvoke
cryptoapi

1 ответ

0

Для всех, кто интересуется:

Структура CERT_INFO, которая передается в CryptSignAndEncodeCertificate, содержит поле SubjectPublicKeyInfo, которое является структурой CERT_PUBLIC_KEY_INFO. Сначала я пытался взять указатель, полученный от CryptExportPublicKeyInfo, и назначить его SubjectPublicKeyInfo через Marshal.PtrToStructure. Как оказалось, Marshal.PtrToSTructure просто заставляет SubjectPublicKeyInfo указывать на ту же ячейку памяти, что и возвращаемый указатель. Когда указатель освобождается, память недействительна, а SubjectPublicKeyInfo остается в неопределенном состоянии. Способ обойти это создать новую структуру, а затем назначить эту новую структуру SubjectPublicKeyInfo. Это приводит к тому, что значения из новой структуры будут скопированы в SubjectPublicKeyInfo, поэтому ее местоположение памяти никогда не будет аннулировано. Или, по крайней мере, это самое близкое, что я могу понять. Если у кого-то есть лучшее объяснение, я бы с удовольствием это услышал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню