Azure 앱 Service의 코드에서 TLS/SSL 인증서 사용

애플리케이션 코드에서 App Service추가하는 퍼블릭 또는 프라이빗 인증서에 액세스할 수 있습니다. 앱 코드는 클라이언트 역할을 하며 인증서 인증을 필요로 하는 외부 서비스에 액세스하거나 암호화 작업을 수행해야 할 수 있습니다. 이 방법 가이드에서는 애플리케이션 코드에서 퍼블릭 또는 프라이빗 인증서를 사용하는 방법을 보여 줍니다.

코드에서 인증서를 사용하는 이 방법은 App Service에서 TLS 기능을 사용하므로 앱이 기본 계층 이상이어야 합니다. 앱이 무료 또는 공유 계층에 있는 경우 앱 리포지토리에 인증서 파일을 포함할 수 있습니다.

App Service에서 TLS/SSL 인증서를 관리할 수 있도록 하면 인증서와 애플리케이션 코드를 별도로 기본 확인하고 중요한 데이터를 보호할 수 있습니다.

필수 조건

이 방법 가이드를 따르려면 다음을 수행합니다.

지문 찾기

Azure Portal의 왼쪽 메뉴에서 App Services><app-name>을 선택합니다.

앱의 왼쪽 탐색 영역에서 인증서를 선택한 다음, 사용자 고유의 인증서 가져오기(.pfx) 또는 공개 키 인증서(.cer)를 선택합니다.

사용할 인증서를 찾아 지문을 복사합니다.

Copy the certificate thumbprint

인증서에 액세스할 수 있도록 설정

앱 코드에서 인증서에 액세스하려면 Cloud Shell에서 다음 명령을 실행하여 WEBSITE_LOAD_CERTIFICATES 앱 설정에 해당 지문을 추가합니다.

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_CERTIFICATES=<comma-separated-certificate-thumbprints>

모든 인증서에 액세스할 수 있도록 하려면 값을 *로 설정합니다.

참고 항목

설정*되면 WEBSITE_LOAD_CERTIFICATES 이전에 추가된 모든 인증서가 애플리케이션 코드에 액세스할 수 있습니다. 나중에 앱에 인증서를 추가하는 경우 앱을 다시 시작하여 앱에 액세스할 수 있는 새 인증서를 만듭니다. 자세한 내용은 인증서를 업데이트(갱신)하는 경우를 참조하세요.

Windows 앱에서 인증서 로드

WEBSITE_LOAD_CERTIFICATES 앱 설정을 사용하면 현재 사용자\내 Windows 인증서 저장소의 Windows 호스팅 앱에서 지정된 인증서에 액세스할 수 있습니다.

C# 코드에서는 인증서 지문으로 인증서에 액세스합니다. 다음 코드는 E661583E8FABEF4C0BEF694CBC41C28FB81CD870 지문으로 인증서를 로드합니다.

using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;

string certThumbprint = "E661583E8FABEF4C0BEF694CBC41C28FB81CD870";
bool validOnly = false;

using (X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
  certStore.Open(OpenFlags.ReadOnly);

  X509Certificate2Collection certCollection = certStore.Certificates.Find(
                              X509FindType.FindByThumbprint,
                              // Replace below with your certificate's thumbprint
                              certThumbprint,
                              validOnly);
  // Get the first cert with the thumbprint
  X509Certificate2 cert = certCollection.OfType<X509Certificate2>().FirstOrDefault();

  if (cert is null)
      throw new Exception($"Certificate with thumbprint {certThumbprint} was not found");

  // Use certificate
  Console.WriteLine(cert.FriendlyName);
  
  // Consider to call Dispose() on the certificate after it's being used, available in .NET 4.6 and later
}

Java 코드에서는 주체 일반 이름 필드를 사용하여 "Windows-MY" 저장소에서 인증서에 액세스합니다(공개 키 인증서 참조). 다음 코드는 프라이빗 키 인증서를 로드하는 방법을 보여줍니다.

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.PrivateKey;

...
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null); 
Certificate cert = ks.getCertificate("<subject-cn>");
PrivateKey privKey = (PrivateKey) ks.getKey("<subject-cn>", ("<password>").toCharArray());

// Use the certificate and key
...

Windows 인증서 저장소에 대한 지원이 부족하거나 지원하지 않는 언어는 파일에서 인증서 로드를 참조하세요.

파일에서 인증서 로드

수동으로 업로드하는 인증서 파일을 로드해야 하는 경우 Git 대신 FTPS를 사용하여 인증서를 업로드하는 것이 좋습니다. 개인 인증서와 같은 중요한 데이터를 소스 제어에서 벗어나지 않도록 해야 합니다.

