검색 사양에서는 검색 프로세스에 참여하는 엔드포인트를 안전하게 보호할 필요가 없습니다. 보안을 사용하여 검색 메시지를 향상하면 다양한 유형의 공격(메시지 변경, 서비스 거부, 재생, 스푸핑)이 완화됩니다.
DiscoveryScenario 샘플은 압축 서명 형식(WS-Discovery 사양의 섹션 8.2에 설명됨)을 사용하여 메시지 서명을 계산하고 확인하는 사용자 지정 채널을 구현합니다. 이 샘플은 2005 검색 사양 과 1.1 버전을 모두 지원합니다.
사용자 지정 채널은 검색 및 알림 엔드포인트에 대한 기존 채널 스택 위에 적용됩니다. 이렇게 하면 전송된 모든 메시지에 서명 헤더가 적용됩니다. 서명은 수신된 메시지에서 확인되며 서명이 일치하지 않거나 메시지에 서명이 없는 경우 메시지가 삭제됩니다. 메시지에 서명하고 확인하려면 샘플에서 인증서를 사용합니다.
토론
WCF는 확장 가능하며 사용자가 원하는 대로 채널을 사용자 지정할 수 있습니다. 이 샘플은 보안 채널을 빌드하는 검색 보안 바인딩 요소를 구현합니다. 보안 채널은 메시지 서명을 적용하고 확인하며 현재 스택 위에 적용됩니다.
보안 바인딩 요소는 보안 채널 팩터리 및 채널 수신기를 빌드합니다.
보안 채널 팩터리
보안 채널 팩터리는 메시지 헤더에 압축 서명을 추가하는 출력 또는 이중 채널을 만듭니다. 메시지를 가능한 한 작게 유지하기 위해 압축 서명 형식이 사용됩니다. 압축 서명의 구조는 다음 예제에 나와 있습니다.
<d:Security ... >
[<d:Sig Scheme="xs:anyURI"
[KeyId="xs:base64Binary"]?
Refs="..."
[PrefixList]="xs:NMTOKENS"
Sig="xs:base64Binary"
... />]?
...
</d:Security>
비고
PrefixList 2008 Discovery 버전 프로토콜에 추가되었습니다.
서명을 계산하기 위해 샘플은 확장된 서명 항목을 결정합니다. WS-Discovery 사양에 필요한 대로 네임스페이스 접두사를 사용하여 SignedInfo XML 서명(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을 생성하는 팩터리를 정의합니다. 이러한 보안 엔드포인트는 검색 알림 수신기 및 검색 가능한 서비스에 사용할 수 있습니다.
샘플 세부 정보
샘플에는 라이브러리 및 4개의 콘솔 애플리케이션이 포함됩니다.
DiscoverySecurityChannels: 보안 바인딩을 노출하는 라이브러리입니다. 라이브러리는 나가는/들어오는 메시지에 대한 압축 서명을 계산하고 확인합니다.
서비스: 자체 호스팅되는 ICalculatorService 계약을 노출하는 서비스입니다. 서비스는 검색 가능으로 표시됩니다. 사용자는 인증서의 저장소 위치와 이름, 주체 이름 또는 기타 고유 식별자 및 클라이언트 인증서가 있는 저장소(들어오는 메시지의 서명을 확인하는 데 사용되는 인증서)를 지정하여 메시지에 서명하는 데 사용되는 인증서의 세부 정보를 지정합니다. 이러한 세부 정보에 따라 보안이 추가된 UdpDiscoveryEndpoint가 빌드되고 사용됩니다.
클라이언트: 이 클래스는 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 스크립트를 실행합니다.