【问题标题】:Certificate not being signed properly证书未正确签名
【发布时间】:2014-08-27 20:17:31
【问题描述】:

我正在使用 p/invoked CryptoAPI 调用通过 C# 创建一些自签名证书,以便在应用程序中使用。我将正确的信息分配给 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:

http://certlogik.com/decoder/ 的 CSR 解码器中检查证书时,公钥信息的模数字段有一个前导 00 字节,而使用 KeyPal 检查公钥时不存在该字节。谁能告诉我我需要做什么来解决这个错误?

【问题讨论】:

  • 什么是CryptSignAndEncryptCertificate?你有代码吗?使用 OpenSSL API 时,您通常只需以编程方式创建自签名证书;您不会经历 CSR 的中间步骤。 OpenSSL 的req 实用程序可以创建自签名。您使用命令openssl req -x509 ...-x509 告诉它创建一个自签名,而不是一个请求。你可以在<openssl src>/apps/req.c找到源代码。
  • CryptSignAndEncodeCertificate 是 Windows CryptoAPI 中的函数调用之一。我没有使用 openSSL。
  • 您确定CryptSignAndEncryptCertificate 是Windows 功能吗? google.com/#q=CryptSignAndEncryptCertificate+msdn 返回 0 个结果。如果您没有使用 OpenSSL,那么为什么会出现 OpenSSL 错误消息?
  • msdn.microsoft.com/en-us/library/windows/desktop/… 我收到 openssl 错误消息,因为我使用 openssl 作为验证证书是否有效的独立方法。

标签: c# ssl certificate pinvoke cryptoapi


【解决方案1】:

对于任何有兴趣的人:

传递到 CryptSignAndEncodeCertificate 的 CERT_INFO 结构包含一个 SubjectPublicKeyInfo 字段,它是一个 CERT_PUBLIC_KEY_INFO 结构。我最初试图获取从 CryptExportPublicKeyInfo 接收到的指针,并通过 Marshal.PtrToStructure 将其分配给 SubjectPublicKeyInfo。事实证明,Marshal.PtrToSTructure 只是导致 SubjectPublicKeyInfo 指向与返回指针相同的内存位置。当指针被释放时,内存失效并且 SubjectPublicKeyInfo 处于未确定状态。绕过它的方法是创建一个新结构,然后将这个新结构分配给 SubjectPublicKeyInfo。这会导致新结构中的值被复制到 SubjectPublicKeyInfo,因此它的内存位置永远不会失效。或者至少这是我能想到的最接近的。如果有人有更好的解释,我很想听听。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2017-12-16
    相关资源
    最近更新 更多