我正在使用 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:
在 CSR 解码器中检查证书时 http://certlogik.com/decoder/ ,公钥信息的模数字段有一个前导 00 字节,在使用 KeyPal 检查公钥时不存在。谁能告诉我我需要做什么来修复这个错误?
最佳答案
对于任何感兴趣的人:
传递到 CryptSignAndEncodeCertificate 的 CERT_INFO 结构包含一个 SubjectPublicKeyInfo 字段,它是一个 CERT_PUBLIC_KEY_INFO 结构。我最初试图获取从 CryptExportPublicKeyInfo 接收到的指针,并通过 Marshal.PtrToStructure 将其分配给 SubjectPublicKeyInfo。事实证明,Marshal.PtrToSStructure 只是导致 SubjectPublicKeyInfo 指向与返回指针相同的内存位置。当指针被释放时,内存失效并且 SubjectPublicKeyInfo 处于未确定状态。绕过它的方法是创建一个新结构,然后将这个新结构分配给 SubjectPublicKeyInfo。这会导致新结构中的值被复制到 SubjectPublicKeyInfo,因此它的内存位置永远不会失效。或者至少这是我能想到的最接近的。如果有人有更好的解释,我很乐意听到。
关于c# - 证书未正确签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25536217/