2

클라이언트를 인증하기 위해 인증서를 사용하도록 WCF 서비스를 설정하려고합니다. 나는 인증서를 만드는 방법에 관한 수많은 책을 읽었으며 그렇게 할 수있었습니다 (마침내).WCF, 인증서 인증 - 일반적인 오류 및 혼동스러운 인수

Cert Authority와 Cert를 Windows 2008 R2를 실행하는 서버에 설치합니다. MMC 인증서 스냅인을 열면 컴퓨터 계정을 선택합니다. 이 올바른지? 내 WCF 서비스가 Windows 서비스로 실행하기 때문에이 일을하고, 어떤 사용자의가 로그인되지 않은 경우에도 실행됩니다 그러나 일반적으로 인정 하듯이, 나는 차이가 세 가지 옵션 사이에 무엇인지 모르겠어요.

  1. 스냅인로드되면 내 사용자 계정
  2. 서비스 계정
  3. 컴퓨터 계정

, 나는 신뢰할 수있는 루트 인증 기관에 기관 CERT는 가져옵니다. 그런 다음 인증서를 신뢰할 수있는 게시자에 가져옵니다. 이 작업을 수행 할 때 어떤 오류도 발생하지 않습니다. Authority Cert와 해당 기관에서 서명 한 Cert 모두 가져 오기를 수행 할 때 .pvk 파일을 참조하지 않습니다. 개인 키가 인증서 또는 권한 인증서에 포함되어 있다는 것은 나의 이해입니다. 다음은 각 인증서를 작성하는 데 사용하는 명령입니다.

MakeCert.exe 
    -n “CN=InternalCA” 
    -r 
    -sv InternalCA.pvk InternalCA.cer 
    -cy authority 


MakeCert.exe 
    -sk InternalWebService 
    -iv InternalCA.pvk 
    -n “CN=InternalWebService” 
    -ic InternalCA.cer InternalWebService.cer 
    -sr localmachine 
    -ss root 
    -sky exchange 
    -pe 

주의 -ss 루트를 사용합니다. -ss My를 사용하여 많은 게시물을 보았습니다. 나는 그 차이가 무엇인지 또는 각 값을 사용하는 것이 적절한지를 정말로 이해하지 못합니다.

내 WCF 서비스는 관리 서비스 (Windows 서비스) 내에서이 컴퓨터에서 실행됩니다. 나는 WCF 서비스를 호스팅 내 Windows 서비스를 시작하면 즉시 충돌 및 겉으로는 일반적인 오류가 이벤트 뷰어에보고됩니다

System.ArgumentException : 그것은 가능성이 해당 인증서 'CN = TempCertName'할 수있다 는 키 교환 또는 프로세스의 내가으로 서비스를 실행하는 사용자에게 권한을 부여 할 필요가 말할 게시물을 발견 한 개인 키

에 대한 액세스 권한이없는 수 있습니다 할 수있는 개인 키를 가지고 있지 열쇠.

이 하나에 유래 여기에 인기있는 대답을 것 같다 : Grant access with All Tasks/Manage Private Keys

그러나 나는/모든 작업의 ​​옵션이 개인 키

을 관리하지 않는하지만 방법에 대한 명확하지 않다 하기 위해서. 또한 서비스는 내 도메인 계정으로 실행됩니다.이 계정은 관리자이고 인증서를 설치 한 사용자와 동일합니다.

:

+1

나는이 도움이된다면 거 볼 수 있어요 :. http://stackoverflow.com/questions/893336/wcf-with-nettcpbinding-and-certificate-transport-security/893399#893399 – essedbl

답변

1

는 여기에 자신 만의 CA/인증서와 함께 작동하도록 자체 호스팅 SSL의 WCF 서비스를 얻을 수 있도록해야 가장 좋은 링크입니다 제발 도와주세요 : SSL with Self-hosted WCF Service합니다.

위의 가이드에서 작업 한 후 설치 시간 중에 서비스 programatically to use the right certificate을 설정해야 할 수 있습니다.

도구를 사용하여 HTTP.SYS 구성을 확인하는 것이 명령 줄 httpcfg/netsh 명령보다 쉽다는 것을 알게되었습니다.

