问题描述:程序需使用第三方进行开票,第三方服务提供https的post请求接口,并提供基于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 failed,at 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.App和Microsoft.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支持低版本https的ssl认证。
标签:版本,openssl,认证,ssl,https,6.0,dotnet,镜像,sdk From: https://www.cnblogs.com/zxsn2014/p/17282706.html