2009-10-27 15 views
17

Tworzę aplikację WCF, w której będę używać certyfikatów do szyfrowania komunikacji między klientem a serwerem. W moim środowisku programistycznym chcę użyć certyfikatu testowego/certyfikatu samopodpisanego, który stworzyłem przy pomocy makecert. (Tylko serwer będzie miał certyfikat, a klient nie).Dlaczego usługa WCF narzeka na niepowodzenie sprawdzania tożsamości?

Zainstalowałem certyfikat w magazynie certyfikatów i wszystko działa poprawnie. Na kliencie tryb certificateValidationMode jest obecnie ustawiony na "false", ponieważ pracuję z certyfikatem testu.

Mój problem:

W app.config na kliencie, muszę określić element neutralny jak to:

<endpoint ... > 
    <identity> 
     <dns value="<Name-Of-Server-Computer>"/> 
    </identity> 
</endpoint> 

Jeśli usunąć element neutralny, pojawia się następujący komunikat o błędzie w kliencie, gdy próbuję połączyć się z serwerem:

Kontrola tożsamości nie powiodła się w przypadku wiadomości wychodzących. Oczekiwana tożsamość DNS zdalnego punktu końcowego to "localhost", ale zdalny punkt końcowy pod warunkiem, że DNS żąda "Name-Of-Server-Computer". Jeśli jest to uzasadniony zdalny punkt końcowy, można rozwiązać ten problem, jawnie określając tożsamość DNS "Nazwa-serwer-komputer" jako właściwość Tożsamość EndpointAddress podczas tworzenia proxy kanału.

Więc oto moje pytania:

  • jest sprawdzenie tożsamości odbywa się tylko przy użyciu/certyfikat z podpisem własnym testu? Kiedy wdrażam aplikację przy użyciu prawdziwego, zaufanego certyfikatu zakupionego w urzędzie certyfikacji, czy nadal będzie sprawdzana tożsamość?

  • Czy istnieje sposób wyłączenia kontroli tożsamości? Wiem, że mogę utworzyć własny, niestandardowy walidator certyfikatów, ale wydaje się, że nie ma sposobu na zastąpienie sprawdzania tożsamości za pomocą tych.

Odpowiedz

10

Sprawdzenie jest zawsze wykonywane - i powinno być. Zasadniczo WCF sprawdzi, czy certyfikat jest wystawiony na nazwę domeny (twojafirma.com) lub nazwa komputera, gdzie znajduje się twoja usługa. To jest kontrola bezpieczeństwa, której nigdy nie wyłączę! W przeciwnym razie ktoś podszywający się pod twoją usługę może użyć dowolnego certyfikatu wystawionego na dowolną domenę/maszynę i uzyskać ruch - a nie to, czego potrzebujesz!

To, czego potrzebujesz, aby upewnić się, że Twój prawdziwy certyfikat na serwerze produkcyjnym jest rzeczywiście wystawiony na tę nazwę domeny, do której należy serwer produkcyjny, np. jeśli serwer produkcyjny będzie w "production.yourcompany.com", certyfikat musi być wystawiony do tej domeny.

Marc

+0

> "To jest kontrola bezpieczeństwa, które nigdy nie wyłączyć!" Po to, aby upewnić się, że rozumiem. Czy to oznacza, że ​​istnieje sposób, aby go wyłączyć? Rozumiem zalety czeku ... – Nitramk

+1

Nigdy nawet nie myślałem o zrobieniu tego, więc nigdy nie poczułem chęci sprawdzenia, czy istnieje sposób, aby go wyłączyć. Nie wiem, przepraszam. –

24

Odpowiedź na to pytanie jest w samym komunikatem o błędzie. Na komputerze klienckim można wykonać:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server"); 
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity); 

Zamień "Serwer", zgodnie z oczekiwaniami. Zazwyczaj jest to nazwa zwyczajowa (CN) podpisanego przez siebie certyfikatu. Takie postępowanie nie zrujnuje bezpieczeństwa, pod warunkiem, że ponosisz całkowitą odpowiedzialność za upewnienie się, że przedstawiony certyfikat jest ważny, to jest utworzenie niestandardowego walidatora certyfikatów i dokonanie odpowiednich kontroli.

+0

Masz rację! Ta odpowiedź jest poprawna. –

3

certificateValidationMode powinien być ustawiony na "None", a nie "false" ...

Powiązane problemy