【问题标题】:ASP.Net Core docker access serviceA container from serviceB container throws ssl certificate errorASP.Net Core docker 从服务容器访问服务容器抛出 ssl 证书错误
【发布时间】:2020-07-19 19:33:03
【问题描述】:

我正在开发一个具有微服务架构的 Web 应用程序。我使用 docker 和 docker-compose 来运行我的微服务。我想从前端服务访问一个 api。但它总是抛出 SSL 证书异常,这告诉我发行者没有通过 curl 验证。我从演示 MVC 应用程序中的 HttpClient 收到此错误:“根据验证过程,远程证书无效。”

我创建了一个演示项目来测试它,这里是 github 链接: https://github.com/KriszW/AccessDockerContainersFromEachOtherDemo

我知道问题出在容器内。因为我用 curl 测试了它,当我指定 --insecure 属性时它起作用了。所以我知道我的容器中的 ssl 证书有问题。

我知道我对 API 没有任何问题,因为我在 kestral 中运行它们并且它们也运行良好。

docker 容器或图像有问题。

提前感谢您的帮助,我真的不知道现在该怎么办,以及如何解决它。

我的 Web API 和 MVC 应用程序也使用最新的 .Net Core 3.1。

【问题讨论】:

  • FWIW,通过 SSL 在网络/集群内的容器/pod 之间进行通信并不常见,因为它是不必要的,只会引起额外的麻烦。您通常会让服务通过 HTTP 在彼此之间进行通信,然后终止 HTTPS,使流量从外部进入网络,例如通过 API 网关或反向代理。
  • 错误很明显 - 使用的证书无效。它们很可能是根据定义无效的自签名证书。 when i specified the --insecure attribute it worked. 那是因为证书 无效,所有客户都会抱怨,除非你告诉他们要么忽略它,要么信任它
  • 我已更新我的答案,为您提供有关如何挂载卷和配置证书的更多信息。
  • 谢谢大家。我终于设法解决了:D。我设法信任 Docker 中的证书,但我想我会坚持 Chris 的想法,因为我可以看到这是目前的最佳实践,因为我有一个 API 网关。再次非常感谢您

标签: c# asp.net-mvc docker asp.net-core ssl-certificate


【解决方案1】:

幸运的是,这是一种很容易解决的常见情况,即使不是那么简单。几年前但仍然有用的是Scott Hanselman's post on the topic。这将为您提供一些基本背景。

您的 docker-compose 或 docker run 配置将需要为证书和用户机密文件夹指定卷,以便为 SSL 证书提供密码。以下是用于开发的 docker-compose.yml 的 volumes 部分中的典型内容:

  - ${APPDATA}\ASP.NET\Https\:/root/.aspnet/https:ro
  - ${APPDATA}\Microsoft\UserSecrets\:/root/.microsoft/usersecrets:ro

无论您是否使用用户密钥,您都需要使用 PFX 密钥和证书路径来配置您的 Web 主机(例如 IIS、Kestrel 等)。请注意卷路径如何与证书路径匹配。 Kestrel 的配置如下所示:

Kestrel": {
  "Certificates": {
    "Default": {
      "Path": "/root/.aspnet/https/MyCertificate.pfx",
      "Password": "mypassword12345", // ...

}

使用 VS Docker 工具的一个直接途径是在 Visual Studio 中右键单击您的项目并添加... Docker 支持。这将创建 DOCKERFILE 并在您按下 F5 或 CTRL+F5 时让一切运行。弹出打开 dockerfiles、捕获工具发出的各种 docker 命令以及检查正在运行的容器都是熟悉其中一些技巧的有用方法。

最简单的 [ed: 第二简单] 的做法是使用卷挂载或 docker secret 将证书从主机的文件系统挂载到您的容器中。这就是您使用 Visual Studio 的工具在 Docker 上运行 .net 核心应用程序时的工作方式 - 开发证书是通过 dotnet dev-certs 生成并存储在您的用户目录中的。然后将该目录安装到您的容器中,并由您的 asp.net 核心应用程序用作 SSL 证书。

由于您(请求者)信任该证书,[ed: 并且因为它与所有容器共享],因此该证书将被视为有效,您可以继续使用!

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多