ssl 正在使用公共中间证书获取Azure函数应用程序到https(APIM)终结点调用的部分链异常

ykejflvf  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(79)

我正在尝试在Linux操作系统中运行的Azure函数应用程序(C#)中使用HttpClient进行https调用。
cert(.cer)是CA签名的中间证书(具有到根证书的链),其上载到功能应用的公共证书中,以在功能应用中使用。

下面是我用来创建HttpClient的函数应用程序代码:

static HttpClient GetHttpClient()
    {
        string certificatePath = "var/ssl/certs/certificatethumprint.der";          

        if (certificatePath == null) {
            throw new Exception("Environment Variable is null");
        }
        HttpClient httpClient = null;
        var bytes = File.ReadAllBytes(certificatePath);
        X509Certificate2 cert = new(bytes);
        handler = new HttpClientHandler();           
        handler.ClientCertificates.Add(cert);
        if (handler != null)
        {
            httpClient = new HttpClient(handler);
        }           
        return httpClient;
    }

下面是使用httpClient的代码:

static HttpClient httpClient = GetHttpClient();

 HttpRequestMessage httpWebRequest = GetHttpRequest(messageBody, log);
                HttpResponseMessage response = null;

                try {
                    response = await httpClient.SendAsync(httpWebRequest);
                }

Get HttpRequest返回带有请求参数的HttpRequest。
当我使用上面的代码时,我得到了这个异常:
http调用期间出现异常错误:无法建立SSL连接,请参阅内部异常。stackTrace:在System .NET.Http上建立异步连接(SslClientAuthenticationOptions sslOptions,HttpRequestMessage请求,布尔异步,流数据流,取消令牌取消令牌)在System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync上的(HttpRequestMessage要求,布林值异步,取消Token取消Token)(HttpRequestMessage请求,布尔异步,在System.Net.Http.HttpConnectionPool.AddHttp11上的取消令牌取消令牌)连接异步(HttpRequestMessage请求)在系统.线程.任务.任务完成源(取消)'1.等待(取消)异步在System.Net.Http.HttpConnectionPool.GetHttp11上的(取消Token取消Token)联机异步(HttpRequestMessage请求,布尔异步,在系统.Net.Http. Http连接池.发送时使用版本检测并异步重试(HttpRequestMessage请求,布尔异步,布尔doRequestAuth,取消令牌取消令牌)(HttpRequestMessage请求,布尔异步,取消令牌取消令牌)在系统.Net.Http.重定向处理程序.SendAsync(HttpRequestMessage请求,布尔异步,取消令牌取消令牌)在系统.Net.Http.HttpClient.g__Core| 83_0(HttpRequestMessage请求、HttpCompletionOption完成选项、取消令牌源cts、布尔处理cts、取消令牌源挂起请求cts、取消令牌原始取消令牌)在/opt/vsts-agent-linux-x64-2.173.0.tar.gz/_work/1/s/Function/函数应用/函数应用.cs中的函数.函数应用.方法(参数参数):第116行类型:系统发生异常。系统。安全性。身份验证。身份验证异常:由于证书链中的错误,远程证书无效:在系统.Net上的部分链。安全性。SslStream。在系统.Net上的发送验证重置信号(协议令牌消息,异常调度信息异常)。在系统.Net上的完成握手(SslAuthenticationOptions sslAuthenticationOptions)。在系统.Net上的安全性。SslStream。强制验证异步[TIO适配器](TIO适配器,布尔值receiveFirst,Byte[] reAuthenticationData,布尔值isApm)。在系统.Net上的Http。连接助手。建立SslConnectionAsync(SslClientAuthenticationOptions sslOptions,HttpRequestMessage请求,布尔异步、流数据流、取消标记(cancellationToken)
异常中的消息:
无法建立SSL连接,请参阅内部异常。---〉系统。安全。身份验证。AuthenticationException:由于证书链中的错误,远程证书无效:部分链
我不想使用下面的代码强制验证证书,因为我需要在生产环境中部署它,这不是生产环境的最佳实践:

handler = new HttpClientHandler
        {
            ClientCertificateOptions = ClientCertificateOption.Manual,
            ServerCertificateCustomValidationCallback =
            (httpRequestMessage, cert, cetChain, policyErrors) =>
            {
                return true; //Not a best practice/ not safe
            },
            SslProtocols = SslProtocols.Tls12
        };

如有任何建议/帮助,我们将不胜感激。
根据这个建议,当我没有使用任何证书从客户端进行https调用时,我得到了这个异常:

发送http请求时出错:无法建立SSL连接,请查看内部异常信息2022-11-23 19:11:56. 999 System.Net.Http.HttpRequestException:无法建立SSL连接,请参阅内部异常。---〉系统。安全。身份验证。AuthenticationException:由于证书链中的错误,远程证书无效:在系统.Net.安全性.sslStream.发送验证重置信号处的部分链(协议令牌消息,异常调度信息异常)在系统.Net.安全.SslStream.强制身份验证异步[TIO适配器](TIOAdapter适配器,布尔值为receiveFirst,Byte[] reAuthenticationData,布尔值为isApm)在系统.Net.Http.连接帮助程序.建立SSL连接异步(SslClientAuthenticationOptions sslOptions,HttpRequestMessage请求,布尔异步,流数据流,取消标记cancellationToken)---内部异常堆栈跟踪的结尾---位于System .NET.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions,HttpRequestMessage请求,布尔异步,流数据流,取消令牌取消令牌)在System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync上的(HttpRequestMessage要求,布林值异步,取消Token取消Token)(HttpRequestMessage请求,布尔异步,在System.Net.Http.HttpConnectionPool.AddHttp11上的取消令牌取消令牌)连接异步(HttpRequestMessage请求)在系统.线程.任务.任务完成源(取消)'1.等待(取消)异步在System.Net.Http.HttpConnectionPool.GetHttp11上的异步连接(HttpRequest消息)

nqwrtyyt

nqwrtyyt1#

当你连接到一个安全的服务器时,只有服务器需要一个证书。我不完全理解你用HttpClient和服务器做什么,但至少在GetHttpClient()中,我认为没有必要自己设置证书。希望这能有所帮助!

相关问题