19

8.1 için geliştirilmiş bir Windows Phone App var ve görevlerden biri de client-server sertifika senaryosuydu. Uygulamam iyi çalıştı, istemci sertifikasını gönderebilir ve sunucuya giriş yapabilirim. Ancak Windows 8.10.14xxxx'ye yükseltme yaptıktan sonra mümkün değildi. Wireshark izlerini aldım ve sertifika asla gönderilmiyor gibi görünüyor. İletinin içerik uzunluğu 0'dır.En son Windows Phone sürümüne yükselttikten sonra sertifika gönderilemedi. 8.1

Sertifika girmek için HttpClient.SendAsync (beklemede) ve HttpBaseProtocolFilter kullanıyorum. Yükseltmeden önce mükemmel çalıştı.

Herhangi bir fikrin var mı? Bozuk bir şey mi var? 8.10.14xxxx pencere telefonda çalıştırırken

Önce Sonra hizmet

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 
} 

Hep bir hariç (0x80072F0D) alıyorum arıyorum 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) 
    { 
     //; 
    } 
} 

yüklüyorum'u. Kodum güncellemeden önce çalıştı, şimdi her zaman bu dönüş kodunu alıyorum. Sertifika httpClient'te yüklenir. Uygulamayı hata ayıklayıcı ile durdurduğumda, sertifikanın var olduğu anlaşılıyor, ancak 0x800072F0D büyük ihtimalle sertifikanın gönderilmediği anlamına geliyor ???

Senaryoda bir ara sertifika yetkilisi var. Bu sertifika pfx'te yer almaktadır. Bunu bir şekilde yüklemem gerekir mi?

+0

Bir reprounuz var mı? – kiewic

+0

@kiewic sorunu biliyor musunuz? Bazı kaynak kodlarını paylaşabilirim. – cateof

+0

Evet, bir göz atabilirim. GitHub'a veya başka bir yere yeniden yerleştirebilirsiniz. – kiewic

cevap

1

İstemci sertifikasını uygulama sertifikası deposuna koyduğunuzu farz ediyorum. Değilse şu işlemleri yapın:
1) PFX dosyasını indirin.
2) sertifika deposunda sertifika için kontrol edin)

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

3 izleyerek App sertifika deposunda sertifika yükleyin.

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

certs[0], gereksinim duyduğunuz sertifikayı almalıdır.

4) Şimdi, HTTP isteğine

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

PS sertifikası takmak için: Sen System.Net.htpp.HttpClient kullanmamalısınız. Bunun yerine Windows.Web.Http.HttpClient kullanmalısınız.

+0

Hayır çalışmıyor. Bu doğru prosedür gibi görünüyor, ben zaten bu satırları (yukarıda benim koduma bakın) çağırıyorum, ancak windows telefon 8.1 güncelledikten sonra güncellemek bu satırları çalışmaz. – cateof

+0

Hangi aygıtı kullanıyorsunuz? Bir öneri, cihazınıza sabit bir sıfırlama yapın ve ardından deneyin. Ve senin sorunun biraz tuhaf. –

+0

Nokia Lumia 925. Bu sabit sıfırlamanın bir şeyi çözdüğünü sanmıyorum. – cateof

İlgili konular