首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我的码头容器和本地网络计算机之间的Https,后来部署到Raspberry Pi?

我的码头容器和本地网络计算机之间的Https,后来部署到Raspberry Pi?
EN

Stack Overflow用户
提问于 2021-10-31 11:40:52
回答 1查看 288关注 0票数 0

我有两个Docker图像,我正在VisualStudio2019中开发,ASP.NET,Razor,想在Raspberry Pi上运行。一个是一个调用另一个使用REST的网站。

在通过Visual运行对接器编写测试时,当我尝试从一个容器发送到另一个容器时,会出现以下错误:

AuthenticationException:由于证书链中的错误: PartialChain,远程证书无效

我一直试图使用mkcert来缓解我遇到的所有证书和信任问题,但我仍然感到困惑,而且设置越来越复杂,证书随着我的尝试而激增。

我知道有一个ASP.NET开发人员证书,但是当我部署到Raspberry Pi时,我是否可以使用它,我不知道。

在我的本地网络上,计算机和一些码头集装箱之间的HTTPS真的会这么难吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-01 19:58:03

我已经测试了我的网络中的两个Docker容器之间的一种方法--但是也应该从网络中的任何客户端到托管在容器中的服务器工作。

在托管服务器容器的PI上创建证书:

代码语言:javascript
复制
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

使用安装的证书文件夹启动服务器:

代码语言:javascript
复制
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,我创建了这个简单的测试控制台客户机:

代码语言:javascript
复制
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

代码语言:javascript
复制
docker run -it --network host \
    -e CERTNAME="/tmp/certs/myservercert.crt" \
    --mount type=bind,source=/tmp/certs/,target=/tmp/certs/ \
    myclient

这对你有意义吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69786528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档