允许使用.NET应用程序在无根docker容器内注入自定义证书

问题描述 投票:0回答:1

我正在开发一个 .NET 6 应用程序,它允许用户配置与外部 LDAP 的集成(可能使用 SSL)。 我正在尝试设置一个容器映像来分发应用程序,但在允许用户在不使用卷且没有根权限的情况下将自定义证书注入正在运行的容器中时遇到了麻烦。

到目前为止,我能够使用卷和 root 权限达到预期结果:

  1. 用户需要将卷映射到包含证书的
    /usr/local/share/ca-certificates
  2. 在运行应用程序之前,容器会运行
    update-ca-certificates

是否可以允许用户注入/提供自定义证书而不使用卷(可能是环境变量?)并删除容器中的根权限?

我也愿意接受可能意味着在 .NET 应用程序上进行代码开发的解决方案,但根据我的理解,.NET LDAP 实现只是让底层本机库处理证书验证。 来源

asp.net linux docker ssl
1个回答
0
投票

我无需修改任何应用程序代码即可实现我想要的目标:

  • 定义包含证书的环境变量
    $CUSTOM_CERT_1
  • 使用脚本作为容器的启动命令,检查变量是否已定义,如果已定义,则将内容复制到文件中(例如
    /app/certs/custom_cert_1.cer
  • 执行
    c_rehash /app/certs
    ,因为 libldap 需要使用自定义证书
  • 导出变量
    LDAPTLS_CACERTDIR=/app/certs
    ,以便选取自定义证书进行 LDAPS 证书验证
  • 运行我的.NET应用程序

这样就不需要卷,也不需要 root 权限。

最终

startup.sh
脚本示例:

#!/bin/sh

mkdir -p /app/certs
found_var=false
for i in $(seq 1 9); do
  var_name="CUSTOM_CERT_$i"
  eval var_value=\$$var_name
  
  if [ ! -z "$var_value" ]; then
    found_var=true
    echo "$var_value" > /app/certs/custom_cert_$i.cer
  fi
done

if [ "$found_var" = true ]; then
  c_rehash /app/certs
  export LDAPTLS_CACERTDIR=/app/certs
fi

dotnet MyApp.dll
© www.soinside.com 2019 - 2024. All rights reserved.