2010-12-14 5 views
2

WebHttpBinding을 기반으로 자체 호스팅 WCF REST 서비스가 있습니다. 서비스의 방법 중 하나는 다음과 같은 : 전송 보안 및 클라이언트 인증서를 사용할 때 WCF rest service에 데이터를 POST 할 수 없습니다.

[OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "myMethod")] 
    Stream MyMethod(Stream contents); 

은 내가 HttpWebRequest를이 방법을 시도하고 POST하여 데이터를 생성하는 간단한 테스트 프로그램을 썼습니다. 이 시나리오는 다음과 같은 경우에 유용합니다.

  1. 서비스는 보안 기능을 사용하지 않습니다.
  2. 서비스가 클라이언트 인증서없이 전송 보안 을 사용 중입니다.
  3. 서비스가 클라이언트 인증서 및 I POST 0 바이트의 전송 보안 을 사용 중입니다.

클라이언트 인증서가있는 전송 보안을 0 바이트 이상 사용하려고하면 서비스가 HTTP 403 (금지됨)을 반환하고 코드에 절대 도달하지 않습니다.

이것은 나를 미치게합니다.

아이디어가 있으십니까? HTTP.SYS에 대한 추적을 활성화 한 후

UPDATE

, 나는 추적에 다음과 같은 메시지가 관찰 : 클라이언트 인증서를받을 수있는 서버 응용 프로그램에 의해

시도 상태로 실패했습니다 : 0xC0000225합니다.

이게 무슨 뜻인지 아시나요? 클라이언트 인증서를 보내고 있으며 호스트 컴퓨터에서 신뢰할 수 있다는 것을 확신합니다.

+0

우리는 전송 레벨 보안 및 클라이언트 인증과 함께 wcf 스트리밍을 사용하고 있습니다. 그러나 우리의 봉사는 셀프 호스팅됩니다. IIS에서 wcf를 호스팅하고 있습니까? 어떤 버전? Windows 사용자와 클라이언트 인증서를 매핑 했습니까? –

+0

글쎄, 그건 희망이야. 우리는이 서비스를 자체 호스팅하고 있습니다. 클라이언트 인증서는 사용자 계정에 매핑되지 않습니다. 우리는 사용자 지정 역할 공급자를 사용하고 있습니다. –

답변

0

오랜 고통스러운 검색을 통해 마침내이 문제점이 손상된 클라이언트 인증서임을 발견했습니다. 바깥 쪽 표시는 없지만이 인증서의 개인 키는 로컬 컴퓨터에 저장되지 않았습니다. 코드에서 인증서를 생성 한 다음 현재 사용자의 개인 저장소로 가져 왔습니다. 그러나 우리는 개인 키를 생성하는 데 사용 된 개체에 RSACryptoServiceProvider.PersistKeyInCsp 속성을 설정하지 않았습니다. 그 결과 .NET은 개인 키 컨테이너를 삭제하고 가져온 인증서는 존재하지 않는 개인 키를 참조하는 결과를 가져 왔습니다.

이 게시물에 대한 응답은 Inserting certificate with private key과 같이 .NET을 사용하여 인증서를 가져 오는 데 어려움을 겪습니다.

0

로컬 호스트에 대한 SSL 인증서를 설정해야 할 수 있습니다.

1) 실행 -> "MMC"

2) 파일 -> 프로그램 추가/"사용 가능한 스냅인"에서

3) "인증서"를 선택 ... 스냅인을 제거하고

,691을 "마침"을 클릭)

6 "다음"을 클릭)를 선택합니다) "컴퓨터 계정"

5

4 "> 추가"

7) "확인"을 클릭합니다

8) 개인에 봐 -> 인증서 내가 클릭하고 해당 인증서를 드래그) 당신이 127.0.0.1

9를해야한다고 생각 "신뢰할 수있는 루트 인증 기관"

그런 다음 사용하는 주소가 무엇이든 해당 URL은 작동하지 않으므로 127.0.0.1 (로컬 호스트 아님)으로 변경해야합니다. 그러면 인증서가 유효해야하며 과거 승인을 얻을 수 있다고 생각합니다.

다른 문제가있는 경우 인증서가 아닐 수도 있으므로 서비스, 동작 및 제본이 정확한지 확인하십시오.

WCF 추적을 사용하여 정확히 어떤 문제가 발생했는지 확인할 수있는 방법으로, 나는 내 블로그 게시물을 부끄럽게 여기지 않을 것입니다. :)

http://jtstroup.net/post/Wcf-Tracing.aspx

행운을 빕니다.

+0

답장을 보내 주셔서 감사합니다.하지만 인증서 문제는 아닙니다. 서비스 및 클라이언트 인증서는 모두 내 컴퓨터에서 신뢰할 수 있으며 서비스 인증서 제목은 내가 요청한 URL과 일치합니다. 모든 것은 서비스 인증서 만 사용할 때 작동하지만 클라이언트 인증서를 사용하고 0이 아닌 양의 데이터를 게시하려고 할 때 중단됩니다. –

0

당신은 웹 설정에서 당신이 바인딩 보안 설정해야합니다, 모두 클라이언트 보안 및 서버 서버에서

  1. 를 활성화해야합니다 : 당신이 만들 때 클라이언트에 전송 및 CERTIFICATE

  2. 당신의 HttpWebRequest 당신은 또한 TRANSPORT와 CERTIFICATE를 가능하게해야합니다. 또한 프로그래밍 방식으로 클라이언트 인증서를 할당해야합니다.

  3. SSL 포트 (443)를 열어야합니다. 텔넷으로 확인하십시오.

  4. 때때로 POST 동사가 IIS에 의해 비활성화됩니다. 사용하도록 설정해야합니다. 자세한 내용이 필요하거나 질문이 있으면 코드 및 web.config 파일을 게시하십시오.

+0

답장을 보내 주셔서 감사합니다. 그러나이 중 어떤 것도 적용되지 않습니다. 서버가 클라이언트 인증서와 함께 전송 보안을 사용 중입니다. WCF 클래스가 아닌 요청을 보내려면 HttpWebRequest를 사용하고 있습니다. 클라이언트 인증서를 첨부합니다. 클라이언트 인증서가 필요하지 않을 때 모든 것이 잘 작동하므로 포트 443이 열려 있습니다. 이것이 자체 호스팅 WCF 응용 프로그램이기 때문에 IIS가 어떻게 간섭 하는지를 알 수 없습니다. –