尝试使用MimeKit验证签名时获取空引用

时间:2019-05-03 13:06:40

标签: nullreferenceexception smime mimekit

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

在尝试解决我的问题时,在我看来,关于“如何验证签名”的大多数问题都是在{{1}中对签名执行foreach循环的答案},我尝试这样做,但并没有帮助我。

MultipartSigned是包含整个消息的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

EDIT

这是 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

2 个答案:

答案 0 :(得分:0)

在逐步使用 private void initAzureConnection(Context context) { try { azureClient = new MobileServiceClient( "https://*.azurewebsites.net", context ); } catch (MalformedURLException ex) { Log.e(LOG_TAG, "failed to initialize azure client", ex); } } 方法时,我发现2019-05-06 19:14:15.959 5414-5414/com.*.* E/MAIN_ACTIVITY: failure com.microsoft.windowsazure.mobileservices.MobileServiceException: Error while processing request. at com.microsoft.windowsazure.mobileservices.http.MobileServiceConnection$1.onNext(MobileServiceConnection.java:139) at com.microsoft.windowsazure.mobileservices.MobileServiceClient$15.handleRequest(MobileServiceClient.java:1611) at com.microsoft.windowsazure.mobileservices.http.MobileServiceConnection.start(MobileServiceConnection.java:114) at com.microsoft.windowsazure.mobileservices.http.RequestAsyncTask.doInBackground(RequestAsyncTask.java:78) at com.microsoft.windowsazure.mobileservices.http.RequestAsyncTask.doInBackground(RequestAsyncTask.java:35) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764) Caused by: java.net.SocketTimeoutException: timeout at okio.Okio$4.newTimeoutException(Okio.java:232) at okio.AsyncTimeout.exit(AsyncTimeout.java:285) at okio.AsyncTimeout$2.read(AsyncTimeout.java:241) at okio.RealBufferedSource.indexOf(RealBufferedSource.java:354) at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:226) at okhttp3.internal.http1.Http1Codec.readHeaderLine(Http1Codec.java:215) at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189) at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254) at okhttp3.RealCall.execute(RealCall.java:92) at com.microsoft.windowsazure.mobileservices.http.ServiceFilterRequestImpl.execute(ServiceFilterRequestImpl.java:164) at com.microsoft.windowsazure.mobileservices.http.MobileServiceConnection$1.onNext(MobileServiceConnection.java:122) at com.microsoft.windowsazure.mobileservices.MobileServiceClient$15.handleRequest(MobileServiceClient.java:1611)  at com.microsoft.windowsazure.mobileservices.http.MobileServiceConnection.start(MobileServiceConnection.java:114)  at com.microsoft.windowsazure.mobileservices.http.RequestAsyncTask.doInBackground(RequestAsyncTask.java:78)  at com.microsoft.windowsazure.mobileservices.http.RequestAsyncTask.doInBackground(RequestAsyncTask.java:35)  at android.os.AsyncTask$2.call(AsyncTask.java:333)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:764)  Caused by: java.net.SocketException: socket is closed at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:551) at okio.Okio$2.read(Okio.java:140) at okio.AsyncTimeout$2.read(AsyncTimeout.java:237) at okio.RealBufferedSource.indexOf(RealBufferedSource.java:354)  at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:226)  at okhttp3.internal.http1.Http1Codec.readHeaderLine(Http1Codec.java:215)  at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189)  at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)  at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)  at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)  at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)  at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)  at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254)  at okhttp3.RealCall.execute(RealCall.java:92)  at com.microsoft.windowsazure.mobileservices.http.ServiceFilterRequestImpl.execute(ServiceFilterRequestImpl.java:164)  at com.microsoft.windowsazure.mobileservices.http.MobileServiceConnection$1.onNext(MobileServiceConnection.java:122)  at com.microsoft.windowsazure.mobileservices.MobileServiceClient$15.handleRequest(MobileServiceClient.java:1611)  at com.microsoft.windowsazure.mobileservices.http.MobileServiceConnection.start(MobileServiceConnection.java:114)  at com.microsoft.windowsazure.mobileservices.http.RequestAsyncTask.doInBackground(RequestAsyncTask.java:78)  at com.microsoft.windowsazure.mobileservices.http.RequestAsyncTask.doInBackground(RequestAsyncTask.java:35)  at android.os.AsyncTask$2.call(AsyncTask.java:333)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:764)  处的BounncyCastleMimeContext.GetDigitalSignatureAsync()SignerInformation.SignedAttributes,然后空引用导致SecureMimeDigitalSignature (SignerInformation signerInfo, X509Certificate certificate)成为也null

答案 1 :(得分:0)

这是Mime 2.1.4中的合法错误,现已在https://www.myget.org/feed/mimekit/package/nuget/MimeKit的内部版本2.1.4.9中修复。