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

4

我的服务器代码(运行在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;

我正在使用letsencrypt生成证书,我的开发API网址和生产API网址的证书都没有过期。在我尝试的其他所有平台上,HTTPS查询都成功了。

目前我甚至不知道还有什么可以排除故障。如果需要,我可以提供更多信息。


https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/ - rez
是的。我在与AWS支持团队升级时看到了这个问题。他说这很可能是一个平台问题,他们已经将其“升级到最高程度”,并正在与LetsEncrypt进行沟通。我现在不确定是否有什么我可以做,只能等待。 - Aaron Gayle
https://aws.amazon.com/premiumsupport/knowledge-center/lambda-lets-encrypt-certificate-error/ - Mathews
2个回答

3

我也找到了一个临时解决方案来运行Lambda函数。但我只能在netcoreapp3.1运行环境下实现它,而不能在2.1版本上实现。

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

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

<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,它也能正常工作。


3
这是一个与 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 兼容。
您可以根据 此帖子 中的说明解决此问题,具体取决于您如何生成 Let's Encrypt 证书。例如,我们使用 CertBot 并需要传递 --preferred-chain 'ISRG Root X1' 参数以生成与 OpenSSL 1.0 兼容的证书。
希望底层运行环境很快能够与默认链偏好兼容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接