证书未正确签名

时间:2014-08-27 20:17:32

标签: c# ssl certificate pinvoke cryptoapi

我正在使用p /调用的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检查公钥时,该字节不存在。任何人都可以告诉我需要做些什么来解决这个错误吗?

1 个答案:

答案 0 :(得分:0)

对于任何有兴趣的人:

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