Azure Linux Web 应用程序:更改 OpenSSL 默认安全级别?

Azure Linux web app: change OpenSSL default security level?

在我的 Azure Linux 网络应用程序中,我正在尝试使用证书对外部提供商执行 API 调用。该调用失败,但在 Windows 应用程序服务计划上部署相同代码时工作正常。等效的 cURL 命令行是:

curl --cert-type p12 --cert /var/ssl/private/THUMBPRINT.p12 -X POST https://www.example.com

调用失败并出现以下错误:

curl: (58) could not load PKCS12 client certificate, OpenSSL error error:140AB18E:SSL routines:SSL_CTX_use_certificate:ca md too weak

问题是由 OpenSSL 1.1.1d 引起的,默认情况下它需要安全级别 2,并且我的证书是使用 SHA1 和 RSA 加密签名的:

openssl pkcs12 -in THUMBPRINT.p12 -nodes  | openssl x509 -noout -text | grep 'Signature Algorithm'

    Signature Algorithm: sha1WithRSAEncryption
    Signature Algorithm: sha1WithRSAEncryption

在普通 Linux VM 上,我可以编辑 /etc/ssl/openssl/cnf 来更改

CipherString = DEFAULT@SECLEVEL=2

安全级别 1,但在 Azure Linux 网络应用程序上,我对该文件所做的更改不会保留..

所以我的问题是:如何更改 Azure Web 应用程序上的 OpenSSL 安全级别?或者是否有更好的方法允许使用我的弱证书?

注意:本人不是证书颁发者,无法自行重新生成。我会与发行人核实他们是否可以重新生成它,但与此同时,如果可能的话我想继续 :)

通过与 Microsoft 支持人员的通话,我找到了解决方案。可以在 Web 应用程序容器启动时 运行 脚本,这意味着可以在启动 dotnet 应用程序之前编辑 openssl.cnf 文件。

为此,请导航到 Linux 网络应用程序的 Configuration 边栏选项卡,然后是 General settings,然后是 Startup command

Startup command 是容器启动时 运行 的命令。你可以做你想做的事,但它必须启动你的应用程序,因为它不再自动完成。

您可以通过 SSH 连接到您的 Linux 网络应用程序,然后编辑 custom_startup.sh 文件:

#!/usr/sh

# allow weak certificates (certificate signed with SHA1)
# by downgrading OpenSSL security level from 2 to 1
sed -i 's/SECLEVEL=2/SECLEVEL=1/g' /etc/ssl/openssl.cnf

# run the dotnet website
cd /home/site/wwwroot
dotnet APPLICATION_DLL_NAME.dll

相关文档可以在这里找到:https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-faq#built-in-images


但是请注意,Startup command 不适用于 Azure Functions(撰写本文时为 2020 年 5 月 19 日)。我打开了 an issue on Github.

为了解决这个问题,我最终创建了自定义 Docker 图片:

Docker网络应用程序文件:

FROM mcr.microsoft.com/appsvc/dotnetcore:3.1-latest_20200502.1

# allow weak certificates (certificate signed with SHA1)
# by downgrading OpenSSL security level from 2 to 1
RUN sed -i 's/SECLEVEL=2/SECLEVEL=1/g' /etc/ssl/openssl.cnf

DockerAzure 函数的文件:

FROM mcr.microsoft.com/azure-functions/dotnet:3.0.13614-appservice

# allow weak certificates (certificate signed with SHA1)
# by downgrading OpenSSL security level from 2 to 1
RUN sed -i 's/SECLEVEL=2/SECLEVEL=1/g' /etc/ssl/openssl.cnf