Bagikan melalui


Membuat sertifikat yang ditandatangani sendiri dengan .NET CLI

Ada berbagai cara untuk membuat dan menggunakan sertifikat yang ditandatangani sendiri untuk skenario pengembangan dan pengujian. Artikel ini membahas penggunaan sertifikat yang ditandatangani sendiri dengan dotnet dev-certs, dan opsi lain seperti PowerShell dan OpenSSL.

Anda kemudian dapat memvalidasi bahwa sertifikat akan dimuat menggunakan contoh seperti aplikasi ASP.NET Core yang dihosting dalam kontainer.

Prasyarat

Untuk dotnet dev-certs, pastikan untuk menginstal versi .NET yang sesuai:

Sampel ini memerlukan Docker 17.06 atau yang lebih baru dari klien Docker.

Menyiapkan aplikasi sampel

Untuk panduan ini, Anda akan menggunakan aplikasi sampel dan membuat perubahan jika sesuai.

Periksa apakah aplikasi sampel Dockerfile menggunakan .NET 8.

Bergantung pada OS host, Anda mungkin perlu memperbarui runtime ASP.NET. Misalnya, untuk menargetkan runtime Windows yang sesuai, ubah mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime ke mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime di Dockerfile.

Misalnya, ini akan membantu menguji sertifikat di 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"]

Jika Anda menguji sertifikat di Linux, Anda dapat menggunakan Dockerfile yang ada.

Pastikan aspnetapp.csproj menyertakan kerangka kerja target yang sesuai:

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

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

</Project>

Catatan

Jika Anda ingin menggunakan dotnet publish parameter untuk memangkas penyebaran, pastikan dependensi yang sesuai disertakan untuk mendukung sertifikat SSL. Perbarui file dotnet-docker\samples\aspnetapp\aspnetapp.csproj untuk memastikan bahwa rakitan yang sesuai disertakan dalam kontainer. Sebagai referensi, periksa cara memperbarui file .csproj untuk mendukung sertifikat SSL saat menggunakan pemangkasan untuk penyebaran mandiri.

Pastikan Anda menunjuk ke aplikasi sampel.

cd .\dotnet-docker\samples\aspnetapp

Buat kontainer untuk pengujian secara lokal.

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

Membuat sertifikat yang ditandatangani sendiri

Anda dapat membuat sertifikat yang ditandatangani sendiri:

Dengan dotnet dev-certs

Anda dapat menggunakan dotnet dev-certs untuk bekerja dengan sertifikat yang ditandatangani sendiri.

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

Catatan

Nama sertifikat, dalam hal ini aspnetapp.pfx harus cocok dengan nama rakitan proyek. crypticpassword digunakan sebagai stand-in untuk kata sandi yang Anda pilih sendiri. Jika konsol mengembalikan "Sertifikat HTTPS yang valid sudah ada.", sertifikat tepercaya sudah ada di penyimpanan Anda. Ini dapat diekspor menggunakan Konsol MMC.

Konfigurasikan rahasia aplikasi, untuk sertifikat:

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

Catatan

Catatan: Kata sandi harus cocok dengan kata sandi yang digunakan untuk sertifikat.

Jalankan gambar kontainer dengan ASP.NET Core yang dikonfigurasi untuk HTTPS:

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

Setelah aplikasi dimulai, navigasikan ke https://localhost:8001 di browser web Anda.

Penghapusan

Jika rahasia dan sertifikat tidak digunakan, pastikan untuk membersihkannya.

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

Dengan PowerShell

Anda dapat menggunakan PowerShell untuk membuat sertifikat yang ditandatangani sendiri. Klien PKI dapat digunakan untuk menghasilkan sertifikat yang ditandatangani sendiri.

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

Sertifikat akan dibuat, tetapi untuk tujuan pengujian, harus ditempatkan di toko sertifikasi untuk pengujian di browser.

$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)

Pada titik ini, sertifikat harus dapat dilihat dari snap-in MMC.

Anda dapat menjalankan kontainer sampel di Subsistem Windows untuk Linux (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__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.pfx -v /c/certs:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

Catatan

Perhatikan bahwa dengan pemasangan volume, jalur file dapat ditangani secara berbeda berdasarkan host. Misalnya, di WSL Anda dapat mengganti /c/certs dengan /mnt/c/certs.

Jika Anda menggunakan kontainer yang dibuat sebelumnya untuk Windows, perintah jalankan akan terlihat seperti berikut ini:

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

Setelah aplikasi aktif, navigasikan ke contoso.com:8001 di browser.

Pastikan bahwa entri host diperbarui untuk contoso.com dijawab pada alamat IP yang sesuai (misalnya 127.0.0.1). Jika sertifikat tidak dikenali, pastikan bahwa sertifikat yang dimuat dengan kontainer juga dipercaya pada host, dan bahwa ada entri SAN / DNS yang sesuai untuk contoso.com.

Penghapusan

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

Dengan OpenSSL

Anda dapat menggunakan OpenSSL untuk membuat sertifikat yang ditandatangani sendiri. Contoh ini menggunakan WSL / Ubuntu dan shell bash dengan OpenSSL.

Perintah ini menghasilkan .crt dan .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

Untuk mendapatkan .pfx, gunakan perintah berikut:

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

Catatan

Mulai dari .NET 5, Kestrel dapat mengambil file .key yang dikodekan .crt dan PEM selain file .pfx dengan kata sandi.

Tergantung pada OS host, sertifikat perlu dipercaya. Pada host Linux, 'mempercayai' sertifikat berbeda dan bergantung pada distro.

Untuk tujuan panduan ini, berikut adalah contoh di Windows menggunakan PowerShell:

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

Jalankan sampel menggunakan perintah berikut di 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

Catatan

Di WSL, jalur pemasangan volume mungkin berubah tergantung pada konfigurasi.

Jalankan perintah berikut ini di 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

Setelah aplikasi aktif, navigasikan ke contoso.com:8001 di browser.

Pastikan bahwa entri host diperbarui untuk contoso.com dijawab pada alamat IP yang sesuai (misalnya 127.0.0.1). Jika sertifikat tidak dikenali, pastikan bahwa sertifikat yang dimuat dengan kontainer juga dipercaya pada host, dan bahwa ada entri SAN / DNS yang sesuai untuk contoso.com.

Penghapusan

Pastikan untuk membersihkan sertifikat yang ditandatangani sendiri setelah dilakukan pengujian.

Get-ChildItem $certKeyPath | Remove-Item

Lihat juga