>> 이전 글 참조: Docker로 ASP.NET Core SDK 3.1 앱 배포

 

Docker로 ASP.NET Core 앱을 만들때 보통 호스트 포트와 ASP.NET Core 컨테이너 서비스 포트를 매핑한다.

5000:80, 5001:443 이런 식으로.

docker-compose를 사용할 때는 아래와 같은 설정파일을 사용했다.

 

[docker-compose.yml]

version: '3.1'

...

services:
  aspnetcore-app:
    container_name: aspnetcore-app
    image: mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic
    ports:
      - 5000:80
      - 5001:443
    volumes:
      - ./publish/:/app/
      - ./appsettings.Docker.json:/app/appsettings.json
      - ./logs/:/app/logs/
    working_dir: /app
    entrypoint:
      - dotnet
      - AspnetCore.App.dll

 

그런데, 이 설정만으로는 HTTPS 서비스를 사용할 수 없다. (443이나 5001 포트로 접속해 봐도 접속이 안된다.)

물론, Startup.cs에 services.AddHttpsRedirection(); 및 services.AddHsts(); 도 넣어놔도 마찬가지.

문제는 ASP.NET Core 서비스가 HTTPS를 사용하겠다는 설정이 없는 것인데,

아래 사이트에 해결책이 나와 있다.

>> 참조: https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-3.1&tabs=visual-studio

 

Enforce HTTPS in ASP.NET Core

Learn how to require HTTPS/TLS in a ASP.NET Core web app.

docs.microsoft.com

 

바로, appsettings.json 파일에 https_port를 명시적으로 넣어주거나,

ASPNETCORE_HTTPS_PORT 환경변수를 작성하는 방법이 그것이다.

 

그런데, 이것이... 좀 골치 아프다.

위 참조 사이트도 그렇지만, 인터넷 사이트마다 설정 방법이 조금씩 다르거나 틀리게 되어 있어 제대로 설정하기가 쉽지 않다. 직접 이렇게 저렇게 시행착오를 겪어야 하는데... 바로 잡을 겸 기록을 남겨 본다.

>> 올바른 사용법 참조: https://docs.microsoft.com/en-us/aspnet/core/security/docker-compose-https?view=aspnetcore-3.1

 

Hosting ASP.NET Core image in container using docker compose with HTTPS

Learn how to host ASP.NET Core Images with Docker Compose over HTTPS

docs.microsoft.com

 

1. 개발/테스트용 인증서 발급

D:\Docker> dotnet dev-certs https -ep aspnetcore.pfx -p pwd1234!

(이렇게 하면 mmc 인증서-개인 항목에 localhost라는 인증서가 추가된다. aspnetcore.pfx 파일과 동일하다.)

 

2. 로컬 컴퓨터 루트 인증서 신뢰 처리

D:\Docker> dotnet dev-certs https -c
D:\Docker> dotnet dev-certs https -t

(-c는 --clean과 동일한 옵션이고, -t는 --trust와 동일한 옵션이다.)

 

3. docker-compose 설정 파일 수정

[docker-compose.yml]

version: '3.1'

...

services:
  aspnetcore-app:
    container_name: aspnetcore-app
    image: mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic
    ports:
      - 5000:80
      - 5001:443
    volumes:
      - ./publish/:/app/
      - ./appsettings.Docker.json:/app/appsettings.json
      - ./logs/:/app/logs/
      - ./aspnetcore.pfx:/app/aspnetcore.pfx
    working_dir: /app
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=5001
      - ASPNETCORE_Kestrel__Certificates__Default__Password=pwd1234!
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/app/aspnetcore.pfx
    entrypoint:
      - dotnet
      - AspnetCore.App.dll

 

먼저, volumes 부분에 위에서 생성한 인증서 파일을 Docker 컨테이너 내부로 매핑해서 넣어준다. (실제 파일을 복사해 넣어 주는 것보다 이렇게 volume 매핑을 해 주는 것이 훨씬 편리하다.)

다음으로는 환경변수 environment 부분에 ASPNETCORE_ 로 시작하는 환경변수 5개를 넣어준다.

절대로 환경변수 값에 따옴표(") 같은 것을 쓰지 않는다! 이것이 핵심.

그리고, 외부 호스트에서 테스트할 때는 https://localhost:5001/ 로 접속해야 하므로 ASPNETCORE_HTTPS_PORT를 443이 아닌 5001로 설정해 주는 것이 두 번째 핵심이 되겠다. (HSTS 설정에 의해 http://localhost:5000/ 으로 접속하면 자동으로 https://localhost:5001/ 로 redirection 된다.)

 

4. Docker 컨테이너 구동

D:\Docker> docker-compose up -d

(-d 옵션을 빼면 콘솔창에 디버깅 메시지가 실시간으로 쭈욱 올라온다. 오류를 발견해야 할 때 사용하면 편리하다.)

 

끝.



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]