19

Ho un'app di Windows Phone, creata per 8.1, e una delle attività era uno scenario di certificato client-server. La mia app ha funzionato bene, potevo inviare il certificato del client e accedere al server. Tuttavia, dopo l'aggiornamento a Windows 8.10.14xxxx non è stato possibile. Ho preso tracce di wirehark e sembra che il certificato non venga mai inviato. La lunghezza del contenuto del messaggio è 0.Impossibile inviare il certificato dopo l'aggiornamento all'ultima versione del telefono di Windows 8.1

Io uso HttpClient.SendAsync (attendi) e HttpBaseProtocolFilter per immettere il certificato. Ha funzionato perfettamente prima dell'aggiornamento.

Qualche idea? C'è qualcosa di rotto?

Prima Sto installando il 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) 
    { 
     //; 
    } 
} 

Poi sto chiamando il servizio

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 
} 

Sono sempre prendendo una eccezione (0x80072F0D) durante l'esecuzione in 8.10.14xxxx Windows Phone. Il mio codice ha funzionato prima dell'aggiornamento, ora prendo sempre questo codice di ritorno. Il certificato è caricato in httpClient. Quando interrompo l'app con il debugger, sembra che il certificato sia presente, tuttavia lo 0x800072F0D probabilmente significa che il certificato non viene inviato ???

Esiste un'autorità di certificazione intermedia nello scenario. Questo certificato è incluso nel pfx. Devo installarlo in qualche modo?

+0

Hai una riproduzione? – kiewic

+0

@kiewic conosci il problema? Posso condividere qualche codice sorgente. – cateof

+0

Sì, posso dare un'occhiata. Puoi inserire repro su GitHub o altrove. – kiewic

risposta

1

Suppongo che tu abbia già inserito il certificato client nell'archivio certificati app. In caso contrario, procedere come segue:
1) Scaricare il file PFX.
2) Installare il certificato nell'archivio certificati del App seguendo

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

3) Controllare il certificato nell'archivio certificati.

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

Il certs[0] dovrebbe avere il certificato che è necessario.

4) Ora, per allegare il certificato di richiesta HTTP

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

PS: Non si deve usare System.Net.htpp.HttpClient. Invece di quello dovresti usare Windows.Web.Http.HttpClient.

+0

No, non funziona. Questa sembra essere la procedura corretta, sto già chiamando quelle linee (vedi il mio codice sopra), tuttavia dopo aver installato Windows Phone 8.1 aggiornare queste linee non funzionano. – cateof

+0

Quale dispositivo stai utilizzando? Un suggerimento è, fare un hard reset sul dispositivo e quindi provare. E il tuo problema è un po 'strano. –

+0

è un Nokia Lumia 925. Non credo che il reset hardware risolva qualcosa. – cateof