2017-04-21 67 views
2

我有一个ASP.NET 1.1的核心应用程序设置为使用HTTPS和要求客户端证书:ASP.NET核心红隼在Linux从不提示进行客户证书

Application Main Code

我运行的应用程序Linux操作系统。

如果我将ClientCertificateMode更改为“AllowCertificates”,那么一切正常,但浏览器从不提示客户端证书。

设置了“RequireCertificate”,我仍然没有得到浏览器提示的证书,并且我在服务器端获得了下面两个例外(两个重复四次),并且没有任何响应返回浏览器:

Microsoft.AspNetCore.Server.Kestrel:错误:ConnectionFilter.OnConnection

System.AggregateException:出现一个或多个错误。 (由于远程方已关闭传输流,认证失败。)---> System.IO.IOException:由于远程方已关闭传输流,认证失败。 在System.Net.Security.SslState.StartReadFrame(字节[]缓冲液,的Int32的ReadBytes,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest asyncRequest) ---从先前的位置,其中堆栈跟踪结束异常被抛出--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult) 在System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult的结果) 在System.Net.Security.SslStream.EndAuthenticateAsServer(IAsyncResult asyncResult) at System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction,Action 1 endAction, Task 1 promise,Boolean requ iresSynchronization) ---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 从先前的位置堆栈跟踪,其中引发异常--- 结束在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务task) 在Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionFilter.d__3.MoveNext() ---内部异常堆栈跟踪结束--- --->(内部异常#0)System.IO.IOException:身份验证失败,因为远程方关闭了传输流。 at System.Net.Security.SslState.StartReadFrame(Byte [] buffer,Int32 readBytes,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest asyncRequest) ---上一个位置的堆栈跟踪结束位置异常被抛出--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult) 在System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult的结果) 在System.Net.Security.SslStream.EndAuthenticateAsServer(IAsyncResult asyncResult) at System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction,Action 1 endAction, Task 1 promise,Boolean requ iresSynchronization) ---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 从先前的位置堆栈跟踪,其中引发异常--- 结束在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务task) 在Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionFilter.d__3。的MoveNext()< ---

Microsoft.AspNetCore.Server.Kestrel:错误:ConnectionFilter.OnConnection

System.AggregateException:出现一个或多个错误。 (根据验证过程,远程证书无效。)---> System.Security.Authentication.AuthenticationException:根据验证过程,远程证书无效。 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken消息,AsyncProtocolRequest asyncRequest,ExceptionDispatchInfo除外) 在System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken消息,AsyncProtocolRequest AsyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte [] incoming,Int32 count,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ProcessReceivedBlob(Byte [] buffer,Int32 count,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReadFrame(Byte [] buffer,Int32 readBytes,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReceiveBlob(Byte [] buffer,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken消息,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.StartSendBlob(字节[]来电,的Int32计数,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState .ProcessReceivedBlob(字节[]缓冲液,计数的Int32,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.StartReadFrame(字节[]缓冲液,的Int32的ReadBytes,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.StartReceiveBlob(字节[] buffer,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte [] incoming,Int32 count,AsyncProtocolRe任务asyncRequest) 在System.Net.Security.SslState.ProcessReceivedBlob(字节[]缓冲液,计数的Int32,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.StartReadFrame(字节[]缓冲液,的Int32的ReadBytes,AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.StartSendBlob(Byte [] buffer,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte []传入,Int32计数,AsyncProtocolRequest异步请求) at System.Net.Security.SslState.ProcessReceivedBlob(Byte [] buffer,Int32 count,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReadFrame(Byte [] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest asyncRequest) ---从先前的位置堆栈跟踪的结束,其中引发异常--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult) 在System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult的结果) 在System.Net.Security.SslStream.EndAuthenticateAsServer(IAsyncResult的asyncResult) 在的System.Threading。 Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction,Action 1 endAction, Task 1诺言,布尔需要同步) ---从前一个位置的堆栈跟踪结束除了离子被抛出--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务task) 在Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionFilter.d__3。MoveNext() ---内部异常堆栈跟踪结束--- --->(内部异常#0)System.Security.Authentication.AuthenticationException:根据验证过程,远程证书无效。 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken消息,AsyncProtocolRequest asyncRequest,ExceptionDispatchInfo除外) 在System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken消息,AsyncProtocolRequest AsyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte [] incoming,Int32 count,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ProcessReceivedBlob(Byte [] buffer,Int32 count,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReadFrame(Byte [] buffer,Int32 readBytes,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReceiveBlob(Byte [] buffer,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken消息,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.StartSendBlob(字节[]来电,的Int32计数,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState .ProcessReceivedBlob(字节[]缓冲液,计数的Int32,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.StartReadFrame(字节[]缓冲液,的Int32的ReadBytes,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.StartReceiveBlob(字节[] buffer,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte [] incoming,Int32 count,AsyncProtocolRe任务asyncRequest) 在System.Net.Security.SslState.ProcessReceivedBlob(字节[]缓冲液,计数的Int32,AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.StartReadFrame(字节[]缓冲液,的Int32的ReadBytes,AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.StartSendBlob(Byte [] buffer,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte []传入,Int32计数,AsyncProtocolRequest异步请求) at System.Net.Security.SslState.ProcessReceivedBlob(Byte [] buffer,Int32 count,AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReadFrame(Byte [] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 在System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest asyncRequest) ---从先前的位置堆栈跟踪的结束,其中引发异常--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult) 在System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult的结果) 在System.Net.Security.SslStream.EndAuthenticateAsServer(IAsyncResult的asyncResult) 在的System.Threading。 Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction,Action 1 endAction, Task 1诺言,布尔需要同步) ---从前一个位置的堆栈跟踪结束除了离子被抛出--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务task) 在Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionFilter.d__3。的MoveNext()< ---

Browser Screenshot

我花了大约四个小时尝试不同的事物和周围的Googling,但我似乎无法找出问题的核心原因,因此认为我会检查是否有人在这里有一个想法。

回答

0

不知道你是否找到了解决方案,但我最近遇到了类似的问题。我发现如果您没有任何由服务器信任的CA签名的客户端证书,您将不会收到提示。我的解决方案是将根CA添加到Linux中的信任存储中,然后客户端证书将被正确发送/提示。

0

我最终使用IIS作为反向代理来获取证书信息(并进行验证),然后将它传递给Kestrel。