c# windows-runtime windows-8.1 windows-phone-8.1 client-certificates

c# - Uso de certificados de cliente para Windows RT(Windows 8.1/Windows Phone 8.1)



windows-runtime windows-8.1 (1)

El problema podría estar relacionado con la validez del certificado que lo está utilizando.

De forma predeterminada .Net se niega a establecer una conexión https con un certificado no válido o no confiable.

Generalmente, el certificado no es válido porque lo genera una autoridad no confiable (certificado autofirmado) o porque la dirección del sitio no está incluida en la lista de direcciones válidas para el certificado.

En .Net esta limitación se puede relajar, consulte esta discusión C # ¿Ignorar errores de certificado?

Estoy probando una nueva característica de Windows 8.1 y Windows Phone 8.1, a saber, los almacenes de certificados y la posibilidad de utilizar certificados de clientes para la autenticación de clientes en el servidor. Sin embargo estoy teniendo problemas con esta funcionalidad.

Tengo un servicio básico probado de WCF que se ejecuta en IIS Express. IIS Express está configurado para soportar SSL y certificados de cliente. En el archivo de configuración de IIS (configurationhost.config) he establecido esto:

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

He añadido el certificado de cliente dentro de la aplicación de Windows RT de la siguiente manera:

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

Luego estoy usando el HttpBaseProtocolFilter al que agrego el certificado de cliente de esta manera:

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

Y luego pedir:

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

Esta línea de código está generando esta excepción:

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

Estoy 100% seguro de que he importado certificados correctos también en localhost (computadora local) y también en el lado de la aplicación. La llamada del servicio a través del navegador funciona correctamente. (Se me pide que proporcione el certificado del cliente), por lo que tiene que haber algún problema con la entrega del certificado del cliente en la aplicación.

¿Puede alguien ayudarme en esto por favor? Gracias.