다음으로 오류가 계속 발생하면 WCF Tracing을 사용하여 추가로 디버그 할 수 있습니다. 또한 WCF Message Tracing도 켜야합니다. WCF 추적으로 충분한 정보가 제공되지 않으면 trace the .NET network stack도 가능합니다.

다른 컴퓨터의 브라우저에서 서비스 URL을 눌러 서비스의 인증서/CA 쌍이 작동하는지 테스트 할 수 있습니다. 먼저 인증서가 유효하지 않음을 나타내야합니다. 그런 다음 컴퓨터의 CA를 신뢰할 수있는 루트로 가져오고 서비스 URL을 다시 누르십시오. 이번에는 경고없이 평소대로 서비스 설명 페이지를 표시해야합니다.

1

나는 가까이 있다고 생각합니다. 다음은 몇 가지 제안 사항입니다.

  1. 두 번째 단계에서 인증서에 개인 키가 첨부되어 있는지 확인하십시오. 관리자 권한이있는 경우에도이 명령에 사용하는 명령 셸을 시작하려면 예를 들어 마우스 오른쪽 단추를 클릭하고 "관리자 권한으로 실행"을해야합니다. 그렇지 않으면 개인 키를 localMachine 저장소에 가져올 수 없습니다.

  2. 나는 -ss my을 사용하고 인증서 (개인 키 포함)를 개인 저장소에 넣습니다. Here 나는이를 참조하십시오

    cc.ClientCredentials.ClientCertificate.SetCertificate ( StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com");

등가물을 가리키는 곳이면 어디에나 인증서를 넣으십시오.

  1. CA 인증서의 개인 키 (생성 한 첫 번째 인증서)를 가져올 필요가 없습니다. 그것은 MakeCert로 더 많은 인증서에 서명하기 위해 보관되어 있습니다. 연결중인 클라이언트에서 해당 CA 인증서 (없이 개인 키없이) 사본이 필요합니다. 그렇지 않으면 클라이언트는 InternalWebService 인증서의 유효성을 검사 할 수 없습니다.

  2. CA 인증서는 클라이언트에서만 필요하기 때문에 실제로 서버 시스템에는 로컬로 인증서가 필요하지 않습니다. 그러나 서버에있는 모든 항목이 로컬로 서비스에 연결되는 경우에는 문제가되지 않습니다. 또한 InternalWebService 인증서가 MMC 스냅인에서 잘 보이도록 만듭니다. 신뢰할 수있는 루트 저장소에서 CA를 사용하거나 사용하지 않고 시도 할 수 있으며 의미하는 바가 표시됩니다. 그러나 어떤 경우이든 이 아닌 CA의 개인 키를 로컬 컴퓨터 저장소에 저장합니다.

  3. InternalWebService에 대한 개인 키 사용 권한을 MMC 스냅인 (인증서를 마우스 오른쪽 단추로 클릭 한 다음 작업, 개인 키 관리 ...)에서 확인하십시오. 서비스가 실행되는 다른 사용자 계정으로 가져 오는 경우, 그러면 확실히 액세스 할 수 없으며 액세스 권한을 부여해야합니다.그렇지 않으면 서비스가 인증서를 가져 오지만 인증서에 개인 키가없는 것처럼 보입니다.

은 요약하면 : 관리자 권한을 가진

  • 실행 InternalWebService의 개인 키가 실제로 인증서 저장소로지고 있는지 확인. (MMC 스냅인의 인증서에 약간의 키가 표시되고 인증서를 마우스 오른쪽 단추로 클릭하면 "개인 키 관리 ..."옵션이 생깁니다. 개인 키가 연결되어 있지 않으면이 키는 존재하지 않습니다.)

  • 웹 서비스가 찾고있는 위치에 InternalWebService를 넣으십시오. 나는 "Personal"(a.k.a. "my")을 추측 할 것입니다. 그러나 그것이 당신의 서비스 설정에서 어디에 있는지 알고있을 것입니다. 현재 사용자이든 로컬이든 관계없이 설정을 살펴보십시오.

  • InternalWebService 인증서 개인 키에 대한 액세스 권한을 부여합니다.없이 개인 키를 - -

  • CA 인증서를 넣어 신뢰할 수있는 루트에 따라, 당신은뿐만 아니라 클라이언트에서 그것을 넣어 (또는 다른 클라이언트에서 "신뢰할 수없는 인증서"를 받아 있어야합니다 그 끝)