Docker 镜像错误根据客户端 Web 应用程序上的验证程序,远程证书无效

如何解决Docker 镜像错误根据客户端 Web 应用程序上的验证程序,远程证书无效

我的客户端 WebApp 总是出现以下错误(作为单独的 Linux docker 镜像端口 4443 运行):

system.invalidOperationException: IDX20803: Unable to obtain configuration from: 'https://host.docker.internal:8443/.well-kNown/openid-configuration'.
---> System.IO.IOException: IDX20804: Unable to retrieve document from: 'https://host.docker.internal:8443/.well-kNown/openid-configuration'.
---> System.Net.Http.HttpRequestException: The SSL connection Could not be established,see inner exception.
---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

它连接到我的 IdentityServer4(作为单独的 Linux docker 镜像端口 4444 运行)。 在 IS4 Startup.cs 中,我创建了以下代码的证书:

...
var idpUri = configuration["AppConfig:IdentityProviderUrl"];
var dnsName = new Uri(idpUri).DnsSafeHost;
var cert = new X509Certificate2(Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(),"certificate.pfx")));
var builder = services.AddIdentityServer(options => {
      options.IssuerUri = idpUri;
   }).AddSigningCredential(cert); //A self-signed PFX certificate located in the root of the IS4 and also copied in de client app used for Kestrel cert.
...

在我的客户端 WebApp 中,我插入了以下代码来设置权限:

  string identityProviderUrl = Configuration.GetValue<string>("AppConfig:IdentityProviderUrl");
  services.AddHttpClient(AUTHORIZATION_SERVICE_CLIENT_NAME,client => {
     client.BaseAddress = new Uri(identityProviderUrl);
     client.DefaultRequestHeaders.Clear();
     client.DefaultRequestHeaders.Add(HeaderNames.Accept,"application/json");
  });
  services.AddAuthentication("Bearer") 
     .AddJwtBearer("Bearer",options => { //NOTE: I don't kNow if this is needed
            options.Authority = identityProviderUrl;
            options.TokenValidationParameters = new TokenValidationParameters {
            ValidateAudience = false
         };
      });
   services.AddAuthentication(options => {
      options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
      options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
   }).AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme,options => {
         options.Authority = identityProviderUrl;
         options.ClientId = oidcclientId;
         options.ClientSecret = oidcclientSecret;
         ...
      });

我认为我创建的证书有问题,但不在两个 docker 映像上。但是 Docker 容器都使用 HTTPS 运行,否则根本无法启动。我在这里错过了什么?

让我们按照下面评论中的建议通过 LetsEncrypt 来完成。 我下载并运行这个项目 (src:https://github.com/PKISharp/ACMESharpCore/tree/master/src/examples/ACMECLI) 设置以下属性

public string CaName { get; } = Constants.LetsEncryptStagingName;
public IEnumerable<string> Email { get; } = new string[] { "xxx@gmail.com" };
public bool AcceptTos { get; } = true;
public IEnumerable<string> Dns { get; } = new string[] { "xxx.duckdns.org" };
public (bool enabled,int? timeout) WaitForAuthz { get; } = (true,300);
public bool Finalize { get; } = true;
public string ExportPfx { get; } = @"c:\tmp\certificate.pfx";
public string ExportPfxPassword { get; } = " ";

但它仍然悬而未决,已经几天了。我不知道什么时候生效。

解决方法

您不能拥有用于 HTTPS 的自签名证书,而是获取真实的证书,或者您必须将该证书添加到客户端信任的证书存储中。

问题在于客户端不信任它在尝试建立安全通道时收到的证书。

在内部正确使用 HTTPS 是容器之间的最佳实践。

要在 ASP.NET Core 中支持 HTTPS,请参阅这篇文章:

今天我也很受欢迎从 LetsEncrypt 获得您的证书。使用它们可以让您自动创建证书。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?