如何在 .net Core 3.1 Ubuntu 容器中使用 PEM passphrase/TrustedRoot/TLS Mutual Auth Cert/Private Key
How to use PEM passphrase/TrustedRoot/TLS Mutual Auth Cert/Private Key in a .netCore 3.1 Ubuntu container
我正在尝试在运行等效于此 Curl 命令的 Ubuntu Linux 容器中编写 .netCore 3.1 API。
正在运行 LINUX 容器卷曲命令:
curl --cacert /etc/root/trustedroot.crt --cert /etc/mutualauth/tls.crt --key /etc/mutualauth/tls.key
--header "SOAPAction:actionName" --data @test.xml https://this.is.the/instance --verbose
Enter PEM pass phrase: *****
<Success...>
我们使用 Windows 开发笔记本电脑,所以一切都以 Windows 开头。
到目前为止,我的 HttpClient 在 Windows 开发机器上使用了以下 HttpClientHandler。此代码适用于 Windows,证书在我的本地计算机和当前用户个人商店中,不适用于 Linux:
正在工作 WINDOWS HTTPCLIENTHANDLER 代码:
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
try
{
var cert = store.Certificates.Find(X509FindType.FindByThumbprint, "<<cert thumbprint here>>", true);
var handler = new HttpClientHandler
{
ClientCertificateOptions = ClientCertificateOption.Manual,
SslProtocols = SslProtocols.Tls12,
AllowAutoRedirect = false,
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
handler.ClientCertificates.Add(cert[0]);
}
catch (Exception e)
{
//Handle errors
}
finally
{
store.Close();
}
我导入的证书是.PFX格式的,据我所知,密码是在导入时输入的,Windows的代码不需要关心它。
上面提到的 Curl 命令在容器中起作用。所以按照这个逻辑,如果编码或配置正确,代码应该能够做同样的事情。如我所见,上面显示的 Curl 命令包含四个元素,我需要以某种方式在我的 HttpClientHandler 中考虑这些元素:
- 受信任的根 (CA) 证书:/etc/root/trustedroot.crt
- TLS 证书:/etc/mutualauth/tls.crt
- 私钥 - /etc/mutualauth/tls.key
- PEM 密码
几个月来我一直在研究这个问题,并且看过各种文章和堆栈溢出帖子,但是涉及 SSL 的变量和细节数量惊人,我找不到任何可以直接解决这个问题的东西以我有限的理解对我来说有意义的方式。
我还可以选择 运行 在部署时使用 Linux 脚本将 certs/keys 的 different/other 格式添加到 stores/filesystem 中容器。这就是我首先将证书和密钥放入容器的方式,因此我也可以控制我在这里可以做什么:
LINUX 配置脚本:
cp /etc/root/trustedroot.crt /usr/share/ca-certificates
cp /etc/mutualauth/tls.crt /usr/share/ca-certificates
cp /etc/mutualauth/tls.key /etc/ssl/private
echo "trustedroot.crt" >> /etc/ca-certificates.conf
echo "tls.crt" >> /etc/ca-certificates.conf
update-ca-certificates
dotnet wsdltest.dll --environment=Production --server.urls http://*:80
由于安全策略和限制,我不相信我可以将二进制 .PFX 文件放入容器中,但我绝对可以将其字符串编码的证书和密钥格式放入容器中容器。
...因此,如果有一种方法可以使用我可以从 .PFX 中提取的不同样式的证书,或者在服务器 'spins up' 时指定密码和证书以使我的代码不需要密码,那也行 - 我可能只是缺少 Linux 配置中的一些基本内容。
谁能给我指出正确的方向,以了解如何提升我的 HttpClientHandler 代码 OR Linux 配置这个 API 电话?在这一点上欢迎任何想法,这长期以来一直是我的眼中钉...非常感谢!
这不是正确的方法。
正确的方法是 NGINX 反向代理终止相互身份验证 TLS,这样 Dotnetcore 就不必这样做了。
节省一些时间,使用 NGINX!。 :D
我正在尝试在运行等效于此 Curl 命令的 Ubuntu Linux 容器中编写 .netCore 3.1 API。
正在运行 LINUX 容器卷曲命令:
curl --cacert /etc/root/trustedroot.crt --cert /etc/mutualauth/tls.crt --key /etc/mutualauth/tls.key
--header "SOAPAction:actionName" --data @test.xml https://this.is.the/instance --verbose
Enter PEM pass phrase: *****
<Success...>
我们使用 Windows 开发笔记本电脑,所以一切都以 Windows 开头。
到目前为止,我的 HttpClient 在 Windows 开发机器上使用了以下 HttpClientHandler。此代码适用于 Windows,证书在我的本地计算机和当前用户个人商店中,不适用于 Linux:
正在工作 WINDOWS HTTPCLIENTHANDLER 代码:
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
try
{
var cert = store.Certificates.Find(X509FindType.FindByThumbprint, "<<cert thumbprint here>>", true);
var handler = new HttpClientHandler
{
ClientCertificateOptions = ClientCertificateOption.Manual,
SslProtocols = SslProtocols.Tls12,
AllowAutoRedirect = false,
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
handler.ClientCertificates.Add(cert[0]);
}
catch (Exception e)
{
//Handle errors
}
finally
{
store.Close();
}
我导入的证书是.PFX格式的,据我所知,密码是在导入时输入的,Windows的代码不需要关心它。
上面提到的 Curl 命令在容器中起作用。所以按照这个逻辑,如果编码或配置正确,代码应该能够做同样的事情。如我所见,上面显示的 Curl 命令包含四个元素,我需要以某种方式在我的 HttpClientHandler 中考虑这些元素:
- 受信任的根 (CA) 证书:/etc/root/trustedroot.crt
- TLS 证书:/etc/mutualauth/tls.crt
- 私钥 - /etc/mutualauth/tls.key
- PEM 密码
几个月来我一直在研究这个问题,并且看过各种文章和堆栈溢出帖子,但是涉及 SSL 的变量和细节数量惊人,我找不到任何可以直接解决这个问题的东西以我有限的理解对我来说有意义的方式。
我还可以选择 运行 在部署时使用 Linux 脚本将 certs/keys 的 different/other 格式添加到 stores/filesystem 中容器。这就是我首先将证书和密钥放入容器的方式,因此我也可以控制我在这里可以做什么:
LINUX 配置脚本:
cp /etc/root/trustedroot.crt /usr/share/ca-certificates
cp /etc/mutualauth/tls.crt /usr/share/ca-certificates
cp /etc/mutualauth/tls.key /etc/ssl/private
echo "trustedroot.crt" >> /etc/ca-certificates.conf
echo "tls.crt" >> /etc/ca-certificates.conf
update-ca-certificates
dotnet wsdltest.dll --environment=Production --server.urls http://*:80
由于安全策略和限制,我不相信我可以将二进制 .PFX 文件放入容器中,但我绝对可以将其字符串编码的证书和密钥格式放入容器中容器。
...因此,如果有一种方法可以使用我可以从 .PFX 中提取的不同样式的证书,或者在服务器 'spins up' 时指定密码和证书以使我的代码不需要密码,那也行 - 我可能只是缺少 Linux 配置中的一些基本内容。
谁能给我指出正确的方向,以了解如何提升我的 HttpClientHandler 代码 OR Linux 配置这个 API 电话?在这一点上欢迎任何想法,这长期以来一直是我的眼中钉...非常感谢!
这不是正确的方法。
正确的方法是 NGINX 反向代理终止相互身份验证 TLS,这样 Dotnetcore 就不必这样做了。
节省一些时间,使用 NGINX!。 :D