UWP 上的证书固定

Certificate Pinning on UWP

我们有一个 Xamarin.Forms 项目,当前使用 .NET Standard 2.0 为共享项目编译 AndroidiOSUWP

通信是通过 WCF 服务合同执行的。

为了固定证书,我们按照示例实现了以下代码。在确保在其项目属性下使用必要的 HttpClient 实现后,这在 AndroidiOS 上正常工作。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;

private bool ValidateServerCertificate(object sender,
                                       X509Certificate certificate,
                                       X509Chain chain,
                                       SslPolicyErrors sslPolicyErrors)
{
    // Make sure we have a certificate to check.
    if (certificate == null)
    {
        return false;
    }

    if (sslPolicyErrors != SslPolicyErrors.None)
    {
        return false;
    }

    return this.KnownKeys.Contains(certificate.GetCertHashString(), 
                                   StringComparer.Ordinal);
}
然而,

UWP 被证明是相当固执的。我无法在通信的任何阶段触发回调。

我也考虑过实现我们自己的 X509CertificateValidator 并将其提供给 WCF 配置,但是这也没有任何作用。

问题

  1. 我需要 to/Am 我可以在 UWP 下指定一个 HttpClient 实现,就像您可以为 AndroidiOS 指定一个实现来解决这个问题?
  2. 我目前还缺少另一种方法吗?

我建议您使用 HttpBaseProtocolFilter Class in the Windows.Web.Http Namespace in you UWP app. With the HttpBaseProtocolFilter instance, you can subscribe HttpBaseProtocolFilter.ServerCustomValidationRequested 事件。在此事件处理程序中,您可以执行服务器 SSL 证书的额外验证(除了 OS 默认值之外)。