在我的.NET6.0应用程序中,我使用HttpClient连接到由SSL/TLS保护的远程API服务.我的应用程序所在的服务器运行在本地Windows Server 2016环境中,在该环境中,所有传出流量都需要在外部防火墙设备上列入白名单.我显式地允许到远程API端点地址的传出连接,但不允许到任何其他地址的流量.

我使用的是HttpClient的默认行为,这意味着我还没有为ServerCerficateValidationCallback属性提供自定义实现.

令我惊讶的是,到远程端点的连接工作得无懈可击,这是我没有预料到的,因为我没有将流量列入白名单,既没有到远程API的SSL证书颁发机构的CRL端点,也没有到OCSP端点.他们使用的证书是普通的商业证书.我还通过Telnet验证了我无法从运行代码的计算机连接到CRL和/或OCSP端点,

我的印象是,HttpClient在建立到远程端点的连接之前会验证服务器证书,以判断是否:

  • 它还没有过期
  • 它由其证书列在计算机的受信任根证书颁发机构证书存储中的实体颁发
  • 它的CN与域名匹配
  • 尚未通过OCSP和/或CLR达到revoked%

考虑到我的实验,后者显然不是这样.谁能向我推荐一份文档,解释HttpClient在认为到远程端点的连接是安全的时考虑了什么?

推荐答案

具有默认配置的HttpClient不会针对远程端点的CA CRL/OCSP端点判断证书是否已被吊销.

如果希望进行验证,则需要显式指定HttpClientHandler.CheckCertificateRevocationList = true

需要仔细判断此设置的性能注意事项,因为它在与远程终结点建立连接时可能会导致额外的延迟.

感谢@EVK为我指明了正确的方向

Csharp相关问答推荐

禁用AutoSuggestBox项目更改时的动画?

react 式扩展连接中的非交叉LeftDurationTimeout

向类注入一个工厂来创建一些资源是一个好的实践吗?

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

更新产品但丢失产品ASP.NET Core的形象

为什么SignalR在每个Blazor服务器应用程序启动时最多启动8个服务器?

用C#从Word文档中删除重复的节控件和文本内容控件

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

EF核心新验证属性`DeniedValues`和`StringCompison`不起作用

RabbitMQ群集的MassTransit配置问题

如何实现有条件的自定义Json转换器隐藏属性

JsonPath在Newtonsoft.Json';S实现中的赋值

实体框架-IsRequired()与OnDelete()

ReadOnlyMemory访问基础索引的替代方案

如何在Polly重试策略成功之前将HttpClient请求排队?

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

在同一个捕获中可以有多种类型的异常吗?

Visual Studio,Docker容器-容器调用:连接被拒绝

C#-如何将int引用获取到byte[]

处理方法内部过滤与外部过滤