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

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

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

App Service에서 TLS/SSL 인증서를 관리할 수 있는 경우 인증서 및 애플리케이션 코드를 별도로 유지 관리하여 중요한 데이터를 보호할 수 있습니다.

필수 조건

이 방법 가이드를 수행하려면 다음이 필요합니다.

지문 찾기

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

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

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

인증서 지문 복사

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

앱 코드에서 인증서에 액세스하려면 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 인증서 저장소에 있는 Current User\My의 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는 WEBSITE_PRIVATE_CERTS_PATH, WEBSITE_INTERMEDIATE_CERTS_PATH, WEBSITE_PUBLIC_CERTS_PATHWEBSITE_ROOT_CERTS_PATH 환경 변수로 인증서 경로를 Windows 컨테이너에 삽입합니다. 나중에 인증서 경로가 변경되는 경우 인증서 경로를 하드 코딩하는 대신 환경 변수를 사용하여 인증서 경로를 참조하는 것이 좋습니다.

또한 Windows Server Core 및 Windows Nano Server 컨테이너는 인증서를 LocalMachineMy의 인증서 저장소에 자동으로 로드합니다. 인증서를 로드하려면 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*로 설정된 경우 일별 동기화를 통해 새 인증서에 자동으로 액세스할 수 있습니다.

추가 리소스