使用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#忽略证书错误?