Asp. Net - Основное приложение в docker через https - PullRequest
2 голосов
/ 17 марта 2020

Недавно мы столкнулись с требованием обслуживать наше контейнерное приложение по протоколу https в docker.

Следуя руководству Microsoft Мне удалось получить доступ к приложению-контейнеру с моего хост-компьютера. и все работало нормально, включая SSL.

Проблема возникает при попытке установить связь с приложением из среды docker. Тот же контейнер / другие контейнеры сталкиваются с проблемой невозможности проверки сертификата при попытке установить связь с приложением. Такое поведение можно наблюдать и в связанном примере приложения от Microsoft. Попытка свернуть сайт из контейнера (curl https://localhost) всегда приводит к: curl: (60) SSL certificate problem: unable to get local issuer certificate Это не проблема, определяющая c для скручивания, поскольку вызовы, использующие HttpClient, также возвращают ошибки, связанные с SSL.

Подсчитав, что это будет похоже на windows, где вам просто нужно добавить Self-Signed .pfx в ваше хранилище сертификатов, я создал самозаверяющий сертификат, используя New-SelfSignedCertificate -DnsName "localhost", "dockerDnsName", "127.0.0.1" -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date("2050-01-01")) Мне нужны и localhost, и dockerDnsName в моем сертификате SubjectAlternateName, поскольку контейнеры из сети docker будут взаимодействовать с контейнером под этим именем. Затем я добавил сертификат в доверенные root CA моего хоста.

Я следовал руководству Microsoft по добавлению pfx в контейнер, устанавливая переменные среды для Kestrel на соответствующие значения (ASPNETCORE_Kestrel__Certificates__Default__Path и ASPNETCORE_Kestrel__Certificates__Default__Password ) и загрузил контейнер.

Доступ к контейнеру через браузер с хоста все еще работал. Доступ к веб-сайту из контейнера снова привел к ошибке SSL. Затем я преобразовал .pfx в .crt внутри контейнера через openssl pkcs12 -in myRootCA.pfx -clcerts -nokeys -out myRootCA.crt, добавил полученный .crt к /usr/local/share/ca-certificates/ и запустил update-ca-certificates. Насколько я понимаю, это должно было исправить это, но я все еще получаю те же ошибки, связанные с SSL.

Редактировать: Не знаю, если это имеет какое-то значение, но это конкретное приложение обслуживается (docker -) внутри порта 5000 и сопоставление портов хосту 5000: 5000.

1 Ответ

1 голос
/ 17 марта 2020

Попробовав еще кучу раз, я снова пересмотрел весь процесс сертификации. Только на этот раз я пошел с openssl до конца.

Я кратко опишу свои шаги для тех, кто сталкивается с такой же проблемой:

Я следовал в этом посте до письмо.

Таким образом, я настроил сертификат CA, которому я могу доверять как в Windows, так и Linux (Docker) средах, называемых cacert.crt. Затем я создал запрос на подпись сертификата, как указано в связанном ответе, использовал сертификат CA, чтобы подписать его и получить действительный сертификат SSL, который называется servercert.pfx. В руководстве указаны только файлы .pem, но преобразование между форматами с помощью инструмента openssl cli очень просто.

Затем я зарегистрировался в моем контроле исходного кода и отредактировал мой dockerfile и составить файл.

Затем я установил cacert.crt в хранилище сертификатов моего локального компьютера в категории доверенных root полномочий.

В файле docker я поместил следующее прямо перед ENTRYPOINT:

COPY ["servercert.pfx", "/https/servercert.pfx"]
COPY ["cacert.crt", "/usr/local/share/ca-certificates/cacert.crt"]
RUN update-ca-certificates

В docker -compose.yml я помещаю следующее в environment:

 - ASPNETCORE_URLS=https://0.0.0.0:5000
 - ASPNETCORE_HTTPS_PORT=5000
 - ASPNETCORE_Kestrel__Certificates__Default__Password={YourPw}
 - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/servercert.pfx

Фактический номер порта, а также значение для пароля должны быть адаптированы по мере необходимости, очевидно.

Это решило все мои проблемы. Все браузеры теперь успешно переходят без ошибок SSL к https://localhost: 5000 , который обслуживает из docker. Я также могу подключиться к контейнеру docker и без проблем запустить $ curl https://localhost:5000 и $ curl https://dockerDnsName:5000. Это также исправило все проблемы с HttpClient.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...