19

Ich habe eine Windows Phone App, die für 8.1 entwickelt wurde, und eine der Aufgaben war ein Client-Server-Zertifikatszenario. Meine App hat gut funktioniert, ich konnte das Client-Zertifikat senden und mich am Server anmelden. Nach dem Upgrade auf Windows 8.10.14xxxx war das nicht möglich. Ich habe Drahtziehspuren genommen und es scheint, dass das Zertifikat nie gesendet wird. Die Inhaltslänge der Nachricht ist 0.Fehler beim Senden des Zertifikats nach dem Upgrade auf das neueste Windows Phone 8.1

Ich benutze HttpClient.SendAsync (erwarten) und HttpBaseProtocolFilter, um das Zertifikat einzugeben. Es funktionierte perfekt vor dem Upgrade.

Irgendeine Idee? Ist etwas kaputt?

Zuerst Ich installiere die pfx

async private void btnInstall_Click(object sender, RoutedEventArgs e) 
{ 
    //Install the self signed client cert to the user certificate store 

    string CACertificate = null; 
    try 
    { 
     Uri uri = new Uri("ms-appx:///certificates/test.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, 
      "xxxxx", 
      ExportOption.Exportable, 
      KeyProtectionLevel.NoConsent, 
      InstallOptions.None, 
      "ClientCert1"); 


    } 
    catch (Exception ex) 
    { 
     //; 
    } 
} 

Dann nenne ich den Dienst

string serviceURL = "https://my.web.services"; 
Certificate cert = null; 

CertificateQuery query = new CertificateQuery(); 
query.FriendlyName = "ClientCert1"; 
IReadOnlyCollection<Certificate> certs = await CertificateStores.FindAllAsync(query); 

HttpBaseProtocolFilter bpf = new HttpBaseProtocolFilter(); 
//if you install the CA you don't need to ignore the ServerCertificate Errors 
//bpf.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted); 

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

HttpClient httpClient = new HttpClient(bpf); 
try 
{ 

    var response = await httpClient.GetInputStreamAsync(new Uri(serviceURL)); 
    //take data 
} 
catch (Exception ex) 
{    
    //0x80072F0D 
} 

ich immer eine Ausnahme (0x80072F0D) nehme, wenn sie in 8.10.14xxxx Windows Phone läuft. Mein Code hat vor dem Update funktioniert, jetzt nehme ich immer diesen Rückgabecode. Das Zertifikat wird in httpClient geladen. Wenn ich die App mit dem Debugger stoppe, scheint es, dass das Zertifikat da ist, aber die 0x800072F0D bedeutet wahrscheinlich, dass das Zertifikat nicht gesendet wird ???

Es gibt eine Zwischenzertifizierungsstelle im Szenario. Dieses Zertifikat ist in der pfx enthalten. Muss ich das irgendwie installieren?

+0

Haben Sie eine Repro? – kiewic

+0

@kiewic Kennen Sie das Problem? Ich kann Quellcode teilen. – cateof

+0

Ja, ich kann es mir ansehen. Du kannst RepH auf GitHub oder anderswo setzen. – kiewic

Antwort

1

Ich gehe davon aus, dass Sie das Client-Zertifikat bereits im App-Zertifikatsspeicher abgelegt haben. Wenn nicht, dann tun Sie dies:
1) Laden Sie die PFX-Datei.
2) Installieren Sie Zertifikat in den Zertifikatspeicher des App durch folgende

await CertificateEnrollmentManager.ImportPfxDataAsync(certString, "Your_PFX_Password", ExportOption.Exportable, KeyProtectionLevel.NoConsent, InstallOptions.None, friendlyName); 

3) Überprüfen Sie, ob das Zertifikat in Zertifikatspeicher.

CertificateQuery certQuery = new CertificateQuery(); 
certQuery.FriendlyName = friendlyName; 
IReadOnlyList<Certificate> certs = await CertificateStores.FindAllAsync(certQuery); 

Die certs[0] sollte das Zertifikat haben, das Sie benötigen.

4) Nun, um das Zertifikat zu HTTP-Anforderung

HttpBaseProtocolFilter protolFilter = new HttpBaseProtocolFilter(); 
protolFilter.ClientCertificate = certs[0] //from previous step 
HttpClient client = new HttpClient(protolFilter) 

PS befestigen: Sie sollten nicht System.Net.htpp.HttpClient verwenden. Stattdessen sollten Sie Windows.Web.Http.HttpClient verwenden.

+0

Nein, es funktioniert nicht. Dies scheint die richtige Prozedur zu sein, ich rufe diese Zeilen bereits an (siehe meinen Code oben), aber nach der Installation von Windows Phone 8.1 Update funktionieren diese Zeilen nicht. – cateof

+0

Welches Gerät verwenden Sie? Ein Vorschlag ist, machen Sie einen harten Reset auf Ihr Gerät und versuchen Sie es dann. Und dein Problem ist etwas seltsam. –

+0

ist es ein Nokia Lumia 925. Ich glaube nicht, dass Hard Reset etwas verrechnet. – cateof