https请求ssl认证失败

发布时间 2023-04-07 09:40:18作者: 丝絮

问题描述:程序需使用第三方进行开票,第三方服务提供httpspost请求接口,并提供基于pfx证书的安全认证。原始服务基于.netcore3.1,dockerfile基础镜像是mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic,版本迭代时进行了sdk升级为.net6,基础镜像是mcr.microsoft.com/dotnet/aspnet:6.0,结果开票服务请求认证失败,错误日志是:

The SSL connection could not be established, see inner exception.,Authentication failedat System.Net.Http.ConnectHelper.EstablishSslConnectionAsync

1、 第三方服务器可以正常连接并开票(生产环境一切正常),怀疑是sdk升级导致代码不兼容。

 ssl证书是双向认证的,服务器端认证正常,客户端就绕过认证尝试,HttpClientHandler加入如下代码:(问题仍然存在)

  

 2、 测试openssl是否正常安装

   Openssl version

 3、 利用curl测试https请求证书是否正常

生成个人证书的公钥和私钥:

openssl pkcs12 -clcerts -nokeys -in cert.pfx -out client.pem    #客户端个人证书的公钥  

openssl pkcs12 -nocerts -nodes -in cert.pfx -out key.pem #客户端个人证书的私钥

 1) 测试https

 curl -k --cert client.pem --key key.pem https://******/fpt-dsqz/invoice

报错误是:key too small

 2) 为了验证生成的key没有问题,重新部署一个与生产一样的服务版本,进入容器中验证证书:

  

  

  原先服务版本openssl版本较低,且ssl认证是通过的。

 1)2)对比,是openssl版本问题导致认证失败。

 在网上查了下原因,高版本的openssl要求证书key必须是2048位了,否则认为key太短,证书不安全,导致认证失败。由于证书是第三方服务提供并用于接口请求验证,只能降低openssl的版本。

 1、 更改当前docker服务的openssl版本

卸载旧版本:1. apt-get purge openssl  2. rm -rf /etc/ssl #删除配置文件

安装新版本 apt-get install openssl=package号,发现不能安装2018版本。(测试镜像改成mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim,openssl版本为2019同样认证失败)

2、 下载openssl 2018版本的源代码进行编译。

网上的编译方法基本是:先./config,make&&make install,结果总是编译失败,缺少各种文件~`(*><*)

  由于openssl版本限制,那只能基于已有该版本系统mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic镜像构造新的镜像,在该镜像中安装.net6.0的运行时,以此满足openssl的认证以及业务程序的.net6版本需求。

 1) 制作dockerfile

  (备注:RUN的脚本也是开票需要用到的)

2) 生成镜像,并基于镜像启动容器

docker build -t aspnet:base .

docker run -d -it --name aspnetbase aspnet:base /bin/bash   

进入容器中,安装.net6的运行时:apt-get install dotnet-sdk-6.0,报错如下:

报错:Unable to locate package dotnet-sdk-6.0

E: Couldn’t find any package by glob dotnet-sdk-6.0

E: Couldn’t find any package by regex dotnet-sdk-6.0

#解决方案:

wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

sudo dpkg -i packages-microsoft-prod.deb

sudo apt-get update

apt search dotnet-sdk(查询所有可用的sdk

整个sdk版本太大,只需要安装运行时即可apt-get install dotnet-runtime-6.0

3) 查看运行时的安装

进入根目标/usr/share/dotnet/shared,同时包含文件夹目录:Microsoft.AspNetCore.AppMicrosoft.NETCore.App,目录下同时包含6.0.13的运行时,可把基础镜像带的3.1运行时删除

  备注:可不必在容器中安装.net6.0的运行时,从其它还有net6.0运行时的容器中拷贝这两个文件夹,并放入相同路径,一样有效(如基础镜像:mcr.microsoft.com/dotnet/aspnet:6.0 AS base)生成的容器。

4) 将当前容器保存为镜像,作为其它服务的基础镜像.

docker commit aspnetbase(容器id) alicelxq/dotnet-sdk:6.0

业务服务dockerfile以此作为基础镜像:

FROM alicelxq/dotnet-sdk:6.0 AS base

最终应用程序服务sdk升级net6.0,同时openssl支持低版本httpsssl认证。