linux - 由于对 Nuget 的 SSL 身份验证,docker linux 容器中的 .NET Core 构建失败

标签 linux docker .net-core nuget containers

我获得了一个在 Linux Docker 容器中运行的 .NET Core 项目来进行构建,在 docker 配置端似乎一切正常,但是当我运行此命令时:dotnet publish -c Release - o out,我收到下面的 SSL 身份验证错误。

无法建立 SSL 连接,请参阅内部异常。身份验证失败,因为远程方已关闭传输流。

我做了我的研究,显然我似乎失踪了:

  1. ASPNET 的环境变量 Kestrel(根据 https://github.com/aspnet/AspNetCore.Docs/issues/6199 ),我将其添加到我的 docker-compose 中,但我认为这不是问题所在。

  2. Developer .pfx 证书,因此我使用证书文件的 Kestrel 路径更新了我的 docker-compose,如下所示。

version: '3'
services:
  netcore:
    container_name: test_alerting_comp
    tty: true
    stdin_open: true
    image: alerting_netcore
    environment:
      - http_proxy=http://someproxy:8080
      - https_proxy=http://someproxy:8080
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+;http://+
      - ASPNETCORE_HTTPS_PORT=443
      - ASPNETCORE_Kestrel__Certificates__Default__Password="ABC" 
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/root/.dotnet/corefx/cryptography/x509stores/my
    ports:
      - "8080:80"
      - "443:443"  
    build: .
      #context: .
    security_opt:
      - seccomp:unconfined
    volumes:
      - "c:/FakePath/git/my_project/src:/app"
      - "c:/TEMP/nuget:/root"
    networks:
      - net
networks:
  net:

我重新运行 docker 容器并执行 dotnet publish -c Release -o out,结果相同。

我可以从我的主机对我的本地 NuGet 执行此操作:

A) wget https://nuget.local.com/api/v2 没有问题,

B) 但是从容器我不能。

C) 但是从容器我可以对官方 NuGet wget https://api.nuget.org/v3/index.json 执行此操作,所以我的代理肯定工作正常。

调试 SSL 问题:

给定的 .pfx 证书是一个自签名证书,它在 Windows 操作系统上工作正常(至少有人告诉我)。

  1. strace 向我展示了从哪里提取证书,如下所示

root@9b98d5447904:/app# strace wget https://nuget.local.com/api/v2 |& grep certs open("/etc/ssl/certs/ca-certificates.crt", O_RDONLY ) = 3

  1. 我按如下方式导出了 .pfx: openssl pkcs12 -in ADPRootCertificate.pfx -out my_adp_dev.crt 然后将其移动到 /usr/local/share/ca-certificates/,删除私有(private)部分,只留在文件公共(public)部分(-----BEGIN CERTIFICATE----- -----END CERTIFICATE----- )已执行 update-ca-certificates我可以看到 1 添加,在文件 /etc/ssl/certs/ca-certificates.crt 中仔细检查,新证书就在那里。

  2. 再次执行 wget https://nuget.local.com/api/v2 并失败。

  3. 我使用 OpenSSL 获取更多信息,如您所见,它不起作用,证书有一个奇怪的 CN,因为他们对主题使用了通配符,对我来说这是错误的,但他们声明 . pfx 在 Windows 操作系统中运行。

root@ce21098e9643:/usr/local/share/ca-certificates# openssl s_client -connect nuget.local.com:443 -CApath /etc/ssl/certs
CONNECTED(00000003)
depth=0 CN = *.local.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = *.local.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=\x00*\x00l\x00o\x00c\x00a\x00l\x00.\x00c\x00o\x00m
   i:/C=ES/ST=SomeCity/L=SomeCity/OU=DEV/O=ASD/CN=Development CA
---
Server certificate
-----BEGIN CERTIFICATE-----
XXXXXXXXXXX
XXXXXXXXXXX
-----END CERTIFICATE-----
subject=s:/CN=\x00*\x00l\x00o\x00c\x00a\x00l\x00.\x00c\x00o\x00m
issuer=i:/C=ES/ST=SomeCity/L=SomeCity/OU=DEV/O=ASD/CN=Development CA
---
No client certificate CA names sent
Peer signing digest: SHA1
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1284 bytes and written 358 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-SHA384
    Session-ID: 95410000753146AAE1D313E8538972244C7B79A60DAF3AA14206417490E703F3
    Session-ID-ctx:
    Master-Key: B09214XXXXXXX0007D126D24D306BB763673EC52XXXXXXB153D310B22C341200EF013BC991XXXXXXX888C08A954265623
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1558993408
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
    Extended master secret: yes
---

我不知道我面临的是什么问题,但似乎是:

A) 自签名的 .pfx 配置错误,现在它在 Linux 中使用它不能正常工作。

B) 我需要在容器中进行一些我不知道的配置。

我还应该做什么?

我正在考虑创建其他证书以供 Linux 主机使用。

使用 OpenSSL 为 IIS 版本 8 创建另一个自签名证书并将其导入 IIS 是否可行?

欢迎任何想法,干杯。

最佳答案

self 回答

这不是 Linux 容器问题,这是 Web 服务器 (IIS) 中的证书问题,因为我们使用的是自签名证书,这样证书将始终是 无效证书。自签名证书在 Windows 操作系统端工作正常,与无效错误无关。 当然,自签名证书仅适用于测试环境。

在 Linux 操作系统中,当您尝试从 NuGet 中提取包时,您将收到以下错误,因为:

1) 证书确实无效,并且

2) 因为显然没有忽略来自 Linux 端的无效证书的选项。

The SSL connection could not be established, see inner exception.
The remote certificate is invalid according to the validation procedure.

解决方案 是您在公司环境中工作,向系统管理员请求一个正确的签名证书,为此您从您的网络服务器生成一个 CSR,在我的例子中是 IIS,然后通过它给他们,所以他们会发回给你一个 .cer 文件来安装在那个网络服务器上。

我尝试做的另一个选择但由于我公司环境的限制我不能,是创建一个假的 CA(使用 OpenSSL),然后你自己签署 CSR为您的开发或测试环境准备一些有效证书。

很抱歉自己回答这个问题,但我相信分享我的发现是值得的。

希望对您有所帮助。

关于linux - 由于对 Nuget 的 SSL 身份验证,docker linux 容器中的 .NET Core 构建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56347153/

相关文章:

linux - linux 中的 cat * 命令

python - Type-ast(setup.py)的构建轮:状态为 'error'

c# - 如何替换 ASP.NET Core View 类的 "Request"类方法?

java - bash:命令替换:意外标记附近的语法错误 `|'

linux - 如何在 Linux 中使用 curl 中的本地文件而不是远程文件 URL

linux - 通过 SSH 将变量传递给远程脚本

mysql - Sequel Pro 使用 Docker Mysql 容器出现 'Connection failed!' 错误

java - 减慢代码速度?

azure - 如何创建 GitHub 工作流程以将 Azure 容器组部署到 ACI?

c# - .NET Core 2.0 正则表达式超时死锁