43

Ich versuche eine neue Funktion von Windows 8.1 und Windows Phone 8.1, nämlich die Zertifikatsspeicher und die Möglichkeit, Client-Zertifikate für die Client-Authentifizierung auf der Serverseite zu verwenden. Ich habe jedoch Probleme mit dieser Funktionalität.Verwendung von Client-Zertifikaten für Windows RT (Windows 8.1/Windows Phone 8.1)

Ich habe einen grundlegend getesteten WCF-Dienst, der auf IIS Express ausgeführt wird. IIS Express ist für die Unterstützung von SSL und Clientzertifikaten konfiguriert. In Konfigurationsdatei von IIS (configurationhost.config) Ich habe diesen Satz:

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

Ich habe das Client-Zertifikat innerhalb des Windows-RT-App wie unten hinzugefügt:

//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) 
{... 

Dann habe ich das bin mit HttpBaseProtocolFilter auf diese Weise zu dem hinzufügen, ich Client-Zertifikat:

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); 
.... 

Und dann fordern:

var resp = await httpClient.GetAsync(new Uri(serviceURL)); 

Diese Codezeile erzeugt diese Ausnahme:

{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()} 

Ich bin 100% sicher, dass ich auch Scheine importiert haben auf localhost (lokaler Computer) und auch auf Anwendungsseite. Der Aufruf des Dienstes über den Browser funktioniert ordnungsgemäß. (Ich werde aufgefordert, ein Clientzertifikat bereitzustellen), daher muss ein Problem mit der Bereitstellung des Clientzertifikats in der Anwendung auftreten.

Kann mir bitte jemand helfen? Vielen Dank.

+0

wahrscheinlich das, was Sie sehen, ist, da die Anforderung für das Zertifikat ein WebException in C# ist, dass Sie durch den Fang sie damit umgehen müssen. Da Sie nicht versuchen können zu fangen, müssen Sie die Wartezeit entfernen und eine Aufgabe verwenden, um das Ergebnis in t.IsFaulted zu validieren und die t.Exception zu überprüfen; –

+0

Pedro danke für den Kommentar, aber ich bin die Ausnahme abfangen (ich weiß, wie man mit ihnen arbeitet), gibt es ein Problem, dass es keine Ausnahme geben sollte, weil Aufruf der Get-Anfrage funktionieren sollte, da ich den Client cert und anschließe Anfrage funktioniert vom Browser und auch Android. –

+0

Nein, In .Net abhängig von den Anforderungsoptionen eine Cert-Anfrage löst eine Ausnahme aus es ist wie es funktioniert, ich habe es oft getan. WebException wird ausgelöst, wenn Sie in der 4XX-Antwort etwas erhalten. Benutze Geiger, um zu sehen, welche Antwort du bekommst. –

Antwort

1

Das Problem könnte mit der Gültigkeit des Zertifikats zusammenhängen, das Sie verwenden.

Standardmäßig verweigert .Net die Einrichtung einer https-Verbindung mit ungültigem oder nicht vertrauenswürdigem Zertifikat.

Normalerweise ist das Zertifikat ungültig, weil es von einer nicht vertrauenswürdigen Autorität generiert wird (selbstsigniertes Zertifikat) oder weil die Adresse der Site nicht in der Liste der gültigen Adressen für das Zertifikat enthalten ist.

In .Net diese Einschränkung gelockert werden können, finden Sie diese Diskussion C# Ignore certificate errors?