El código de mi servidor (que se ejecuta en un AWS Lambda .net Core 3.1) de repente dejó de autenticarse con mi servidor API. Ha estado funcionando durante años, pero hoy dejó de funcionar tanto en entornos de producción como de desarrollo simultáneamente. Los errores que estoy recibiendo son
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.El código fuente relevante es
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;Estoy usando letsencrypt para generar certificados, y ninguno de los certificados (para mi URL de API de desarrollo o URL de API de producción) ha caducado. Las consultas HTTPS tienen éxito en todas las demás plataformas que he probado.
En este punto, ni siquiera sé qué más solucionar. Puedo dar tanta más información como sea necesario.
Este es un problema con Amazon Linux 2 que las funciones de Lambda utilizan para ejecutar sus entornos de tiempo de ejecución. A partir de esta publicación, Amazon Linux 2 utiliza OpenSSL 1.0 (específicamente el paquete openssl-1.0.2k-19.amzn2.0.6.x86_64 ). A partir de hoy, 30 de septiembre de 2021, el certificado anterior de Let's Encrypt de DST Root CA X3 venció y una peculiaridad de esto es que la cadena de certificados preferida predeterminada de Let's Encrypt ya no funciona con OpenSSL 1.0.
Puede solucionar este problema como se indica en esta publicación , según cómo haya generado sus certificados de Let's Encrypt. Por ejemplo, utilizamos CertBot y necesitábamos pasar el --preferred-chain 'ISRG Root X1' para generar un certificado compatible para OpenSSL 1.0.
Con suerte, el entorno de tiempo de ejecución subyacente será compatible pronto con la preferencia de cadena predeterminada.
También encontré una solución temporal para poner en funcionamiento las funciones de Lambda. Solo logré que funcione en el tiempo de ejecución netcoreapp3.1, no en el 2.1.
Esencialmente, fui y descargué el certificado R3 intermedio "correcto" de Let's Encrypt
Lo agregué a las carpetas de proyecto de mis funciones, configuré el archivo para que se "copie en el directorio de salida":
<ItemGroup> <None Update="lets-encrypt-r3.pem"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>Después de esto, agregué la siguiente variable de entorno a mi función:
"SSL_CERT_FILE" = "/var/task/lets-encrypt-r3.pem"Al hacer este cambio, los errores de SSL desaparecieron. Según tengo entendido, la variable de entorno SSL_CERT_FILE le indicará a OpenSSL que use el certificado dado para la validación, aunque es posible que solo use el certificado dado, así que pruébelo en sus propias funciones antes de enviarlo a producción :-) Dicho esto, uno de mis las funciones se conectan a MailGun, que funcionó