我有两个Docker图像,我正在VisualStudio2019中开发,ASP.NET,Razor,想在Raspberry Pi上运行。一个是一个调用另一个使用REST的网站。
在通过Visual运行对接器编写测试时,当我尝试从一个容器发送到另一个容器时,会出现以下错误:
AuthenticationException:由于证书链中的错误: PartialChain,远程证书无效
我一直试图使用mkcert来缓解我遇到的所有证书和信任问题,但我仍然感到困惑,而且设置越来越复杂,证书随着我的尝试而激增。
我知道有一个ASP.NET开发人员证书,但是当我部署到Raspberry Pi时,我是否可以使用它,我不知道。
在我的本地网络上,计算机和一些码头集装箱之间的HTTPS真的会这么难吗?
发布于 2021-11-01 19:58:03
我已经测试了我的网络中的两个Docker容器之间的一种方法--但是也应该从网络中的任何客户端到托管在容器中的服务器工作。
在托管服务器容器的PI上创建证书:
mkdir -p /tmp/certs
export CERTPASS=$(pwgen)
echo $CERTPASS >/tmp/certs/myservercert.txt
openssl req -x509 \
-passout env:CERTPASS \
-subj "/CN=server.my.net" \
-newkey rsa:4096 \
-keyout /tmp/certs/familyboardkey.pem \
-out /tmp/certs/myservercert.pem \
-days 365
openssl pkcs12 -export \
-out /tmp/certs/myservercert.pfx \
-inkey /tmp/certs/familyboardkey.pem \
-in /tmp/certs/myservercert.pem \
-passin env:CERTPASS \
-passout env:CERTPASS
openssl pkcs12 -in /tmp/certs/myservercert.pfx \
-passin env:CERTPASS \
-clcerts -nokeys -out /tmp/certs/myservercert.crt使用安装的证书文件夹启动服务器:
docker run -d \
--name myserver \
-p 5001:5001 \
-p 5000:5000 \
-e ASPNETCORE_Kestrel__Certificates__Default__Password="$(cat /tmp/certs/myservercert.txt)" \
-e ASPNETCORE_Kestrel__Certificates__Default__Path="/tmp/certs/myservercert.pfx" \
--mount type=bind,source=/tmp/certs/,target=/tmp/certs/ \
--restart always \
myserver对于我的服务器https://github.com/KaiWalter/familyboard-aspnetcore,我创建了这个简单的测试控制台客户机:
using System.Net.Http.Json;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
var certificateName = System.Environment.GetEnvironmentVariable("CERTNAME");
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
handler.SslProtocols = SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate2(certificateName));
var client = new HttpClient(handler);
var responseHttp = await client.GetFromJsonAsync<DateFormatInfo>("http://server.my.net:5000/api/calendar/dateformatinfo");
Console.WriteLine($"MonthNames: {responseHttp.MonthNames.Count}");
Console.WriteLine($"WeekDayNames: {responseHttp.WeekDayNames.Count}");
var responseHttps = await client.GetFromJsonAsync<DateFormatInfo>("https://server.my.net:5001/api/calendar/dateformatinfo");
Console.WriteLine($"MonthNames: {responseHttps.MonthNames.Count}");
Console.WriteLine($"WeekDayNames: {responseHttps.WeekDayNames.Count}");
public class DateFormatInfo
{
public List<string> MonthNames { get; set; }
public List<string> WeekDayNames { get; set; }
}需要行handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;来克服自签名证书的System.Security.Authentication.AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot。
docker run -it --network host \
-e CERTNAME="/tmp/certs/myservercert.crt" \
--mount type=bind,source=/tmp/certs/,target=/tmp/certs/ \
myclient这对你有意义吗?
https://stackoverflow.com/questions/69786528
复制相似问题