참고 항목

파일에서 인증서를 로드하는 경우에도 Windows의 ASP.NET 및 ASP.NET Core는 인증서 저장소에 액세스해야 합니다. Windows .NET 앱에서 인증서 파일을 로드하려면 Cloud Shell에서 다음 명령을 사용하여 현재 사용자 프로필을 로드합니다.

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_USER_PROFILE=1

코드에서 인증서를 사용하는 이 방법은 App Service에서 TLS 기능을 사용하므로 앱이 기본 계층 이상이어야 합니다.

다음 C# 예제에서는 앱의 상대 경로에서 공용 인증서를 로드합니다.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

...
var bytes = File.ReadAllBytes("~/<relative-path-to-cert-file>");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

Node.js, PHP, Python 또는 Java의 파일에서 TLS/SSL 인증서를 로드하는 방법을 보려면 해당 언어 또는 웹 플랫폼에 대한 설명서를 참조하세요.

Linux/Windows 컨테이너에서 인증서 로드

WEBSITE_LOAD_CERTIFICATES 앱 설정을 사용하면 Windows 또는 Linux 사용자 지정 컨테이너(기본 제공 Linux 컨테이너 포함)에서 지정된 인증서에 파일로 액세스할 수 있습니다. 파일은 다음 디렉터리 아래에 있습니다.

컨테이너 플랫폼 공용 인증서 프라이빗 인증서
Windows 컨테이너 C:\appservice\certificates\public C:\appservice\certificates\private
Linux 컨테이너 /var/ssl/certs /var/ssl/private

인증서 파일 이름은 인증서 지문입니다.

참고 항목

App Service는 Windows 컨테이너에 인증서 경로를 다음 환경 변수, WEBSITE_INTERMEDIATE_CERTS_PATHWEBSITE_PUBLIC_CERTS_PATHWEBSITE_ROOT_CERTS_PATH.로 삽입합니다WEBSITE_PRIVATE_CERTS_PATH. 나중에 인증서 경로가 변경될 경우 인증서 경로를 하드 코딩하는 대신 환경 변수를 사용하여 인증서 경로를 참조하는 것이 좋습니다.

또한 Windows Server Core 컨테이너는 LocalMachine\My의 인증서 저장소에 인증서를 자동으로 로드합니다. 인증서를 로드하려면 Windows 앱에서 인증서를 로드하는 것과 동일한 패턴을 따릅니다. Windows Nano 기반 컨테이너의 경우 이러한 파일 경로를 사용하여 파일에서 직접 인증서를 로드합니다.

다음 C# 코드는 Linux 앱에서 공용 인증서를 로드하는 방법을 보여줍니다.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

...
var bytes = File.ReadAllBytes("/var/ssl/certs/<thumbprint>.der");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

다음 C# 코드는 Linux 앱에서 프라이빗 인증서를 로드하는 방법을 보여줍니다.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
...
var bytes = File.ReadAllBytes("/var/ssl/private/<thumbprint>.p12");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

Node.js, PHP, Python 또는 Java의 파일에서 TLS/SSL 인증서를 로드하는 방법을 보려면 해당 언어 또는 웹 플랫폼에 대한 설명서를 참조하세요.

인증서를 업데이트(갱신)하는 경우

인증서를 갱신하고 앱에 추가하면 액세스할 수 있도록 해야 하는 새 지문이 표시됩니다. 작동 방식은 인증서 유형에 따라 달라집니다.

공용 또는 프라이빗 인증서를 수동으로 업로드하는 경우:

  • 지문을 명시적으로 WEBSITE_LOAD_CERTIFICATES나열하는 경우 앱 설정에 새 지문을 추가합니다.
  • 설정된 *경우 WEBSITE_LOAD_CERTIFICATES 새 인증서에 액세스할 수 있도록 앱을 다시 시작합니다.

App Service 인증서와 같은 Key Vault에서 인증서갱신하는 경우 Key Vault의 일일 동기화는 갱신된 인증서와 앱을 동기화할 때 필요한 업데이트를 자동으로 수행합니다.

  • 갱신된 인증서의 이전 지문이 포함된 경우 WEBSITE_LOAD_CERTIFICATES 매일 동기화는 이전 지문을 새 지문으로 자동으로 업데이트합니다.
  • 설정된 *경우 WEBSITE_LOAD_CERTIFICATES 매일 동기화하면 새 인증서에 자동으로 액세스할 수 있습니다.

추가 리소스