다음을 통해 공유


.NET CLI를 사용하여 자체 서명된 인증서 생성

개발 및 테스트 시나리오를 위해 자체 서명된 인증서를 만들고 사용하는 방법에는 여러 가지가 있습니다. 이 문서에서는 dotnet dev-certs를 사용하는 방법에 대해 설명하며, 자체 서명된 인증서 외에 PowerShellOpenSSL와 같은 다른 옵션도 다룹니다.

그런 다음 컨테이너에 호스트되는 ASP.NET Core 앱 과 같은 예제를 사용하여 인증서가 로드될지 확인할 수 있습니다.

필수 조건

적절한 버전의 .NET을 설치해야 합니다 dotnet dev-certs의 경우.

이 샘플에서는 Docker 17.06 이상의 Docker 클라이언트가 필요합니다.

샘플 앱 준비

이 가이드에서는 샘플 앱을 사용하고 적절한 경우 변경합니다.

샘플 앱 Dockerfile 이 .NET 8을 사용하고 있는지 확인합니다.

호스트 OS에 따라 ASP.NET 런타임을 업데이트해야 할 수 있습니다. 예를 들어, 적절한 Windows 런타임을 대상으로 하기 위해서는 Dockerfile에서 mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtimemcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime로 변경해야 합니다.

예를 들어 Windows에서 인증서를 테스트하는 데 도움이 됩니다.

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore -r win-x64

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app -r win-x64 --self-contained false --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["aspnetapp"]

Linux에서 인증서를 테스트하는 경우 기존 Dockerfile을 사용할 수 있습니다.

aspnetapp.csproj가 적절한 대상 프레임워크를 포함하는지 확인합니다.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <!--Other Properties-->
  </PropertyGroup>

</Project>

비고

매개 변수를 사용하여 dotnet publish 배포를 트리밍 하려면 SSL 인증서를 지원하기 위해 적절한 종속성이 포함되어 있는지 확인합니다. dotnet-docker\samples\aspnetapp\aspnetapp.csproj 파일을 업데이트하여 적절한 어셈블리가 컨테이너에 포함되도록 합니다. 참조를 위해 자체 포함형 배포에 트리밍을 사용할 때 SSL 인증서를 지원할 수 있도록 .csproj 파일을 업데이트하는 방법을 확인하세요.

샘플 앱을 가리키고 있는지 확인합니다.

cd .\dotnet-docker\samples\aspnetapp

로컬로 테스트하기 위한 컨테이너를 빌드합니다.

docker build -t aspnetapp:my-sample -f Dockerfile .

자체 서명된 인증서 만들기

자체 서명된 인증서를 만들 수 있습니다.

dotnet dev-certs를 사용하여

자체 서명된 인증서를 사용하는 데 사용할 dotnet dev-certs 수 있습니다.

dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\aspnetapp.pfx -p crypticpassword
dotnet dev-certs https --trust

비고

이 경우 aspnetapp.pfx의 인증서 이름은 프로젝트 어셈블리 이름과 일치해야 합니다. crypticpassword 는 자신이 선택한 암호에 대한 스탠드인으로 사용됩니다. 콘솔에서 "유효한 HTTPS 인증서가 이미 있습니다."를 반환하는 경우 신뢰할 수 있는 인증서가 저장소에 이미 있습니다. MMC 콘솔을 사용하여 내보낼 수 있습니다.

인증서에 대한 애플리케이션 비밀을 구성합니다.

dotnet user-secrets -p aspnetapp\aspnetapp.csproj init
dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword"

비고

참고: 암호는 인증서에 사용되는 암호와 일치해야 합니다.

HTTPS용으로 구성된 ASP.NET Core를 사용하여 컨테이너 이미지를 실행합니다.

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v $env:APPDATA\microsoft\UserSecrets\:C:\Users\ContainerUser\AppData\Roaming\microsoft\UserSecrets -v $env:USERPROFILE\.aspnet\https:C:\Users\ContainerUser\AppData\Roaming\ASP.NET\Https mcr.microsoft.com/dotnet/samples:aspnetapp

애플리케이션이 시작되면 웹 브라우저에서 https://localhost:8001을(를) 방문하세요.

청소

비밀 및 인증서가 사용되지 않는 경우 반드시 정리해야 합니다.

dotnet user-secrets remove "Kestrel:Certificates:Development:Password" -p aspnetapp\aspnetapp.csproj
dotnet dev-certs https --clean

PowerShell 사용

PowerShell을 사용하여 자체 서명된 인증서를 생성할 수 있습니다. PKI 클라이언트를 사용하여 자체 서명된 인증서를 생성할 수 있습니다.

$cert = New-SelfSignedCertificate -DnsName @("contoso.com", "www.contoso.com") -CertStoreLocation "cert:\LocalMachine\My"

인증서가 생성되지만 테스트를 위해 브라우저에서 테스트하기 위해 인증서 저장소에 배치해야 합니다.

$certKeyPath = "c:\certs\contoso.com.pfx"
$password = ConvertTo-SecureString 'password' -AsPlainText -Force
$cert | Export-PfxCertificate -FilePath $certKeyPath -Password $password
$rootCert = $(Import-PfxCertificate -FilePath $certKeyPath -CertStoreLocation 'Cert:\LocalMachine\Root' -Password $password)

