繁体   English   中英

无法建立 SSL 连接:System.Security.Authentication.AuthenticationException

[英]The SSL connection could not be established: System.Security.Authentication.AuthenticationException

我的服务器代码(在 AWS Lambda .net Core 3.1 上运行)突然停止对我的 API 服务器进行身份验证。 它已经工作多年,但今天它停止同时在生产和开发环境中工作。 我得到的错误是

System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

相关的源代码是

WebRequest httpWebRequest2 = WebRequest.Create(APIurl);
httpWebRequest2.Method = "GET";
httpWebRequest2.Accept = "application/json"
httpWebRequest2.Timeout = 60 * 1000
httpWebRequest2.Headers.Add("Authorization", _APIToken);
WebResponse response = httpWebRequest2.GetResponseAsync().Result;

我正在使用 letencrypt 来生成证书,并且对于我的开发 api url 或生产 api url 的证书都没有过期。 HTTPS 查询在我尝试过的所有其他平台上都成功。

在这一点上,我什至不知道还有什么要解决的。 我可以提供尽可能多的信息。

这是Amazon Linux 2一个问题,Lambda 函数利用它来运行其运行时环境。 截至本文发布时,Amazon Linux 2 使用 OpenSSL 1.0(特别是包openssl-1.0.2k-19.amzn2.0.6.x86_64 )。 截至今天,即 2021 年 9 月 30 日,Let's Encrypt 来自 DST Root CA X3 的旧证书已过期,其中一个怪癖是 Let's Encrypt 的默认首选证书链不再适用于 OpenSSL 1.0。

您可以解决这个问题,在指出这个帖子取决于你如何产生的让我们的加密证书。 例如,我们使用CertBot并需要传递--preferred-chain 'ISRG Root X1'参数来生成 OpenSSL 1.0 的兼容证书。

希望底层运行时环境将很快与默认链首选项兼容。

我还找到了一个临时解决方法来启动和运行 Lambda 函数。 我只设法让它在 netcoreapp3.1 运行时上运行 - 而不是 2.1 运行时。

本质上,我从Let's Encrypt下载了“正确”的中间 R3 证书

我将它添加到我的函数的项目文件夹中,将文件设置为“复制到输出目录”:

<ItemGroup>
  <None Update="lets-encrypt-r3.pem">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

在此之后,我在我的函数中添加了以下环境变量:

"SSL_CERT_FILE" = "/var/task/lets-encrypt-r3.pem"

进行此更改后,SSL 错误就消失了。 根据我的理解,SSL_CERT_FILE 环境变量将指示 OpenSSL 使用给定的证书进行验证 - 尽管它可能使用给定的证书,因此在将其推向生产之前,请在您自己的功能上对其进行测试 :-) 话虽如此,我的其中一个函数连接到 MailGun,它起作用了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM