c# - 证书未正确签名

标签 c# ssl certificate pinvoke cryptoapi

我正在使用 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/

相关文章:

c# - 无法使用 Mock Lambda 测试工具启动 lambda

c++ - 关闭 boost asio ssl 套接字时需要调用 ssl::stream::shutdown 吗?

ssl - 有没有办法使用 prometheus 监控 kubernetes 中的 tls 证书?

java - Android SSL 握手异常

c# - 我的类应该实现什么接口(interface)或方法来在 Console.WriteLine 中打印我想要的内容?

c# - 不同日期列表

c# - 使用带参数的函数委托(delegate)命令

tomcat - Grails 3 和 Spring Security LDAP 未加密流量

java - 如何使用我的 Mac 钥匙串(keychain)中的证书签署 Java 小程序?

java - 无法卸载应用程序,因为它没有显示