5

Chcę odczytać szczegóły certyfikatu (np. Datę ważności lub CN) ze względów bezpieczeństwa.Przeczytaj szczegóły certyfikatu SSL na temat WP8

Zazwyczaj w klasach sieci dostępne są niektóre właściwości, które umożliwiają sprawdzenie certyfikatu. Tego nie ma w implementacjach WP8.

Próbowałem również utworzyć SslStream, ale również nie ma możliwości uzyskania szczegółów certyfikatu, takich jak RemoteCertificate na .net 4.5.

var sslStream = new SslStream(new NetworkStream(e.ConnectSocket)); 

W SslStream brakuje wszystkiego, co dotyczy zabezpieczeń. Wygląda więc na to, że BountyCastle i inne biblioteki nie mogą uzyskać certyfikatu, ponieważ podstawowy framework go nie obsługuje.

Więc moje pytania to:

  1. mogę przeczytać CN lub inne Certificate szczegółów na WP8 przy użyciu innych metod.?
  2. Jeśli nie, jak można tworzyć, a następnie poważnie zabezpieczyć aplikacje (bankowość liniowa) w pakiecie WP8 przy użyciu technik takich jak sprawdzanie poprawności certyfikatu po stronie klienta i czy istnieje powód, dla którego nie jest to obsługiwane w WP8?

Pozdrowienia Holger

Odpowiedz

1

Po wypróbowaniu bibliotekami open source jak BouncyCastle, supersocket lub webSocket4net Testowałem ocenę lib handlowej nazwie ELDOS SecureBlackbox. Ten test zakończył się pomyślnie. Oto kod snipped, że dostaje X509Certificates ze wszystkimi szczegółami:

public void OpenSSL() 
{ 
    var c = new TElSimpleSSLClient(); 
    c.OnCertificateValidate += new TSBCertificateValidateEvent(OnCertificateValidate); 

    c.Address = "myhostname.com"; 
    c.Port = 443; 
    c.Open(); 
    c.Close(false); 
} 

private void OnCertificateValidate(object sender, TElX509Certificate x509certificate, ref TSBBoolean validate) 
{ 
    validate = true; 
} 

Walidacja jest uzyskiwanie wszystkich certyfikatów ... jeśli validate jest ustawiony na true, następny certyfikat zostanie pokazane. Oznacza to, że wywołanie zwrotne jest tam wywoływane w celu uzyskania certyfikatu.

Pozdrowienia Holger

0

Dla WP8 możesz użyć klasy StreamSocket, która ma metodę UpgradeToSslAsync(), która wykona uzgadnianie TLS dla Ciebie jako operację asynchroniczną. Po zakończeniu możesz użyć właściwości .Information.ServerCertificate, aby sprawdzić, czy masz oczekiwany certyfikat serwera.

+0

nieruchomość StreamSocket.Information.ServerCertificate dodano w Windows Phone 8.1! –

2

W systemie Windows Phone 8.1 można to zrobić za pomocą HttpClient, a także z StreamSocket (zgodnie z sugestią Mike'a).
Przykład sprawdzania poprawności certyfikatu za pomocą StreamSocket można znaleźć here (Scenariusz5_Certyfikat w kodzie źródłowym).

poprawności certyfikatu z HttpClient można zrobić przez obsługę wyjątku ERROR_INTERNET_INVALID_CA, weryfikacji certyfikatu serwera przy użyciu klasy HttpTransportInformation, tworząc nową instancję HttpBaseProtocolFilter klasy i określenie błędów zignorować.

Pamiętaj, że nie wszystkie błędy są niezrozumiałe.Otrzymasz wyjątek, jeśli spróbujesz dodać wartości wyłudzeniowe Success, Revoked, InvalidSignature, InvalidCertificateAuthorityPolicy, BasicConstraintsError, UnknownCriticalExtension lub OtherErrors.

Dodaję przykładowy kod, który omija błędy certyfikatów przy użyciu HttpClient:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Threading.Tasks; 
using Windows.Security.Cryptography.Certificates; 
using Windows.Web.Http; 
using Windows.Web.Http.Filters; 

namespace Example.App 
{ 
    public class HttpsHandler 
    { 
     private const int ERROR_INTERNET_INVALID_CA = -2147012851; // 0x80072f0d 

     public static async void HttpsWithCertificateValidation() 
     { 
      Uri resourceUri; 
      if (!Uri.TryCreate("https://www.pcwebshop.co.uk/", UriKind.Absolute, out resourceUri)) 
       return; 

      IReadOnlyList<ChainValidationResult> serverErrors = await DoGet(null, resourceUri); 
      if (serverErrors != null) 
      { 
       HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter(); 
       foreach (ChainValidationResult value in serverErrors) 
       { 
        try { 
         filter.IgnorableServerCertificateErrors.Add(value); 
        } catch (Exception ex) { 
         // Note: the following values can't be ignorable: 
         //  Success Revoked InvalidSignature InvalidCertificateAuthorityPolicy 
         //  BasicConstraintsError UnknownCriticalExtension OtherErrors 
         Debug.WriteLine(value + " can't be ignorable"); 
        } 
       } 

       await DoGet(filter, resourceUri); 
      } 
     } 

     private static async Task<IReadOnlyList<ChainValidationResult>> DoGet(HttpBaseProtocolFilter filter, Uri resourceUri) 
     { 
      HttpClient httpClient; 
      if (filter != null) 
       httpClient = new HttpClient(filter); 
      else 
       httpClient = new HttpClient(); 

      HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, resourceUri); 
      bool hadCertificateException = false; 
      HttpResponseMessage response; 
      String responseBody; 

      try { 
       response = await httpClient.SendRequestAsync(requestMessage); 
       response.EnsureSuccessStatusCode(); 
       responseBody = await response.Content.ReadAsStringAsync(); 
      } catch (Exception ex) { 
       hadCertificateException = ex.HResult == ERROR_INTERNET_INVALID_CA; 
      } 

      return hadCertificateException ? requestMessage.TransportInformation.ServerCertificateErrors : null; 
     } 
    } 
} 
+2

Należy pamiętać, że działa to tylko dla Windows (Phone) 8.1, a nie dla WP 8.0. HttpRequestMessage nie jest obsługiwany w WP 8.0. –

+0

@ReneSchulte edytowane, dzięki! –

Powiązane problemy