【问题标题】:Getting a null reference while trying to verify a signature using MimeKit尝试使用 MimeKit 验证签名时获取空引用
【发布时间】:2019-09-22 00:56:35
【问题描述】:

我目前正在使用proof of concept 来实现一个 AS2 客户端。我设置了一个consle application 作为发送方,一个ASP .Net API 作为接收方。我尝试使用Windows.Security 库来实现这一点,但也存在验证签名的问题。然后我发现MimeKit 似乎更容易使用。

在试图找到解决我的问题的方法时,在我看来,关于“如何验证签名”的大多数问题的答案都是在 MultipartSigned 中的签名上执行 foreach 循环,我试过了这样做,但它没有帮助我。

decrypted 是一个包含整个消息的MimeEntity

当我调用signed.Verify(); 时出现空引用。

var signed = decrypted as MultipartSigned;
if (signed != null) {
    using (var ctx = new TemporaryMimeContext ()) {
        foreach (var signature in signed.Verify (ctx)) {
            try {
                bool valid = signature.Verify ();
            } catch (DigitalSignatureVerifyException) {
                // There was an error verifying the signature.
            }
        }
    }
}

应该发生的是签名应该没问题,但实际发生的是 null refrence exception 出现在程序集文件内。

堆栈跟踪如下所示

   at MimeKit.Cryptography.BouncyCastleSecureMimeContext.<GetDigitalSignaturesAsync>d__28.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MimeKit.Cryptography.BouncyCastleSecureMimeContext.Verify(Stream content, Stream signatureData, CancellationToken cancellationToken)
   at MimeKit.Cryptography.MultipartSigned.Verify(CryptographyContext ctx, CancellationToken cancellationToken)
   at AS2_Proof_of_Concept.WebAPI.Controllers.MimeKitController.IncomingMessage() in C:\Users\chris\source\repos\AS2 Proof of Concept\AS2_Proof_of_Concept\AS2_Proof_of_Concept.WebAPI\Controllers\MimeKitController.cs:line 104
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.<>c__DisplayClass33_0.<WrapVoidMethod>b__0(Object target, Object[] parameters)
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.VoidResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()

编辑

signed 消息如下所示。

Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="----=_Part_946d8daa50ab44b699f82dbd3c6bacc0"

------=_Part_946d8daa50ab44b699f82dbd3c6bacc0
Content-Type: application/EDIFACT
Content-Transfer-Encoding: binary
Content-Disposition: attachment filename= HelloWorld.txt

test
------=_Part_946d8daa50ab44b699f82dbd3c6bacc0
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment filename="smime.p7s"

MIIEmQYJKoZIhvcNAQcCoIIEijCCBIYCAQExDTALBglghkgBZQMEAgEwCwYJKoZIhvcNAQcBoIID
EzCCAw8wggH3oAMCAQICEHRJ0r9pduGJTCHsDzuElc4wDQYJKoZIhvcNAQELBQAwETEPMA0GA1UE
AwwGTXlDZXJ0MB4XDTE5MDMyNTEzNTQzMloXDTIwMDMyNTE0MTQzMlowETEPMA0GA1UEAwwGTXlD
ZXJ0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApOwOacjTjhHOqTzq3EhnQG3HHfO8
YjCE/+CKcbz++mCQ2gkNVyx37rnrNrSuPp6rYZioKss9sYtwaYUe4iyisZBe7rKWNE9itScZBnwj
SCWDId0zrdd+74bkoz8OOvCizjhIcQNmuq5IyCtwB6kF3VAs58QWacjT1C7sVO+YlZdItp97LqzD
s3N8ERCJWRwWawER9h3lkg+WZWSCG2D9SYaU5fv8PNLmQyTYaacRT32WPLjSoM3YB4J9/LXrfPg+
zrK1z+TByyCmnAeFUo3f7VLrtLZYlnbqEz+WkCmZLh9BQvPjt5M2FU+uljIhaooehEPjQa9MRnUY
il4/inh+FQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsG
AQUFBwMBMBEGA1UdEQQKMAiCBk15Q2VydDAdBgNVHQ4EFgQUaPko4FVtzSG9dxjfY30qhq3sGd0w
DQYJKoZIhvcNAQELBQADggEBAEcfxDHRyfjr378ieNwXRodb6/tCZoFXAHaJtEnNfMfbxit324cW
rKt43dQTYg/ByFRV3HZooeNDp8lNCT7zSfiBnxLaqyDPeNuoG910CVdJ3dp2fh5Jphof4R9hgVdx
FX8BNQYH+QdrNndbCdQr/UPbuc+lmuKMCHDW8HtEOcaMoa5CvIZtL6+w9ofFAz8nWEmngagCYavb
x0fz/XZGQ4zriFs9LZEuAF36QJWsbIc53r0KwZY5r7PTuipqQu5BdkF71ljqE39e9A0nLeYN0D/u
hqstrv4+koq1EiDL/hSJLDjLJF9WZK6UYZobikhWo2QCzMapo5nPHxbTWr98bCgxggFMMIIBSAIB
ATAlMBExDzANBgNVBAMMBk15Q2VydAIQdEnSv2l24YlMIewPO4SVzjALBglghkgBZQMEAgEwCwYJ
KoZIhvcNAQEBBIIBAJyIRI42Um2T1PCq/1rmAagSvogVPinemzQHBwxMN+GNDbyOxDom2jN5j7bC
6xb5PIA/hGGhGcPxY7056Llk/FV3nxN1fjiap7sS7HOzY3YkyzlxWMt93VE0auJJKmDCg1+0tTxs
IjXVYRSIwyiMXNltkGCPH4mTWCgy+M9XsQa5iPm/v+9XPcStnO8b/k8Cy3WWxEztwEl6wwiCywUU
V0OUUAZis5zkoYKrmpSZMN+T5jW6IJ566e1lc/jV5CX6D5Ukcskpmd8WdJyO5mPVRpbXuAJnzkoj
66KO8IjHRQzN8ihB3rj9+yZVdFQNobXBzNH4cVqO845OwhD5JbJFtWQ=
------=_Part_946d8daa50ab44b699f82dbd3c6bacc0--

【问题讨论】:

  • 是否可以将signed 部分保存到磁盘并发送给我,以便我弄清楚null 是什么?查看代码,我看不到 NRE 的任何明显原因。另一种选择是构建一个调试版本的 MimeKit 并逐步通过BouncyCastleSecureMimeContext.GetDigitalSignaturesAsync() 方法来查看问题所在,并让我知道哪个变量为空,以便我可以修复它。

标签: nullreferenceexception smime mimekit


【解决方案1】:

在逐步执行BounncyCastleMimeContext.GetDigitalSignatureAsync() 方法时,我发现SecureMimeDigitalSignature (SignerInformation signerInfo, X509Certificate certificate) 处的SignerInformation.SignedAttributesnull,然后空引用导致signature.EncryptionAlgorithms 也是null

【讨论】:

【解决方案2】:

这是 Mime 2.1.4 中的一个合法错误,现已在位于 https://www.myget.org/feed/mimekit/package/nuget/MimeKit 的 build 2.1.4.9 中修复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多