43

Windows 8.1 ve Windows 8.1 telefonlarının yeni bir özelliğini deniyorum. Sertifika depoları ve sunucu tarafında istemci kimlik doğrulaması için istemci sertifikalarını kullanma olanağı. Ancak bu işlevsellik ile ilgili sorunlar yaşıyorum.Windows RT için İstemci sertifikaları kullanma (Windows 8.1/Windows 8.1)

IIS ekspresinde çalışan temel bir WCF hizmetim var. IIS express, SSL ve istemci sertifikalarını desteklemek üzere yapılandırıldı.

<access sslFlags="SslRequireCert" /> (tried also SslNegotiateCert) 
<clientCertificateMappingAuthentication enabled="true" /> 

Ben aşağıda, Windows RT uygulaması içinde istemci sertifikası eklemiş: IIS (configurationhost.config) konfigürasyon dosyasında bu belirledik Sonra

//Install the self signed client cert to the user certificate store 
string CACertificate = null; 
try 
{ 
    Uri uri = new Uri("ms-appx:///Assets/AdventureWorksTestClient1.pfx"); 
    var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri); 
    IBuffer buffer = await FileIO.ReadBufferAsync(file); 
    using (DataReader dataReader = DataReader.FromBuffer(buffer)) 
    { 
     byte[] bytes = new byte[buffer.Length]; 
     dataReader.ReadBytes(bytes); 
     // convert to Base64 for using with ImportPfx 
     CACertificate = System.Convert.ToBase64String(bytes); 
    } 
    await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
      CACertificate, 
      "", 
      ExportOption.Exportable, 
      KeyProtectionLevel.NoConsent, 
      InstallOptions.None, 
      "ClientCert1"); 
} 
catch (Exception ex) 
{... 

kullanıyorum HttpBaseProtocolFilter sonra

IReadOnlyCollection<Certificate> certs = await CertificateStores.FindAllAsync(query); 

HttpBaseProtocolFilter bpf = new HttpBaseProtocolFilter(); 
if (certs.Count > 0) 
{ 
    cert = certs.ElementAt(0); 
    bpf.ClientCertificate = cert; 
} 
HttpClient httpClient = new HttpClient(bpf); 
.... 

Ve rica:

hangi istemci sertifikayı bu şekilde eklemek

Bu kod satırı

var resp = await httpClient.GetAsync(new Uri(serviceURL)); 
bu istisnayı oluşturuyor:

{System.Exception: Exception from HRESULT: 0x80072F7D 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at JumpStartCertificateDemo.MainPage.<btnCallService_Click>d__0.MoveNext()} 

Ben ben de localhost (yerel bilgisayar) ve ayrıca uygulama tarafında doğru sertifikaları aktardıktan% 100 emin. Tarayıcı üzerinden servis çağrısı düzgün çalışıyor. (İstemci sertifikası sağlamanız istenir), bu nedenle uygulamada istemci sertifikası sağlama konusunda bir sorun olması gerekir.

Bu konuda bana yardımcı olabilecek herhangi biri var mı? Teşekkür ederim.

+0

muhtemelen ne görürsen bu açıklamalara bakın. yakalayamayacağınız için beklemeyi kaldırmanız ve sonucu t.IsFaulted olarak doğrulamak ve t.Exception'ı kontrol etmek için bir görev kullanmak gerekir; –

+0

Pedro, yorum için teşekkürler, ancak istisnayı yakalarım (Onlarla nasıl çalışacağını biliyorum), sorun var, bir istisna olmamalı çünkü müşteri sertifikasını eklediğimde alma isteğinin çağrılması gerekiyor ve istek tarayıcıdan ve ayrıca android çalışır. –

+0

Hayır, In .Net istek seçeneklerine bağlı olarak bir sertifika isteği bir istisna atar, nasıl çalışır, bir çok kez yaptım. 4XX yanıtında bir şey aldığınızda WebException atılır. Ne cevap aldığınızı görmek için kemancıyı kullanın. –

cevap

1

Sorun, kullandığınız sertifikanın geçerliliği ile ilişkili olabilir.

Varsayılan olarak .Net, geçersiz veya güvenilir olmayan sertifikaya sahip https bağlantısı kurmayı reddeder.

Genellikle sertifika güvenilir olmayan bir yetkili tarafından üretildiği için geçersizdir (kendinden imzalı sertifika) veya sitenin adresi sertifika için geçerli adres listesine dahil edilmediğinden.

Net olarak bu sınırlama rahat olabilir, sertifika talebi bunu yakalayarak işlemek gerekir C# bir WebException çünkü C# Ignore certificate errors?