2014-08-27 110 views
1

我正在通過C#使用p/invoked CryptoAPI調用在應用程序中使用創建一些自簽名證書。我將正確的信息分配給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解碼器證書,模當用KeyPal檢查公鑰時,公鑰信息的字段具有不在那裏的前導00字節。任何人都可以告訴我我需要做什麼來解決這個錯誤?

+0

什麼是CryptSignAndEncryptCertificate?你有任何代碼嗎?在使用OpenSSL API時,通常只需以編程方式創建自簽名證書;你不會經歷CSR的中間步驟。 OpenSSL的'req'工具可以創建自簽名的。你使用命令'openssl req -x509 ...'。 '-x509'告訴它創建一個自簽名的,而不是一個請求。你可以在'/apps/req.c'找到源代碼。 – jww 2014-08-28 01:19:26

+0

CryptSignAndEncodeCertificate是Windows CryptoAPI中的函數調用之一。我沒有使用openSSL。 – 2014-08-28 11:14:52

+0

你確定'CryptSignAndEncryptCertificate'是一個Windows函數嗎? http://www.google.com/#q=CryptSignAndEncryptCertificate+msdn返回0個結果。如果你不使用OpenSSL,那麼你爲什麼會有OpenSSL錯誤消息? – jww 2014-08-28 15:38:30

回答

0

的人誰的興趣:傳遞到CryptSignAndEncodeCertificate

的CERT_INFO結構包含的SubjectPublicKeyInfo字段是一個CERT_PUBLIC_KEY_INFO結構。我最初試圖從CryptExportPublicKeyInfo接收指針,並通過Marshal.PtrToStructure將其指定給SubjectPublicKeyInfo。事實證明,Marshal.PtrToSTructure只是讓SubjectPublicKeyInfo指向與返回的指針相同的內存位置。當指針被釋放時,內存無效並且SubjectPublicKeyInfo處於未確定狀態。解決此問題的方法是創建一個新結構,然後將此新結構分配給SubjectPublicKeyInfo。這會導致新結構中的值被複制到SubjectPublicKeyInfo中,因此其內存位置永遠不會失效。或者至少這是我能夠找到的最接近的數字。如果有人有更好的解釋,我很樂意聽到它。