Web API의 SSL 작업

몇 가지 일반적인 인증 체계는 일반 HTTP를 통해 안전하지 않습니다. 특히, 기본 인증 및 폼 인증은 암호화되지 않은 자격 증명을 보냅니다. 보안을 위해 이러한 인증 체계는 SSL을 사용해야 합니다 . 또한 SSL 클라이언트 인증서를 사용하여 클라이언트를 인증할 수 있습니다.

서버에서 SSL 사용

IIS 7 이상에서 SSL을 설정하려면 다음을 수행합니다.

  • 인증서를 만들거나 가져옵니다. 테스트를 위해 자체 서명된 인증서를 만들 수 있습니다.
  • HTTPS 바인딩을 추가합니다.

자세한 내용은 IIS 7에서 SSL을 설정하는 방법을 참조하세요.

로컬 테스트의 경우 Visual Studio에서 IIS Express SSL을 사용하도록 설정할 수 있습니다. 속성 창 SSL 사용을True로 설정합니다. SSL URL 값을 확인합니다. HTTPS 연결을 테스트하려면 이 URL을 사용합니다.

속성에서 true를 사용하도록 설정된 SSL 이미지

Web API 컨트롤러에서 SSL 적용

HTTPS와 HTTP 바인딩이 모두 있는 경우 클라이언트는 여전히 HTTP를 사용하여 사이트에 액세스할 수 있습니다. HTTP를 통해 일부 리소스를 사용할 수 있도록 허용할 수 있지만 다른 리소스에는 SSL이 필요합니다. 이 경우 작업 필터를 사용하여 보호된 리소스에 대해 SSL을 요구합니다. 다음 코드에서는 SSL을 확인하는 Web API 인증 필터를 보여 줍니다.

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "HTTPS Required"
            };
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }
}

SSL이 필요한 모든 Web API 작업에 이 필터를 추가합니다.

public class ValuesController : ApiController
{
    [RequireHttps]
    public HttpResponseMessage Get() { ... }
}

SSL 클라이언트 인증서

SSL은 공개 키 인프라 인증서를 사용하여 인증을 제공합니다. 서버는 클라이언트에 서버를 인증하는 인증서를 제공해야 합니다. 클라이언트가 서버에 인증서를 제공하는 것은 일반적이지 않지만 클라이언트를 인증하는 한 가지 옵션입니다. SSL에서 클라이언트 인증서를 사용하려면 서명된 인증서를 사용자에게 배포하는 방법이 필요합니다. 많은 애플리케이션 유형의 경우 이는 좋은 사용자 환경이 아니지만 일부 환경(예: 엔터프라이즈)에서는 가능할 수 있습니다.

장점 단점
- 인증서 자격 증명은 사용자 이름/암호보다 강력합니다. - SSL은 인증, 메시지 무결성 및 메시지 암호화와 함께 완전한 보안 채널을 제공합니다. - PKI 인증서를 가져오고 관리해야 합니다. - 클라이언트 플랫폼은 SSL 클라이언트 인증서를 지원해야 합니다.

클라이언트 인증서를 수락하도록 IIS를 구성하려면 IIS 관리자를 열고 다음 단계를 수행합니다.

  1. 트리 뷰에서 사이트 노드를 클릭합니다.

  2. 가운데 창에서 SSL 설정 기능을 두 번 클릭합니다.

  3. 클라이언트 인증서에서 다음 옵션 중 하나를 선택합니다.

    • 수락: IIS는 클라이언트의 인증서를 수락하지만 인증서가 필요하지 않습니다.
    • 필요: 클라이언트 인증서가 필요합니다. (이 옵션을 사용하려면 "SSL 필요"도 선택해야 합니다.)

ApplicationHost.config 파일에서 다음 옵션을 설정할 수도 있습니다.

<system.webServer>
    <security>
        <access sslFlags="Ssl, SslNegotiateCert" />
        <!-- To require a client cert: -->
        <!-- <access sslFlags="Ssl, SslRequireCert" /> -->
    </security>
</system.webServer>

SslNegotiateCert 플래그는 IIS가 클라이언트의 인증서를 수락하지만 인증서가 필요하지 않음을 의미합니다(IIS 관리자의 "수락" 옵션과 동일). 인증서를 요구하려면 SslRequireCert 플래그를 설정합니다. 테스트를 위해 "Documents\IISExpress\config"에 있는 로컬 applicationhost.Config 파일의 IIS Express 이러한 옵션을 설정할 수도 있습니다.

테스트를 위한 클라이언트 인증서 만들기

테스트를 위해 MakeCert.exe 사용하여 클라이언트 인증서를 만들 수 있습니다. 먼저 테스트 루트 기관을 만듭니다.

makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer

Makecert는 프라이빗 키에 대한 암호를 입력하라는 메시지를 표시합니다.

다음으로, 다음과 같이 테스트 서버의 "신뢰할 수 있는 루트 인증 기관" 저장소에 인증서를 추가합니다.

  1. MMC를 엽니다.
  2. 파일에서 스냅인 추가/제거를 선택합니다.
  3. 컴퓨터 계정을 선택합니다.
  4. 로컬 컴퓨터를 선택하고 마법사를 완료합니다.
  5. 탐색 창에서 "신뢰할 수 있는 루트 인증 기관" 노드를 확장합니다.
  6. 작업 메뉴에서 모든 작업을 가리킨 다음 가져오기를 클릭하여 인증서 가져오기 마법사를 시작합니다.
  7. 인증서 파일 TempCA.cer로 이동합니다.
  8. 열기를 클릭한 다음, 다음을 클릭하고 마법사를 완료합니다. (암호를 다시 입력하라는 메시지가 표시됩니다.)

이제 첫 번째 인증서로 서명된 클라이언트 인증서를 만듭니다.

makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name" 
     -eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk

Web API에서 클라이언트 인증서 사용

서버 쪽에서 요청 메시지에서 GetClientCertificate 를 호출하여 클라이언트 인증서를 가져올 수 있습니다. 클라이언트 인증서가 없는 경우 메서드는 null을 반환합니다. 그렇지 않으면 X509Certificate2 instance 반환합니다. 이 개체를 사용하여 발급자 및 주체와 같은 인증서에서 정보를 가져옵니다. 그런 다음 인증 및/또는 권한 부여에 이 정보를 사용할 수 있습니다.

X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;