Сборка .NET Core в Docker Linux-контейнере завершается неудачно из-за аутентификации SSL для Nuget - PullRequest
2 голосов
/ 28 мая 2019

Мне дали проект .NET Core для запуска в контейнере Docker Linux, чтобы выполнить сборку, кажется, все хорошо на стороне конфигурации докера, но когда я запускаю эту команду: dotnet publish -c Release -o out, я получаю аутентификацию SSLошибка ниже.

The SSL connection could not be established, see inner exception. Authentication failed because the remote party has closed the transport stream.

Я провел исследование и, по-видимому, мне показалось, что мне не хватает:

1) переменных среды Kestrel для ASPNET (согласно https://github.com/aspnet/AspNetCore.Docs/issues/6199),, который я добавляю к своему docker-compose, но я не думаю, что это проблема.

2) сертификат разработчика .pfx, поэтому я обновил свой docker-compose путем Kestrel Path кфайл сертификатов, как показано ниже.

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

2) Я экспортировал .pfx следующим образом: openssl pkcs12 -in ADPRootCertificate.pfx -out my_adp_dev.crt затем переместил его в /usr/local/share/ca-certificates/, удалил приватную часть, просто оставил в публичной части файла (* 1043)*) выполнил update-ca-certificates, и я смог увидеть 1 added, дважды проверил в файле /etc/ssl/certs/ca-certificates.crt и новый сертификат был там.

3) Снова выполнил wget https://nuget.local.com/api/v2 и не удалось.

4) Я использовал 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 ver 8 и импортировать его в IIS?.

Любые идеи приветствуются, ура.

1 Ответ

0 голосов
/ 31 мая 2019

ОТВЕТ НА СЕБЯ

Это не проблема контейнера Linux, это проблема сертификата на веб-сервере (IIS), поскольку мы используем самозаверяющие сертификатыи таким образом, сертификат всегда будет invalid certificate.Самозаверяющие сертификаты хорошо работают на стороне ОС 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, чтобы иметь некоторые действительные сертификаты для вашего Dev или тестовой среды.

Извиняюсь за ответ на этот вопрос сам, но я верю в этоСтоит поделиться своими выводами.

Надеюсь, это поможет.

...