我正在使用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检查公钥时则不存在。谁能告诉我该如何解决此错误?
最佳答案
对于任何有兴趣的人:
传递给CryptSignAndEncodeCertificate的CERT_INFO结构包含一个SubjectPublicKeyInfo字段,该字段是CERT_PUBLIC_KEY_INFO结构。我最初试图获取从CryptExportPublicKeyInfo收到的指针,并通过Marshal.PtrToStructure将其分配给SubjectPublicKeyInfo。事实证明,Marshal.PtrToSTructure只会使SubjectPublicKeyInfo指向与返回的指针相同的内存位置。释放指针后,内存将无效,SubjectPublicKeyInfo处于不确定状态。解决该问题的方法是创建一个新结构,然后将此新结构分配给SubjectPublicKeyInfo。这会导致将新结构中的值复制到SubjectPublicKeyInfo,因此其存储位置永远不会无效。或者至少这是我能找到的最接近的数字。如果有人有更好的解释,我很想听听。