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

时间:2014-09-10 11:24:43

标签: c# windows-runtime windows-8.1 windows-phone-8.1 client-certificates

我正在尝试Windows 8.1和Windows Phone 8.1的新功能,即证书存储以及在服务器端使用客户端证书进行客户端身份验证的可能性。但是我遇到了这个功能的问题。

我有一个在IIS express上运行的基本测试WCF服务。 IIS express配置为支持SSL和客户端证书。 在IIS(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));

这行代码正在生成此异常:

{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(本地计算机)和应用程序端导入了正确的证书。通过浏览器调用服务正常。 (我被提示提供客户端证书),因此在应用程序中提供客户端证书时必须存在一些问题。

有人可以帮我这个吗?谢谢。

1 个答案:

答案 0 :(得分:1)

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

默认情况下.Net拒绝与无效或不受信任的证书建立https连接。

通常证书无效,因为它是由不受信任的机构(自签名证书)生成的,或者因为该站点的地址未包含在证书的有效地址列表中。

在.Net中可以放宽此限制,请参阅此讨论 C# Ignore certificate errors?