이 시점에서 인증서는 MMC 스냅인에서 볼 수 있어야 합니다.

WSL(Linux용 Windows 하위 시스템)에서 샘플 컨테이너를 실행할 수 있습니다.

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.pfx -v /c/certs:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

비고

볼륨 탑재를 사용하면 호스트에 따라 파일 경로를 다르게 처리할 수 있습니다. 예를 들어 WSL에서 /c/certs를 /mnt/c/certs로 바꿀 수 있습니다.

Windows용으로 이전에 빌드된 컨테이너를 사용하는 경우 실행 명령은 다음과 같습니다.

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.pfx -v c:\certs:C:\https aspnetapp:my-sample

애플리케이션이 실행되면 브라우저에서 contoso.com:8001 이동합니다.

contoso.com에서 적절한 IP 주소(예: 127.0.0.1)에 응답할 수 있도록 호스트 파일이 업데이트되었는지 확실히 합니다. 인증서가 인식되지 않는 경우 컨테이너와 함께 로드된 인증서도 호스트에서 신뢰할 수 있고 적절한 SAN/DNS 항목이 있는지 확인합니다 contoso.com.

청소

$cert | Remove-Item
Get-ChildItem $certKeyPath | Remove-Item
$rootCert | Remove-item

OpenSSL을 사용하는 경우

OpenSSL을 사용하여 자체 서명된 인증서를 만들 수 있습니다. 이 예제에서는 WSL/Ubuntu와 bash 셸을 사용합니다 OpenSSL.

이 명령은 .crt 및 .key 생성합니다.

PARENT="contoso.com"
openssl req \
-x509 \
-newkey rsa:4096 \
-sha256 \
-days 365 \
-nodes \
-keyout $PARENT.key \
-out $PARENT.crt \
-subj "/CN=${PARENT}" \
-extensions v3_ca \
-extensions v3_req \
-config <( \
  echo '[req]'; \
  echo 'default_bits= 4096'; \
  echo 'distinguished_name=req'; \
  echo 'x509_extension = v3_ca'; \
  echo 'req_extensions = v3_req'; \
  echo '[v3_req]'; \
  echo 'basicConstraints = CA:FALSE'; \
  echo 'keyUsage = nonRepudiation, digitalSignature, keyEncipherment'; \
  echo 'subjectAltName = @alt_names'; \
  echo '[ alt_names ]'; \
  echo "DNS.1 = www.${PARENT}"; \
  echo "DNS.2 = ${PARENT}"; \
  echo '[ v3_ca ]'; \
  echo 'subjectKeyIdentifier=hash'; \
  echo 'authorityKeyIdentifier=keyid:always,issuer'; \
  echo 'basicConstraints = critical, CA:TRUE, pathlen:0'; \
  echo 'keyUsage = critical, cRLSign, keyCertSign'; \
  echo 'extendedKeyUsage = serverAuth, clientAuth')

openssl x509 -noout -text -in $PARENT.crt

.pfx를 얻으려면 다음 명령을 사용합니다.

openssl pkcs12 -export -out $PARENT.pfx -inkey $PARENT.key -in $PARENT.crt

비고

.NET 5부터 Kestrel은 암호가 있는 .pfx 파일 외에도 .crt 및 PEM으로 인코딩된 .key 파일을 사용할 수 있습니다.

호스트 OS에 따라 인증서를 신뢰할 수 있어야 합니다. Linux 호스트에서 인증서를 '신뢰'하는 것은 다르며 배포판에 따라 다릅니다.

이 가이드의 목적을 위해 PowerShell을 사용하는 Windows의 예제는 다음과 같습니다.

Import-Certificate -FilePath $certKeyPath -CertStoreLocation 'Cert:\LocalMachine\Root'

WSL에서 다음 명령을 사용하여 샘플을 실행합니다.

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.crt -e ASPNETCORE_Kestrel__Certificates__Default__KeyPath=/https/contoso.com.key -v /c/path/to/certs:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

비고

WSL에서 볼륨 탑재 경로는 구성에 따라 변경될 수 있습니다.

PowerShell에서 다음 명령을 실행합니다.

docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.crt -e ASPNETCORE_Kestrel__Certificates__Default__KeyPath=c:\https\contoso.com.key -v c:\certs:C:\https aspnetapp:my-sample

애플리케이션이 실행되면 브라우저에서 contoso.com:8001 이동합니다.

contoso.com에서 적절한 IP 주소(예: 127.0.0.1)에 응답할 수 있도록 호스트 파일이 업데이트되었는지 확실히 합니다. 인증서가 인식되지 않는 경우 컨테이너와 함께 로드된 인증서도 호스트에서 신뢰할 수 있고 적절한 SAN/DNS 항목이 있는지 확인합니다 contoso.com.

청소

테스트를 완료한 후에는 자체 서명된 인증서를 정리해야 합니다.

Get-ChildItem $certKeyPath | Remove-Item

참고하십시오