WP8

5

पर SSL प्रमाणपत्र विवरण पढ़ें मैं सुरक्षा कारणों से प्रमाणपत्र विवरण (उदा। समाप्ति तिथि या सीएन) पढ़ना चाहता हूं।WP8

आमतौर पर नेटवर्क कक्षाओं में कुछ गुण उपलब्ध होते हैं, जो प्रमाण पत्र की जांच करने की अनुमति देते हैं। यह WP8 कार्यान्वयन में गायब है।

इसके अलावा मैंने एसएसएलस्ट्रीम बनाने की कोशिश की लेकिन नेट 4.5 पर RemoteCertificate जैसे प्रमाण पत्र विवरण प्राप्त करने का कोई तरीका नहीं है।

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

एसएसएलस्ट्रीम में सुरक्षा से संबंधित सबकुछ गुम है। तो ऐसा लगता है कि बाउंटीकास्टल और अन्य पुस्तकालय प्रमाण पत्र प्राप्त करने में सक्षम नहीं हो सकते हैं, क्योंकि अंतर्निहित ढांचा इसका समर्थन नहीं करता है।

तो मेरी प्रश्न हैं:

  1. मैं सीएन या WP8 पर अन्य Certificate विवरण अन्य तरीकों का उपयोग कर पढ़ सकते हैं।?
  2. यदि नहीं, तो आप SSL Pinning या क्लाइंट साइड प्रमाणपत्र सत्यापन जैसी तकनीकों का उपयोग करके WP8 पर गंभीर रूप से सुरक्षित ऐप्स (लाइन बैंकिंग) कैसे बना सकते हैं और क्या ऐसा कोई कारण है कि यह WP8 में समर्थित नहीं है?

सादर होल्गर

उत्तर

1

bouncyCastle, SuperSocket या webSocket4net मैं एक व्यावसायिक ELDOS SecureBlackbox नामित lib का मूल्यांकन परीक्षण किया की तरह खुला स्रोत libs की कोशिश के बाद। यह परीक्षण सफल था।

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

सत्यापन सभी प्रमाणपत्र हो रही है ... सत्यापित करें सही पर सेट किया जाता है, अगले प्रमाण पत्र दिखाया जाएगा: यहाँ है कि सभी विवरण के साथ X509Certificates हो जाता है एक कोड कतरना, है। इसका मतलब है कि कॉलबैक को वहां पहुंचने का प्रमाण पत्र कहा जाता है।

सादर होल्गर

2

मैं उन्हें पूछ (भी लक्ष्य-निर्धारण WP8) पोर्टेबल वर्ग पुस्तकालयों से सर्वर SSL प्रमाणपत्र विवरण पढ़ने के लिए एक समाधान प्रदान करने के लिए Microsoft .NET टीम के लिए एक उपयोगकर्ता आवाज अनुरोध जारी किए हैं। आप इसे यहां वोट कर सकते हैं: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4784983-support-server-ssl-certificate-chain-inspection-in

0

WP8 के लिए, आप StreamSocket क्लास का उपयोग कर सकते हैं, जिसमें UpgradeToSslAsync() विधि है जो आपके लिए एक एसिंक ऑपरेशन के रूप में टीएलएस हैंडशेक करेगी। एक बार यह पूरा होने के बाद, आप यह जांचने के लिए .Information.ServerCertificate प्रॉपर्टी का उपयोग कर सकते हैं कि आपको वह सर्वर प्रमाणपत्र मिला है जिसकी आप उम्मीद कर रहे थे।

+0

StreamSocket.Information.ServerCertificate संपत्ति विंडोज फोन 8.1 में जोड़ा गया है! –

2

विंडोज फोन 8.1 पर यह HttpClient के साथ-साथ StreamSocket (जैसा माइक सुझाया गया है) के साथ किया जा सकता है।
StreamSocket के साथ प्रमाणपत्र सत्यापन के लिए उदाहरण here (स्रोत कोड में परिदृश्य 5_Certificate) पाया जा सकता है।

HttpClient साथ

प्रमाणपत्र सत्यापन ERROR_INTERNET_INVALID_CA अपवाद हैंडलिंग, HttpTransportInformation वर्ग का उपयोग कर सर्वर प्रमाणपत्र सत्यापित करने, HttpBaseProtocolFilter वर्ग के नया उदाहरण बनाने और त्रुटियों को अनदेखा करने के लिए निर्दिष्ट करके किया जा सकता है।

ध्यान दें कि सभी त्रुटियां अनजान नहीं हैं।यदि आप सफलता, निरस्त, अमान्य हस्ताक्षर, अमान्य प्रमाण पत्र प्राधिकरण नीति, बेसिक कॉन्स्ट्रेनेंट त्रुटि, अज्ञात क्रिटिकल एक्सटेंशन या अन्य त्रुटि एनम मान जोड़ने का प्रयास करेंगे, तो आपको अपवाद प्राप्त होगा।

मैं 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

कृपया ध्यान दें कि यह केवल विंडोज (फोन) 8.1 के लिए काम करता है और WP 8.0 के लिए नहीं। WP 8.0 पर HttpRequestMessage समर्थित नहीं है। –

+0

@ReneSchulte संपादित, धन्यवाद! –

संबंधित मुद्दे