Web API의 SSL 작업Working with SSL in Web API

Mike Wassonby Mike Wasson

일반 HTTP를 통해 몇 가지 일반적인 인증 체계가 안전 하지 않습니다.Several common authentication schemes are not secure over plain HTTP. 특히, 기본 인증 및 폼 인증은 암호화되지 않은 자격 증명을 보냅니다.In particular, Basic authentication and forms authentication send unencrypted credentials. 보안을 유지 하려면 이러한 인증 체계에서 SSL을 사용 해야 합니다 .To be secure, these authentication schemes must use SSL. 또한 SSL 클라이언트 인증서를 사용 하 여 클라이언트를 인증할 수 있습니다.In addition, SSL client certificates can be used to authenticate clients.

서버에서 SSL 사용Enabling SSL on the Server

IIS 7 이상에서 SSL을 설정 하려면 다음을 수행 합니다.To set up SSL in IIS 7 or later:

  • 인증서를 만들거나 가져옵니다.Create or get a certificate. 테스트를 위해 자체 서명 된 인증서를 만들 수 있습니다.For testing, you can create a self-signed certificate.
  • HTTPS 바인딩을 추가 합니다.Add an HTTPS binding.

자세한 내용은 IIS 7에서 SSL을 설정 하는 방법을 참조 하십시오.For details, see How to Set Up SSL on IIS 7.

로컬 테스트를 위해 Visual Studio의 IIS Express에서 SSL을 사용 하도록 설정할 수 있습니다.For local testing, you can enable SSL in IIS Express from Visual Studio. 속성 창에서 SSL 사용True로 설정 합니다.In the Properties window, set SSL Enabled to True. SSL URL의 값을 확인 합니다. HTTPS 연결을 테스트 하려면이 URL을 사용 합니다.Note the value of SSL URL; use this URL for testing HTTPS connections.

Web API 컨트롤러에서 SSL 적용Enforcing SSL in a Web API Controller

HTTPS와 HTTP 바인딩이 모두 있는 경우 클라이언트는 여전히 HTTP를 사용 하 여 사이트에 액세스할 수 있습니다.If you have both an HTTPS and an HTTP binding, clients can still use HTTP to access the site. 일부 리소스는 HTTP를 통해 사용할 수 있으며, 다른 리소스에는 SSL이 필요 합니다.You might allow some resources to be available through HTTP, while other resources require SSL. 이 경우 작업 필터를 사용 하 여 보호 된 리소스에 대해 SSL을 요구 합니다.In that case, use an action filter to require SSL for the protected resources. 다음 코드에서는 SSL을 확인하는 Web API 인증 필터를 보여 줍니다.The following code shows a Web API authentication filter that checks for SSL:

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 작업에 이 필터를 추가합니다.Add this filter to any Web API actions that require SSL:

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

SSL 클라이언트 인증서SSL Client Certificates

SSL은 공개 키 인프라 인증서를 사용 하 여 인증을 제공 합니다.SSL provides authentication by using Public Key Infrastructure certificates. 서버에서 클라이언트에 대해 서버를 인증 하는 인증서를 제공 해야 합니다.The server must provide a certificate that authenticates the server to the client. 클라이언트에서 서버에 인증서를 제공 하는 것은 일반적이 지 않지만 클라이언트를 인증 하는 한 가지 옵션입니다.It is less common for the client to provide a certificate to the server, but this is one option for authenticating clients. SSL로 클라이언트 인증서를 사용 하려면 서명 된 인증서를 사용자에 게 배포 하는 방법이 필요 합니다.To use client certificates with SSL, you need a way to distribute signed certificates to your users. 많은 응용 프로그램 종류의 경우이 작업은 좋은 사용자 환경이 아니지만 일부 환경 (예: enterprise)에서 가능 합니다.For many application types, this will not be a good user experience, but in some environments (for example, enterprise) it may be feasible.

장점Advantages 단점Disadvantages
-인증서 자격 증명은 사용자 이름/암호 보다 강력 합니다.- Certificate credentials are stronger than username/password. -SSL은 인증, 메시지 무결성 및 메시지 암호화를 사용 하 여 완전 한 보안 채널을 제공 합니다.- SSL provides a complete secure channel, with authentication, message integrity, and message encryption. -PKI 인증서를 얻고 관리 해야 합니다.- You must obtain and manage PKI certificates. -클라이언트 플랫폼은 SSL 클라이언트 인증서를 지원 해야 합니다.- The client platform must support SSL client certificates.

