5

出於安全原因,我想閱讀證書詳細信息(例如過期日期或CN)。閱讀WP8上的SSL證書詳細信息

通常有網絡類提供一些屬性,允許檢查證書。這在WP8實現中缺少。

而且我試圖創建一個SslStream也沒有辦法讓.NET 4.5的任何證書的細節,如RemoteCertificate

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

SslStream缺少與安全有關的所有事情。因此,看起來BountyCastle和其他庫也無法獲得證書,因爲底層框架不支持它。

所以我的問題是:

  1. 我可以閱讀使用其他方法對WP8的CN或其它細節Certificate
  2. 如果沒有,你怎麼能創建然後使用像SSL Pinning或客戶端證書驗證,是有這是爲什麼不支持WP8任何理由技術WP8嚴重的安全應用程序(網上銀行)?

問候 霍爾格

回答

1

試圖像BouncyCastle的,supersocket或webSocket4net我測試了名爲ELDOS SecureBlackbox商業LIB的評估開源庫後。這個測試是成功的。這裏是一個剪斷代碼,與所有的細節得到X509Certificates:

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

驗證越來越所有的證書......如果驗證設置爲true,則下一個證書將被顯示。這意味着回調被稱爲在那裏獲得證書。

問候 霍爾格

0

對於WP8,您可以使用StreamSocket類,它有一個UpgradeToSslAsync()方法,它將爲您執行TLS握手作爲異步操作。一旦完成,您可以使用.Information.ServerCertificate屬性檢查您是否獲得了您期待的服務器證書。

+0

StreamSocket.Information.ServerCertificate財產! –

2

在Windows Phone 8.1這可以用HttpClient完成,以及與StreamSocket(如麥克的建議)。
使用StreamSocket進行證書驗證的示例可以在here(源代碼中的Scenario5_Certificate)中找到。

與HttpClient的證書驗證可以通過處理ERROR_INTERNET_INVALID_CA例外,使用HttpTransportInformation類驗證服務器證書,創建HttpBaseProtocolFilter類的新實例,並指定要忽略錯誤來完成。

請注意,並非所有的錯誤都可以忽略。如果您嘗試添加成功,已撤銷,InvalidSignature,InvalidCertificateAuthorityPolicy,BasicConstraintsError,UnknownCriticalExtension或OtherErrors枚舉值,您將收到異常。

我使用的HttpClient將繞過證書錯誤示例代碼:在Windows Phone的8.1加入

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

請注意,這僅適用於Windows(Phone)8.1,不適用於WP 8.0。 WP 8.0不支持HttpRequestMessage。 –

+0

@ReneSchulte編輯,謝謝! –