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
在我的 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