Discovery Security 샘플
검색 사양에서는 검색 프로세스에 참여하는 엔드포인트를 보호하도록 요구하지 않습니다. 그러나 검색 메시지의 보안을 강화하면 메시지 변경, 서비스 거부, 재생, 스푸핑 같은 다양한 형식의 공격을 완화할 수 있습니다.
DiscoveryScenario 샘플에서는 WS-Discovery 사양의 8.2단원에 설명된 압축 서명 형식을 사용하여 메시지 서명을 컴퓨팅 및 확인하는 사용자 지정 채널을 구현합니다. 샘플은 2005 검색 사양과 1.1 버전을 모두 지원합니다.
사용자 지정 채널은 검색 및 알림 엔드포인트의 기존 채널 스택 맨 위에서 적용됩니다. 이렇게 하면 서명 헤더가 보내는 모든 메시지에 적용됩니다. 서명은 받은 메시지에서 확인되며 서명이 일치하지 않거나 서명이 없는 메시지는 삭제됩니다. 메시지 서명 및 확인을 위해 이 샘플에서는 인증서를 사용합니다.
토론(Discussion)
WCF는 확장 가능하므로 사용자가 채널을 원하는 대로 사용자 지정할 수 있습니다. 이 샘플에서는 보안 채널을 빌드하는 검색 보안 바인딩 요소를 구현합니다. 보안 채널에서는 메시지 서명을 적용 및 확인하며 현재 스택의 맨 위에서 적용됩니다.
보안 바인딩 요소는 보안 채널 팩터리 및 채널 수신기를 빌드합니다.
보안 채널 팩터리
보안 채널 팩터리는 메시지 헤더에 압축 서명을 추가하는 이중 채널 또는 출력을 만듭니다. 메시지를 가능한 한 작게 유지하기 위해 압축 서명 형식이 사용됩니다. 다음 예제에서는 압축 서명의 구조를 보여 줍니다.
<d:Security ... >
[<d:Sig Scheme="xs:anyURI"
[KeyId="xs:base64Binary"]?
Refs="..."
[PrefixList]="xs:NMTOKENS"
Sig="xs:base64Binary"
... />]?
...
</d:Security>
참고 항목
2008 검색 버전 프로토콜에는 PrefixList
가 추가되었습니다.
서명을 컴퓨팅하기 위해 이 샘플에서는 확장된 서명 항목을 확인합니다. XML 서명(SignedInfo
)은 WS-Discovery 사양에서 요구하는 대로 ds
네임스페이스 접두사를 사용하여 만듭니다. 검색 및 주소 지정 네임스페이스의 본문과 모든 헤더는 서명에서 참조되므로 변경할 수 없습니다. 참조되는 각 요소가 배타적 정형화를 사용하여 변환된 다음(http://www.w3.org/2001/10/xml-exc-c14n#), SHA-1 다이제스트 값이 계산됩니다(http://www.w3.org/2000/09/xmldsig#sha1). 서명 값은 참조되는 모든 요소 및 해당 다이제스트 값에 따라 RSA 알고리즘(http://www.w3.org/2000/09/xmldsig#rsa-sha1)을 사용하여 계산됩니다.
메시지는 클라이언트에서 지정한 인증서를 사용하여 서명됩니다. 저장소 위치, 이름, 인증서 주체 이름은 바인딩 요소를 만들 때 지정해야 합니다. 압축 서명의 KeyId
는 서명 토큰의 키 식별자를 나타내며 서명 토큰의 SKI(주체 키 식별자)나 서명 토큰의 공개 키에 대한 SHA-1 해시(SKI가 없는 경우)입니다.
보안 채널 수신기
보안 채널 수신기에서는 받은 메시지의 압축 서명을 확인하는 이중 채널 또는 입력을 만듭니다. 서명을 확인하려면 메시지에 첨부된 압축 서명에 지정된 KeyId
를 사용하여 지정된 저장소에서 인증서를 선택합니다. 서명이 없거나 서명 확인에 실패한 메시지는 삭제됩니다. 보안 바인딩을 사용하기 위해 이 샘플에서는 추가된 검색 보안 바인딩 요소를 사용하여 사용자 지정 UdpDiscoveryEndpoint 및 UdpAnnouncementEndpoint를 만드는 팩터리를 정의합니다. 이 보안 엔드포인트는 검색 알림 수신기와 검색 가능한 서비스에서 사용할 수 있습니다.
샘플 세부 정보
이 샘플에는 한 개의 라이브러리와 네 개의 콘솔 애플리케이션이 포함되어 있습니다.
DiscoverySecurityChannels: 보안 바인딩을 노출하는 라이브러리입니다. 라이브러리에서는 들어오고 나가는 메시지의 압축 서명을 계산하고 확인합니다.
Service: ICalculatorService 계약을 노출하는 자체 호스팅 서비스입니다. 이 서비스는 검색 가능한 것으로 표시됩니다. 사용자는 인증서에 대한 저장소 위치, 이름, 주체 이름 또는 기타 고유 식별자와 클라이언트 인증서(들어오는 메시지의 서명을 확인하는 데 사용되는 인증서)가 있는 저장소를 지정하여 메시지에 서명하는 데 사용되는 인증서의 세부 정보를 지정합니다. 이러한 세부 정보를 기반으로 보안이 향상된 UdpDiscoveryEndpoint가 빌드되고 사용됩니다.
Client: 이 클래스는 ICalculatorService에 대한 검색과 서비스에 대한 메서드 호출을 시도합니다. 이 경우에도 보안이 향상된 UdpDiscoveryEndpoint가 빌드되고 메시지를 서명 및 확인하는 데 사용됩니다.
AnnouncementListener: 온라인 및 오프라인 알림을 수신 대기하고 보안 알림 끝점을 사용하는 자체 호스팅 서비스입니다.
참고 항목
Setup.bat가 여러 번 실행되는 경우 인증서 관리자는 중복 인증서가 있으므로 추가할 인증서를 선택하라는 메시지를 표시합니다. 이 경우 중복이 이미 만들어졌으므로 Setup.bat를 중단하고 Cleanup.bat를 호출해야 합니다. Cleanup.bat에서도 삭제할 인증서를 선택하라는 메시지를 표시합니다. 목록에서 인증서를 선택하고 남아 있는 인증서가 없을 때까지 Cleanup.bat를 계속 실행합니다.
이 샘플을 사용하려면
Visual Studio용 개발자 명령 프롬프트에서 Setup.bat 스크립트를 실행합니다. 이 샘플에서는 인증서를 사용하여 메시지를 서명하고 확인합니다. 이 스크립트에서는 Makecert.exe를 사용하여 인증서를 만든 다음 Certmgr.exe를 사용하여 인증서를 설치합니다. 이 스크립트는 관리자 권한으로 실행해야 합니다.
샘플을 빌드 및 실행하려면 Visual Studio에서 Security.sln 파일을 열고 모두 다시 빌드를 선택합니다. DiscoverySecureChannels를 제외한 모든 프로젝트에 대해 시작을 선택하여 여러 프로젝트를 시작하도록 솔루션 속성을 업데이트합니다. 솔루션을 정상적으로 실행합니다.
샘플을 사용하여 작업을 수행한 후 이 샘플에 대해 만들어진 인증서를 제거하는 Cleanup.bat 스크립트를 실행합니다.