asp.net - 使用自签名证书在不同服务器上的 Web 应用程序和 Web API 之间进行通信

标签 asp.net .net ssl iis asp.net-web-api

我的 Web 应用程序和 Web API 之间的通信有问题。 当我没有强制使用 HTTPS 时它工作正常。

对我不起作用的事情与我的自签名 SSL 证书有关。 当我通过浏览器访问它们中的任何一个时,我都会收到有关证书的警告,我可以将其添加到异常(exception)并正常查看页面。

但是,当它是网络应用程序和网络 API 之间的通信时,我只是在网络应用程序(调用方)的 POST 方法中收到此错误。

System.Net.Http.HttpRequestException:发送请求时出错。 ---> System.Net.WebException:基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。 ---> System.Security.Authentication.AuthenticationException: 根据验证程序,远程证书无效。 在 System.Net.TlsStream.EndWrite(IAsyncResult asyncResult) 在 System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar) --- 内部异常堆栈跟踪结束 --- 在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult、TransportContext& 上下文) 在 System.Net.Http.HttpClientHandler.GetRequestStreamCallback (IAsyncResult ar) --- 内部异常堆栈跟踪结束 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

现在,我设置证书的方式。

在 Web 应用程序服务器上,我在 IIS 管理器中添加了证书,然后为页面设置绑定(bind)以使用 https 和此证书。 在 Web API 服务器上,我创建了另一个证书并将其绑定(bind)到页面。

我尝试将证书从 Web 应用导出为 pfx 文件并将其复制到 Web API 服务器。然后我使用 iis 管理器导入证书,我还使用 MMC 证书管理单元 (certlm) 从 Web 应用程序导入证书 - 我将它放在受信任的根证书颁发机构中,然后放在第三方根证书颁发机构中,最后放入个人容器 - 仍然是同样的问题。

我做错了什么?

此外,很可能当我们将它们投入生产时,它们将使用“正常”的第 3 方 SSL 证书托管,所以我想如果不是自签名证书,我就不会看到这个问题?

干杯!

最佳答案

我通过如下注册全局验证回调创建了一个仅限开发的解决方法。 请注意,它基本上将验证硬编码为 true,这可能是一个安全问题。

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

在我的例子中,我已将其设置为可配置 - 默认情况下不会注册此回调,除非专门配置为这样做。

关于asp.net - 使用自签名证书在不同服务器上的 Web 应用程序和 Web API 之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43678816/

相关文章:

c# - 无法在 DOM 中保留自定义属性?

asp.net - 如何使整个 jqGrid 禁用/只读

c# - 如何列出 MVC 用户及其角色?

c# - .NET 程序集的签名

.net - 如果 ["blah"不存在,ConfigurationManager.AppSettings "blah"] 会抛出异常吗?

web-applications - 如何在 Framework 4.0 中启用 SSL 邮件设置

ssl - 使用 SSL 的 Mosquitto,为什么要生成 .csr?

asp.net - 如何使用Json发送数据并进入asp.net服务

c# - 对象初始化期间接口(interface)集合成员的奇怪行为

python - Tweepy 2.0 卡在 ssl do_handshake() 上