2010-04-16 5 views
7

Próbuję przenieść istniejącą aplikację kliencką WCF, aby działała na systemie Linux w trybie Mono. Teraz testuję wszystko, zastanawiając się, co działa na Mono, a co nie.WCF Mono - BasicHttpBinding z SSL

Klient wykonuje super proste wywołanie basicHttpBinding. Działa doskonale, dopóki nie włączę SSL (to znaczy określ BasicHttpSecurityMode.Transport w powiązaniu).

  • Running on .NET w systemie Windows, działa świetnie
  • Running on Mono na Ubuntu 9.10/Mono 2.6 pojawia się następujący błąd:

Exception in async operation: System.Net.WebException: Error getting response stream (Write: The authentication or decryption has failed.): SendFailure ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server. Error code: 0xffffffff800b010a

Czytałem Mono security FAQ; jednak certyfikat SSL na serwerze pochodzi z głównego CA (zakupionego certyfikatu) - wydanego przez Equifax Secure Certificate Authority. Uruchomiłem narzędzie TlsTest na instalacji Ubuntu pod adresem URL .svc i nie ma problemów/błędów. Mogę również zapłacić grzywnę za usługę w Firefoksie (brak ostrzeżeń o zabezpieczeniach).

Czego mi brakuje?

Odpowiedz

2

Plik TlsTest z Mono jest naprawdę dobry w sprawdzaniu tego, więc wydaje się nieco głupio nawet zapytać - ale: Czy możesz użyć WebClient do wysłania żądania do pliku .svc i otrzymania odpowiedzi? Jeśli nie, prawdopodobnie nadal występują problemy z certyfikatem z jakiegoś powodu.

Zgaduję również, że użyłeś narzędzi mozroots lub certmgr, aby zweryfikować główny urząd certyfikacji? A co z jawnym dodawaniem certyfikatu do Twojej witryny do sklepu za pośrednictwem certmgr?

Jeszcze jedno przypomnienie: narzędzie certmgr ogólnie działa na kopii certyfikatów dla bieżącego użytkownika, należy podać arg --machine, aby wszyscy użytkownicy otrzymali certyfikat.

+0

Dzięki za odpowiedź! Testowałem przy użyciu prostego testu WebRequest z tym samym wynikiem. Myślę jednak, że teraz widzę problem - zainstalowałem Mono 2.6 równolegle z pakietem Mono 2.4 dostarczanym z Ubuntu 9.10. Musiałem to zrobić, ponieważ moje wywołania HTTPS WCF zawsze kończyły się niepowodzeniem w wersji 2.4 (otrzymywałem wyjątek NotImplementedException z HttpsTransportBindingElement). Zrobiłem prosty test aplikacji, która sprawia, że ​​prosty WebRequest. Kiedy uruchamiam w wersji 2.6, kończy się niepowodzeniem z niepoprawnym certyfikatem. Kiedy uruchomię go w wersji 2.4, działa! Więc oczywiście mój certyfikat nie jest widoczny dla Mono 2.6 ..... – TheNextman

0

znalazłem jakąś sztuczkę, aby wyeliminować błąd:

using System.Security.Cryptography.X509Certificates; 

public class HttpWebRequestClientCertificateTest : ICertificatePolicy { 



    public bool CheckValidationResult (ServicePoint sp, X509Certificate certificate, 

     WebRequest request, int error) 

     { 

      return true; 

     } 

    } 

..... 

ServicePointManager.CertificatePolicy = new HttpWebRequestClientCertificateTest(); 

HttpWebRequest request = ... 

Być może będzie pracować dla innych, które mają ten błąd w Mono 2.6.

+3

Tak, to działa i eliminuje błąd, ale nie rozwiązuje problemu. Nie powinieneś używać tego w kodzie produkcyjnym ... – TheNextman