Modified by D 的博客

.NET Core 2.1 在 Linux 下使用 HttpClient 调用 https 失败解决方法

最近新的业务服务使用 ASP.NET Core 2.1 来实现,开发环境是 Windows 正常,然后放到测试服务器 CentOS 7 也一切正常。测试通过后部署到阿里云的 CentOS 7 上,在安装完其它需要的环境后,跑其它业务一直正常,但有一个业务需要 HttpClient 调用其它 https 的 RESTful 接品报了异常,在该服务器上调用 dotnet restore 会有同样的错误

The SSL connection could not be established

网上找解决方法,.NET Core 2.1 中对 Sockets 进行重大改进,NET Core 2.1中的更高层级网络 API(包括HttpClient和Kestrel)现在基于.NET sockets.。在早期版本中,这些更高级别的API基于原生网络实现。新的实现最大的成就就是性能,它比现有的实现快得多,还有其他好处。默认 HttClient 使用了新的实现,网上解决方案把环境 DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER 将该值设置为 false 或 0,就使用 .NET Core 2 一样实现。在启动时代码中加入也可以实现同样的效果

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler"false);

但这个方案在我们的服务器上行不能,调用 HttpClient 请求 https 直接报 Segmentation fault 崩溃,啥日志也没记有

在网上找到原因,是调用了旧版 libcrypto.so.1.0.0 导致的,网上有 Debian 解决方法

apt-get remove ssl1.0.0.0

但我在服务看并没有安装有这个,只能另想办法,下面是解决的步骤

1. 用 GDB 调试 Segmentation Fault 错误位置

# gdb --args dotnet SSLTestApp.dll
(gdb) r
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib64/libthread_db.so.1".
[New Thread 0x7ffff5e2c700 (LWP 10161)]
[New Thread 0x7ffff562b700 (LWP 10162)]
[New Thread 0x7ffff4e2a700 (LWP 10163)]
[New Thread 0x7ffff42b0700 (LWP 10164)]
[New Thread 0x7ffff7e74700 (LWP 10165)]
[New Thread 0x7fffeea42700 (LWP 10166)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffeea42700 (LWP 10166)]
0x00007fffeeb9b2e0 in trust_1oidany () from /usr/local/lab/openssl/lib/libcrypto.so.1.0.0
Missing separate debuginfos, use: debuginfo-install dotnet-hostfxr-2.1-2.1.2-1.x86_64 dotnet-runtime-2.1-2.1.2-1.x86_64 


2. 原来是安装 PHP 环境时安装依赖了旧版的 libcrypto,并改了 /usr/local/lab/openssl 链接到旧版,知道就好解决了。

下载最新 openssl 源码编译

3. 将 /usr/local/lab/openssl 软链接到新的位置即可

unlink /usr/local/lab/openssl
ln -s /usr/local/ssl /usr/local/lab/openssl

发表评论

评论列表,共 0 条评论

    暂无评论