클라이언트 인증서를 허용 하도록 IIS를 구성 하려면 IIS 관리자를 열고 다음 단계를 수행 합니다.To configure IIS to accept client certificates, open IIS Manager and perform the following steps:

  1. 트리 뷰에서 사이트 노드를 클릭 합니다.Click the site node in the tree view.

  2. 중간 창에서 SSL 설정 기능을 두 번 클릭 합니다.Double-click the SSL Settings feature in the middle pane.

  3. 클라이언트 인증서아래에서 다음 옵션 중 하나를 선택 합니다.Under Client Certificates, select one of these options:

    • 수락: IIS는 클라이언트의 인증서를 수락 하지만이를 요구 하지는 않습니다.Accept: IIS will accept a certificate from the client, but does not require one.
    • 필요: 클라이언트 인증서가 필요 합니다.Require: Require a client certificate. 이 옵션을 사용 하려면 "SSL 필요"도 선택 해야 합니다.(To enable this option, you must also select "Require SSL")

Applicationhost.config 파일에서 다음 옵션을 설정할 수도 있습니다.You can also set these options in the ApplicationHost.config file:

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

SslNegotiateCert 플래그는 iis가 클라이언트의 인증서를 수락 하지만이를 요구 하지 않습니다 (iis 관리자의 "수락" 옵션과 동일).The SslNegotiateCert flag means IIS will accept a certificate from the client, but does not require one (equivalent to the "Accept" option in IIS Manager). 인증서를 요구 하려면 SslRequireCert 플래그를 설정 합니다.To require a certificate, set the SslRequireCert flag. 테스트를 위해 로컬 applicationhost의 IIS Express에서 이러한 옵션을 설정할 수도 있습니다. "Documents\IISExpress\config"에 있는 구성 파일입니다.For testing, you can also set these options in IIS Express, in the local applicationhost.Config file, located in "Documents\IISExpress\config".

테스트용 클라이언트 인증서 만들기Creating a Client Certificate for Testing

테스트를 위해 makecert.exe 를 사용 하 여 클라이언트 인증서를 만들 수 있습니다.For testing purposes, you can use MakeCert.exe to create a client certificate. 먼저 테스트 루트 인증 기관을 만듭니다.First, create a test root authority:

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

Makecert.exe는 개인 키에 대 한 암호를 입력 하 라는 메시지를 표시 합니다.Makecert will prompt you to enter a password for the private key.

다음으로, 다음과 같이 테스트 서버의 "신뢰할 수 있는 루트 인증 기관" 저장소에 인증서를 추가 합니다.Next, add the certificate to the test server's "Trusted Root Certification Authorities" store, as follows:

  1. MMC를 엽니다.Open MMC.
  2. 파일에서 스냅인 추가/제거를 선택 합니다.Under File, select Add/Remove Snap-In.
  3. 컴퓨터 계정을 선택 합니다.Select Computer Account.
  4. 로컬 컴퓨터 를 선택 하 고 마법사를 완료 합니다.Select Local computer and complete the wizard.
  5. 탐색 창에서 "신뢰할 수 있는 루트 인증 기관" 노드를 확장 합니다.Under the navigation pane, expand the "Trusted Root Certification Authorities" node.
  6. 작업 메뉴에서 모든 작업을 가리킨 다음 가져오기 를 클릭 하 여 인증서 가져오기 마법사를 시작 합니다.On the Action menu, point to All Tasks, and then click Import to start the Certificate Import Wizard.
  7. 인증서 파일 (TempCA .cer)로 이동 합니다.Browse to the certificate file, TempCA.cer.
  8. 열기를 클릭 하 고 다음 을 클릭 하 여 마법사를 완료 합니다.Click Open, then click Next and complete the wizard. 암호를 다시 입력 하 라는 메시지가 표시 됩니다.(You will be prompted to re-enter the password.)

이제 첫 번째 인증서로 서명 된 클라이언트 인증서를 만듭니다.Now create a client certificate that is signed by the first certificate:

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에서 클라이언트 인증서 사용Using Client Certificates in Web API

서버 쪽에서 요청 메시지에 대해 GetClientCertificate 를 호출 하 여 클라이언트 인증서를 가져올 수 있습니다.On the server side, you can get the client certificate by calling GetClientCertificate on the request message. 클라이언트 인증서가 없는 경우 메서드는 null을 반환 합니다.The method returns null if there is no client certificate. 그렇지 않으면 X509Certificate2 인스턴스를 반환 합니다.Otherwise, it returns an X509Certificate2 instance. 이 개체를 사용 하 여 발급자 및 주체와 같은 인증서에서 정보를 가져옵니다.Use this object to get information from the certificate, such as the issuer and subject. 그런 다음 인증 및/또는 권한 부여에이 정보를 사용할 수 있습니다.Then you can use this information for authentication and/or authorization.

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