5

Ich möchte Zertifikatdetails (z. B. Ablaufdatum oder CN) aus Sicherheitsgründen lesen.Lesen Sie SSL Certificate Details auf WP8

Normalerweise sind einige Eigenschaften in Netzwerkklassen verfügbar, die das Überprüfen des Zertifikats ermöglichen. Dies fehlt in WP8-Implementierungen.

Auch ich habe versucht, eine SslStream zu erstellen, aber es gibt auch keine Möglichkeit, Zertifikat Details wie die RemoteCertificate auf .net 4.5 zu erhalten.

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

Der SslStream fehlt alles in Bezug auf Sicherheit. Es sieht also so aus, als könnten auch BountyCastle und andere Bibliotheken das Zertifikat nicht erhalten, weil das zugrundeliegende Framework es nicht unterstützt.

Also meine Fragen sind:

  1. Kann ich die CN oder andere Certificate Details zu WP8 mit anderen Ansätzen lesen.?
  2. Wenn nicht, wie können Sie dann ernsthafte sichere Anwendungen (line banking) auf WP8 mit Techniken wie SSL Pinning oder clientseitige Zertifikatsprüfung erstellen und gibt es einen Grund, warum dies in WP8 nicht unterstützt wird?

Grüße Holger

Antwort

1

Nach Open-Source-Bibliotheken wie BouncyCastle versucht, Supersocket oder webSocket4net ich eine Auswertung eines kommerziellen lib SecureBlackbox ELDOS genannt getestet. Dieser Test war erfolgreich. Hier ist ein Code snipped, die die X509Certificates mit allen Details wird:

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; 
} 

Die Validierung wird alle Zertifikate bekommen ... wenn validate auf true gesetzt ist, wird die nächste Zertifikat angezeigt. Das heißt, der Rückruf wird dort als Zielzertifikat bezeichnet.

Grüße Holger

0

Für WP8 können Sie die StreamSocket-Klasse verwenden, die über eine UpgradeToSslAsync()-Methode verfügt, die den TLS-Handshake für Sie als asynchrone Operation ausführt. Sobald dies abgeschlossen ist, können Sie mithilfe der Eigenschaft .Information.ServerCertificate überprüfen, ob Sie das Serverzertifikat erhalten haben, das Sie erwartet haben.

+0

StreamSocket.Information.ServerCertificate Eigenschaft wurde in Windows Phone 8.1 hinzugefügt! –

2

Auf Windows Phone 8.1 kann dies mit HttpClient, sowie mit StreamSocket (wie Mike vorgeschlagen) durchgeführt werden.
Beispiel für die Zertifikatsüberprüfung mit StreamSocket finden Sie here (Scenario5_Certificate im Quellcode).

Zertifikatsprüfung mit Httpclient kann durch die Handhabung der ERROR_INTERNET_INVALID_CA Ausnahme durchgeführt werden, die Validierung der Zertifikatsserver die HttpTransportInformation-Klasse, neue Instanz von HttpBaseProtocolFilter Klasse erstellen und die Fehler Angabe zu ignorieren.

Beachten Sie, dass nicht alle Fehler ignoriert werden können.Sie erhalten eine Ausnahme erhalten, wenn Sie versuchen, Erfolg zu addieren, Revoked, InvalidSignature, InvalidCertificateAuthorityPolicy, BasicConstraintsError, UnknownCriticalExtension oder OtherErrors ENUM-Werte.

Ich füge einen Beispielcode, der Zertifikatfehler unter Verwendung von Httpclient umgeht:

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

Bitte beachten Sie, dass dies nur für Windows (Phone) 8.1 und nicht für WP 8.0 funktioniert. HttpRequestMessage wird in WP 8.0 nicht unterstützt. –

+0

@ReneSchulte bearbeitet, danke! –