使用Windows RT客户端证书(Windows 8.1 / Windows Phone 8.1)

我正在尝试Windows 8.1和Windows Phone 8.1的一个新function,即证书存储和可能性使用客户端证书在服务器端的客户端身份validation。 不过,我有这个function的问题。

我有一个基本的testingWCF服务运行IIS快递。 IIS Expressconfiguration为支持SSL和客户端证书。 在IIS的configuration文件(configurationhost.config)中我已经设置了这个:

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

我已经在Windows RT应用程序中添加了客户端证书,如下所示:

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

然后,我使用HttpBaseProtocolFilter,以这种方式添加客户端证书:

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

然后请求:

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

这行代码产生这个exception:

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

我100%确定我已经在localhost(本地计算机)上也在应用程序端导入了正确的证书。 通过浏览器调用服务正常。 (我提示提供客户端证书),所以在应用程序中提供客户端证书时必然会出现一些问题。

任何人都可以帮我在这一个吗? 谢谢。

问题可能与您正在使用的证书的有效性有关。

默认情况下,.Net拒绝与无效或不可信的证书build立https连接。

通常,证书是无效的,因为它是由不可信的权威机构(自签名证书)生成的,或者是因为该证书的有效地址列表中没有包含该地址的地址。

在.Net这个限制可以放宽,看到这个讨论C#忽略证书错误?