Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net Core docker从serviceB容器访问serviceA容器引发ssl证书错误_C#_Asp.net Mvc_Docker_Asp.net Core_Ssl Certificate - Fatal编程技术网

C# ASP.Net Core docker从serviceB容器访问serviceA容器引发ssl证书错误

C# ASP.Net Core docker从serviceB容器访问serviceA容器引发ssl证书错误,c#,asp.net-mvc,docker,asp.net-core,ssl-certificate,C#,Asp.net Mvc,Docker,Asp.net Core,Ssl Certificate,我正在开发一个具有微服务架构的Web应用程序。我使用docker和docker compose来运行我的微服务。我想从前端服务访问api。但它总是抛出SSL证书异常,这告诉我颁发者没有通过curl验证。我在演示MVC应用程序中从HttpClient获得此错误:“根据验证过程,远程证书无效。” 我创建了一个演示项目来测试它,下面是github链接: 我知道问题出在集装箱内。因为我用curl测试了它,当我指定--unsecure属性时,它工作了。所以我知道容器中的ssl证书有问题 我知道我对API

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

我创建了一个演示项目来测试它,下面是github链接:

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

我知道我对API没有任何问题,因为我在kestral中运行它们,它们也工作得很好

docker容器或图像有问题

提前谢谢你们的帮助,伙计们,我真的不知道现在该怎么办,怎么解决


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

这是一种常见的情况,幸运的是,即使不是那么简单,也很容易解决。几年过去了,但仍然有用。这将为您提供一些基本背景

docker compose或
docker run
配置需要为证书和用户机密文件夹指定卷,以便为SSL证书提供密码。docker-compose.yml for development的
volumes
部分通常是这样的:

  - ${APPDATA}\ASP.NET\Https\:/root/.aspnet/https:ro
  - ${APPDATA}\Microsoft\UserSecrets\:/root/.microsoft/usersecrets:ro
无论您是否使用用户密码,您都需要使用PFX密钥和证书路径配置web主机(如IIS、Kestrel等)。请注意卷路径如何与证书路径匹配。红隼的配置如下所示:

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

}
使用VS Docker工具实现此目的的一个直接途径是在Visual Studio中右键单击您的项目并添加。。。码头工人支持。这将创建DockerFile,并在按F5或CTRL+F5时运行所有内容。打开DockerFile,捕获工具发出的各种
docker
命令,并检查正在运行的容器,这些都是熟悉这些技巧的有用方法

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


因为证书是由您(请求者)信任的,[ed:而且因为它与所有容器共享],所以证书将被视为有效的,您就可以开始了

这是一种常见的情况,幸运的是,即使不是那么简单,也很容易解决。几年过去了,但仍然有用。这将为您提供一些基本背景

docker compose或
docker run
配置需要为证书和用户机密文件夹指定卷,以便为SSL证书提供密码。docker-compose.yml for development的
volumes
部分通常是这样的:

  - ${APPDATA}\ASP.NET\Https\:/root/.aspnet/https:ro
  - ${APPDATA}\Microsoft\UserSecrets\:/root/.microsoft/usersecrets:ro
无论您是否使用用户密码,您都需要使用PFX密钥和证书路径配置web主机(如IIS、Kestrel等)。请注意卷路径如何与证书路径匹配。红隼的配置如下所示:

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

}
使用VS Docker工具实现此目的的一个直接途径是在Visual Studio中右键单击您的项目并添加。。。码头工人支持。这将创建DockerFile,并在按F5或CTRL+F5时运行所有内容。打开DockerFile,捕获工具发出的各种
docker
命令,并检查正在运行的容器,这些都是熟悉这些技巧的有用方法

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


因为证书是由您(请求者)信任的,[ed:而且因为它与所有容器共享],所以证书将被视为有效的,您就可以开始了

FWIW,通过SSL在网络/集群内的容器/吊舱之间进行通信并不常见,因为这是不必要的,而且只会导致像这样的额外麻烦。您通常会让服务通过HTTP相互通信,然后在流量从外部进入网络时终止HTTPS,例如通过API网关或反向代理。错误很明显-使用的证书无效。它们很可能是自签名证书,根据定义,这些证书无效
当我指定--unsecure属性时,它起作用了。
这是因为证书无效,所有客户端都会抱怨,除非您告诉他们忽略它或信任它。我已更新了我的答案,为您提供有关如何装载卷和配置证书的更多信息。谢谢大家。我最终设法解决了这个问题:D.我设法信任Docker的证书,但我认为我会坚持Chris的想法,因为正如我所见,这是目前的最佳实践,因为我有一个API网关。再次非常感谢,在网络/集群中,通过SSL在容器/吊舱之间进行通信并不常见,因为