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编辑,谢谢! –