WCF(Windows Communication Foundation) 보안을 프로그래밍하기 위해 X.509 디지털 인증서는 일반적으로 클라이언트와 서버를 인증하고, 메시지를 암호화하고, 디지털 서명하는 데 사용됩니다. 이 항목에서는 X.509 디지털 인증서 기능 및 WCF에서 사용하는 방법을 간략하게 설명하고 이러한 개념을 자세히 설명하거나 WCF 및 인증서를 사용하여 일반적인 작업을 수행하는 방법을 보여 주는 항목에 대한 링크를 포함합니다.
간단히 말해, 디지털 인증서는 공개 키 암호화를 사용하여 전자 트랜잭션에 관련된 각 당사자의 유효성을 확인하고 인증하는 디지털 인증서, 인증 기관 및 기타 등록 기관의 시스템인 PKI(공개 키 인프라)의 일부입니다. 인증 기관은 인증서를 발급하고 각 인증서에는 주체 (인증서가 발급되는 엔터티), 유효 날짜(인증서가 유효한 경우), 발급자(인증서를 발급한 엔터티) 및 공개 키와 같은 데이터가 포함된 필드 집합이 있습니다. WCF에서 이러한 각 속성은 a Claim로 처리되고 각 클레임은 ID와 권한의 두 가지 형식으로 더 나뉩니다. X.509 인증서에 대한 자세한 내용은 X.509 공개 키 인증서를 참조하세요. WCF의 클레임 및 권한 부여에 대한 자세한 내용은 ID 모델을 사용하여 클레임 및 권한 부여 관리를 참조하세요. PKI 구현에 대한 자세한 내용은 Windows Server 2012 R2 Active Directory 인증서 서비스를 사용하는 Enterprise PKI를 참조하세요.
인증서의 기본 기능은 인증서 소유자의 ID를 다른 사람에게 인증하는 것입니다. 인증서는 소유자의 공개 키를 포함하고 소유자는 프라이빗 키를 유지합니다. 공개 키를 사용하여 인증서 소유자에게 보낸 메시지를 암호화할 수 있습니다. 소유자만 프라이빗 키에 액세스할 수 있으므로 소유자만 해당 메시지의 암호를 해독할 수 있습니다.
인증서는 종종 타사 인증서 발급자인 인증 기관에서 발급해야 합니다. Windows 도메인에서는 도메인의 컴퓨터에 인증서를 발급하는 데 사용할 수 있는 인증 기관이 포함되어 있습니다.
인증서 보기
인증서를 사용하려면 인증서를 보고 해당 속성을 검사해야 하는 경우가 많습니다. 이 작업은 MMC(Microsoft Management Console) 스냅인 도구를 사용하여 쉽게 수행할 수 있습니다. 자세한 내용은 방법: MMC 스냅인을 사용하여 인증서를 보는 방법을 참조하십시오.
인증서 저장소
인증서는 상점에서 찾을 수 있습니다. 하위 매장으로 구분되는 두 개의 주요 매장 위치가 있습니다. 컴퓨터의 관리자인 경우 MMC 스냅인 도구를 사용하여 두 주 저장소를 모두 볼 수 있습니다. 관리자가 아닌 사용자는 현재 사용자 저장소만 볼 수 있습니다.
로컬 컴퓨터 저장소입니다. 여기에는 ASP.NET 같은 컴퓨터 프로세스에서 액세스하는 인증서가 포함됩니다. 이 위치를 사용하여 클라이언트에 서버를 인증하는 인증서를 저장합니다.
현재 사용자 저장소입니다. 대화형 애플리케이션은 일반적으로 컴퓨터의 현재 사용자에 대한 인증서를 여기에 배치합니다. 클라이언트 애플리케이션을 만드는 경우 일반적으로 서비스에 사용자를 인증하는 인증서를 배치합니다.
이 두 매장은 하위 매장으로 더 나뉩니다. WCF를 사용하여 프로그래밍할 때 가장 중요한 사항은 다음과 같습니다.
신뢰할 수 있는 루트 인증 기관입니다. 이 저장소의 인증서를 사용하여 이 저장소의 인증 기관 인증서로 다시 추적할 수 있는 인증서 체인을 만들 수 있습니다.
중요합니다
신뢰할 수 있는 타사 인증 기관에서 인증서가 제공되지 않더라도 로컬 컴퓨터는 이 저장소에 배치된 인증서를 암시적으로 신뢰합니다. 따라서 발급자를 완전히 신뢰하고 결과를 이해하지 않는 한 인증서를 이 저장소에 배치하지 마세요.
개인. 이 저장소는 컴퓨터 사용자와 연결된 인증서에 사용됩니다. 일반적으로 이 저장소는 신뢰할 수 있는 루트 인증 기관 저장소에 있는 인증 기관 인증서 중 하나에서 발급한 인증서에 사용됩니다. 또는 여기에서 찾은 인증서가 애플리케이션에서 자체 발급되고 신뢰할 수 있습니다.
인증서 저장소에 대한 자세한 내용은 인증서 저장소를 참조하세요.
저장소 선택
인증서를 저장할 위치를 선택하는 방법은 서비스 또는 클라이언트가 실행되는 방법과 시기에 따라 달라집니다. 다음 일반 규칙이 적용됩니다.
WCF 서비스가 Windows 서비스에서 호스트되는 경우 로컬 컴퓨터 저장소를 사용합니다. 로컬 컴퓨터 저장소에 인증서를 설치하려면 관리자 권한이 필요합니다.
서비스 또는 클라이언트가 사용자 계정으로 실행되는 애플리케이션인 경우 현재 사용자 저장소를 사용합니다.
상점들 접속
저장소는 컴퓨터의 폴더와 마찬가지로 ACL(액세스 제어 목록)으로 보호됩니다. IIS(인터넷 정보 서비스)에서 호스트하는 서비스를 만들 때 ASP.NET 프로세스는 ASP.NET 계정에서 실행됩니다. 해당 계정에는 서비스에서 사용하는 인증서가 포함된 저장소에 대한 액세스 권한이 있어야 합니다. 각 주요 저장소는 기본 액세스 목록으로 보호되지만 목록을 수정할 수 있습니다. 저장소에 액세스하기 위해 별도의 역할을 만드는 경우 해당 역할 액세스 권한을 부여해야 합니다. WinHttpCertConfig.exe 도구를 사용하여 액세스 목록을 수정하는 방법을 알아보려면 방법: 개발 중에 사용할 임시 인증서 만들기를 참조하세요.
체인 신뢰 및 인증 기관
인증서는 각 개별 인증서가 인증서를 발급한 CA에 연결된 계층 구조에서 만들어집니다. 이 링크는 CA의 인증서에 대한 링크입니다. 그런 다음 CA의 인증서는 원래 CA의 인증서를 발급한 CA에 연결됩니다. 이 프로세스는 루트 CA의 인증서에 도달할 때까지 반복됩니다. 루트 CA의 인증서는 기본적으로 신뢰할 수 있습니다.
디지털 인증서는 신뢰 체인이라고도 하는 이 계층 구조에 의존하여 엔터티를 인증하는 데 사용됩니다. 인증서를 두 번 클릭한 다음 인증서 경로 탭을 클릭하여 MMC 스냅인을 사용하여 인증서 체인을 볼 수 있습니다. 인증 기관의 인증서 체인을 가져오는 방법에 대한 자세한 내용은 방법: 서명을 확인하는 데 사용되는 인증 기관 인증서 체인 지정을 참조하세요.
비고
발급자의 인증서를 신뢰할 수 있는 루트 기관 인증서 저장소에 배치하여 모든 발급자를 신뢰할 수 있는 루트 기관으로 지정할 수 있습니다.
체인 트러스트 사용 안 함
새 서비스를 만들 때 신뢰할 수 있는 루트 인증서에서 발급되지 않은 인증서를 사용하거나 발급 인증서 자체가 신뢰할 수 있는 루트 인증 기관 저장소에 없을 수 있습니다. 개발 목적으로만 인증서에 대한 신뢰 체인을 확인하는 메커니즘을 일시적으로 사용하지 않도록 설정할 수 있습니다. 이렇게 하려면 속성을 둘 중 하나 CertificateValidationMode
또는 PeerTrust
.로 설정합니다PeerOrChainTrust
. 모드는 인증서가 자체 발급(피어 트러스트) 또는 신뢰 체인의 일부가 될 수 있음을 지정합니다. 다음 클래스 중에서 속성을 설정할 수 있습니다.
구성을 사용하여 속성을 설정할 수도 있습니다. 다음 요소는 유효성 검사 모드를 지정하는 데 사용됩니다.
사용자 지정 인증
또한 이 CertificateValidationMode
속성을 사용하면 인증서를 인증하는 방법을 사용자 지정할 수 있습니다. 기본적으로 수준은 .로 설정됩니다 ChainTrust
. 값을 사용하려면 인증서를 검증하는 데 사용되는 어셈블리 및 형식으로 Custom 속성을 설정해야 합니다. 사용자 지정 유효성 검사기를 만들려면 추상 X509CertificateValidator 클래스에서 상속해야 합니다.
사용자 지정 인증자를 만들 때 가장 중요한 것은 Validate 메서드를 재정의하는 것입니다. 사용자 지정 인증의 예는 X.509 인증서 유효성 검사기 샘플을 참조하세요. 자세한 내용은 사용자 지정 자격 증명 및 자격 증명 유효성 검사를 참조하세요.
PowerShell New-SelfSignedCertificate cmdlet을 사용하여 인증서 체인 빌드
PowerShell New-SelfSignedCertificate cmdlet은 X.509 인증서 및 프라이빗 키/공개 키 쌍을 만듭니다. 프라이빗 키를 디스크에 저장한 다음 이를 사용하여 새 인증서를 발급하고 서명할 수 있으므로 연결된 인증서의 계층 구조를 시뮬레이션할 수 있습니다. 이 cmdlet은 서비스를 개발할 때 보조 기능으로만 사용되며 실제 배포를 위한 인증서를 만드는 데 사용하면 안 됩니다. WCF 서비스를 개발할 때 다음 단계를 사용하여 New-SelfSignedCertificate cmdlet을 사용하여 신뢰 체인을 빌드합니다.
New-SelfSignedCertificate cmdlet을 사용하여 임시 루트 기관(자체 서명된) 인증서를 만듭니다. 프라이빗 키를 디스크에 저장합니다.
새 인증서를 사용하여 공개 키가 포함된 다른 인증서를 발급합니다.
루트 기관 인증서를 신뢰할 수 있는 루트 인증 기관 저장소로 가져옵니다.
단계별 지침은 방법: 개발 중에 사용할 임시 인증서 만들기를 참조하세요.
사용할 인증서는 무엇입니까?
인증서에 대한 일반적인 질문은 사용할 인증서와 그 이유입니다. 대답은 클라이언트 또는 서비스를 프로그래밍하는지 여부에 따라 달라집니다. 다음 정보는 일반적인 지침을 제공하며 이러한 질문에 대한 완전한 답변이 아닙니다.
서비스 인증서
서비스 인증서에는 클라이언트에 서버를 인증하는 기본 작업이 있습니다. 클라이언트가 서버를 인증할 때 초기 검사 중 하나는 주체 필드의 값을 서비스에 연락하는 데 사용되는 URI(Uniform Resource Identifier)와 비교하는 것입니다. 둘 다 DNS가 일치해야 합니다. 예를 들어 서비스의 URI가 http://www.contoso.com/endpoint/
면 주체 필드에 값도 포함되어 www.contoso.com
야 합니다.
필드에는 값을 나타내기 위한 초기화 접두사로 지정된 여러 값이 포함될 수 있습니다. 가장 일반적으로 "CN"은 일반적인 이름의 초기화로 사용됩니다(예: CN = www.contoso.com
).
제목 필드가 비어 있을 수도 있습니다. 이 경우 주체 대체 이름 필드에 DNS 이름 값이 포함될 수 있습니다.
또한 인증서의 의도된 목적 필드 값에는 "서버 인증" 또는 "클라이언트 인증"과 같은 적절한 값이 포함되어야 합니다.
클라이언트 인증서
클라이언트 인증서는 일반적으로 타사 인증 기관에서 발급되지 않습니다. 대신 현재 사용자 위치의 개인 저장소에는 일반적으로 "클라이언트 인증"을 목적으로 루트 기관에서 배치한 인증서가 포함됩니다. 상호 인증이 필요한 경우 클라이언트는 이러한 인증서를 사용할 수 있습니다.
온라인 해지 및 오프라인 해지
인증서 유효성
모든 인증서는 유효 기간이라고 하는 지정된 기간 동안만 유효합니다. 유효 기간은 X.509 인증서의 유효 시작일 및 유효 종료일 필드에 의해 정의됩니다. 인증하는 동안 인증서가 유효 기간 내에 있는지 여부를 확인하기 위해 인증서를 확인합니다.
인증서 해지 목록
유효 기간 동안 언제든지 인증 기관은 인증서를 해지할 수 있습니다. 인증서의 프라이빗 키 손상과 같은 여러 가지 이유로 이 문제가 발생할 수 있습니다.
이 경우 해지된 인증서에서 내림차순 체인도 유효하지 않으며 인증 절차 중에 신뢰할 수 없습니다. 해지되는 인증서를 확인하기 위해 각 발급자는 CRL(시간 및 날짜 스탬프 인증서 해지 목록 )을 게시합니다. 다음 클래스의 RevocationMode
또는 DefaultRevocationMode
속성을 X509RevocationMode 열거형 값 중 X509ClientCertificateAuthentication, X509PeerCertificateAuthentication, X509ServiceCertificateAuthentication, IssuedTokenServiceCredential 하나로 설정하여 온라인 해지 또는 오프라인 해지를 사용하여 목록을 확인할 수 있습니다. 모든 속성의 기본값은 .입니다 Online
.
또한 revocationMode
(<의) 및 >(<의) 특성을 사용하여 > 구성을 모드로 설정할 수도 있습니다.
SetCertificate 메서드
WCF에서는 서비스 또는 클라이언트가 메시지를 인증, 암호화 또는 디지털 서명하는 데 사용하는 인증서 또는 인증서 집합을 지정해야 합니다. X.509 인증서를 SetCertificate
나타내는 다양한 클래스의 메서드를 사용하여 프로그래밍 방식으로 이 작업을 수행할 수 있습니다. 다음 클래스는 이 메서드를 SetCertificate
사용하여 인증서를 지정합니다.
이 메서드는 SetCertificate
저장소 위치 및 저장소, 인증서의 필드를 지정하는 "find" 형식(x509FindType
매개 변수) 및 필드에서 찾을 값을 지정하여 작동합니다. 예를 들어 다음 코드는 인스턴스를 ServiceHost 만들고 메서드를 사용하여 클라이언트에 서비스를 인증하는 데 사용되는 서비스 인증서를 SetCertificate
설정합니다.
Uri baseAddress = new Uri("http://cohowinery.com/services");
ServiceHost sh = new ServiceHost(typeof(CalculatorService), baseAddress );
sh.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine, StoreName.My,
X509FindType.FindBySubjectName, "cohowinery.com");
Dim baseAddress As New Uri("http://cohowinery.com/services")
Dim sh As New ServiceHost(GetType(CalculatorService), baseAddress)
sh.Credentials.ServiceCertificate.SetCertificate( _
StoreLocation.LocalMachine, StoreName.My, _
X509FindType.FindBySubjectName, "cohowinery.com")
동일한 값을 가진 여러 인증서
저장소에 동일한 주체 이름을 가진 여러 인증서가 포함될 수 있습니다. 즉, x509FindType
가 FindBySubjectName 또는 FindBySubjectDistinguishedName로 지정되었을 때 둘 이상의 인증서에 동일한 값이 있으면, 필요한 인증서를 구분할 방법이 없기 때문에 예외가 발생합니다.
x509FindType
를 FindByThumbprint로 설정하여 이 문제를 완화할 수 있습니다. 지문 필드에는 저장소에서 특정 인증서를 찾는 데 사용할 수 있는 고유한 값이 포함되어 있습니다. 그러나 인증서가 해지되거나 갱신 SetCertificate
되면 지문도 사라지기 때문에 메서드가 실패하는 단점이 있습니다. 또는 인증서가 더 이상 유효하지 않으면 인증이 실패합니다. 이를 완화하는 방법은 매개 변수 x590FindType
를 FindByIssuerName 발급자의 이름으로 설정하고 지정하는 것입니다. 특정 발급자가 필요하지 않은 경우 같은 다른 X509FindType 열거형 값 FindByTimeValid중 하나를 설정할 수도 있습니다.
구성을 위한 인증서
구성을 사용하여 인증서를 설정할 수도 있습니다. 서비스를 만드는 경우 인증서를 포함한 자격 증명이 serviceBehaviors< 아래에> 지정됩니다. 클라이언트를 프로그래밍할 때 인증서는 endpointBehaviors< 아래에> 지정됩니다.
사용자 계정에 인증서 매핑
IIS 및 Active Directory의 기능은 인증서를 Windows 사용자 계정에 매핑하는 기능입니다. 이 기능에 대한 자세한 내용은 사용자 계정에 인증서 매핑을 참조하세요.
Active Directory 매핑을 사용하는 방법에 대한 자세한 내용은 디렉터리 서비스 매핑을 사용하여 클라이언트 인증서 매핑을 참조하세요.
이 기능을 사용하도록 설정하면 MapClientCertificateToWindowsAccount 클래스의 X509ClientCertificateAuthentication 속성을 true
로 설정할 수 있습니다. 구성에서 다음 코드와 같이 mapClientCertificateToWindowsAccount
요소의 < 특성을 >로 설정할 수 있습니다.
<serviceBehaviors>
<behavior name="MappingBehavior">
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="None" mapClientCertificateToWindowsAccount="true" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
X.509 인증서를 Windows 사용자 계정을 나타내는 토큰에 매핑하면 Windows 토큰을 사용하여 보호된 리소스에 액세스할 수 있으므로 권한 상승으로 간주됩니다. 따라서 도메인 정책을 사용하려면 매핑하기 전에 X.509 인증서가 해당 정책을 준수해야 합니다. SChannel 보안 패키지는 이 요구 사항을 적용합니다.
.NET Framework 3.5 이상 버전을 사용하는 경우 WCF는 인증서가 Windows 계정에 매핑되기 전에 도메인 정책을 준수하는지 확인합니다.
WCF의 첫 번째 릴리스에서는 도메인 정책을 참조하지 않고 매핑이 수행됩니다. 따라서 첫 번째 릴리스에서 실행할 때 작동하던 이전 애플리케이션이 매핑을 사용하도록 설정되고 X.509 인증서가 도메인 정책을 충족하지 않으면 실패할 수 있습니다.