windows-phone-8.1 windows-phone certificate windows-10 windows-10-mobile

Error al enviar el certificado después de actualizar a la última versión de Windows Phone 8.1



windows-phone-8.1 windows-phone (1)

Tengo una aplicación para Windows Phone, creada para 8.1, y una de las tareas era un escenario de certificado cliente-servidor. Mi aplicación funcionó bien, podría enviar el certificado del cliente e iniciar sesión en el servidor. Sin embargo, después de actualizar a Windows 8.10.14xxxx eso no fue posible. Tomé rastros de Wirehark y parece que el certificado nunca se envía. La longitud del contenido del mensaje es 0.

Utilizo HttpClient.SendAsync (esperar) y HttpBaseProtocolFilter para ingresar el certificado. Funcionó perfecto antes de la actualización.

¿Alguna idea? ¿Hay algo roto?

Primero estoy instalando el 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) { //; } }

Entonces estoy llamando al servicio

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 }

Siempre estoy tomando una excepción ( 0x80072F0D ) cuando se ejecuta en 8.10.14xxxx windows phone. Mi código funcionó antes de la actualización, ahora siempre estoy tomando este código de retorno. El certificado se carga en httpClient. Cuando detengo la aplicación con el depurador, parece que el certificado está ahí, sin embargo, el 0x800072F0D probablemente significa que el certificado no se envía.

Hay una autoridad de certificación intermedia en el escenario. Ese certificado está incluido en el pfx. ¿Necesito instalar esto de alguna manera?


Supongo que ya ha puesto el certificado de cliente en el almacén de certificados de la aplicación. Si no, entonces haz estos:
1) Descargar el archivo PFX.
2) Instale el certificado en el almacén de certificados de la aplicación siguiendo

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

3) Compruebe el certificado en el almacén de certificados.

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

Los certificados certs[0] deben tener el certificado que necesita.

4) Ahora, adjuntar el certificado a la solicitud HTTP.

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

PS: No debe utilizar System.Net.htpp.HttpClient . En lugar de eso, debe usar Windows.Web.Http.HttpClient .