UWP 上的证书固定
Certificate Pinning on UWP
我们有一个 Xamarin.Forms
项目,当前使用 .NET Standard 2.0 为共享项目编译 Android
、iOS
和 UWP
。
通信是通过 WCF
服务合同执行的。
为了固定证书,我们按照示例实现了以下代码。在确保在其项目属性下使用必要的 HttpClient
实现后,这在 Android
和 iOS
上正常工作。
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
配置,但是这也没有任何作用。
问题
- 我需要 to/Am 我可以在
UWP
下指定一个 HttpClient
实现,就像您可以为 Android
和 iOS
指定一个实现来解决这个问题?
- 我目前还缺少另一种方法吗?
我建议您使用 HttpBaseProtocolFilter Class in the Windows.Web.Http Namespace in you UWP app. With the HttpBaseProtocolFilter instance, you can subscribe HttpBaseProtocolFilter.ServerCustomValidationRequested 事件。在此事件处理程序中,您可以执行服务器 SSL 证书的额外验证(除了 OS 默认值之外)。
我们有一个 Xamarin.Forms
项目,当前使用 .NET Standard 2.0 为共享项目编译 Android
、iOS
和 UWP
。
通信是通过 WCF
服务合同执行的。
为了固定证书,我们按照示例实现了以下代码。在确保在其项目属性下使用必要的 HttpClient
实现后,这在 Android
和 iOS
上正常工作。
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
配置,但是这也没有任何作用。
问题
- 我需要 to/Am 我可以在
UWP
下指定一个HttpClient
实现,就像您可以为Android
和iOS
指定一个实现来解决这个问题? - 我目前还缺少另一种方法吗?
我建议您使用 HttpBaseProtocolFilter Class in the Windows.Web.Http Namespace in you UWP app. With the HttpBaseProtocolFilter instance, you can subscribe HttpBaseProtocolFilter.ServerCustomValidationRequested 事件。在此事件处理程序中,您可以执行服务器 SSL 证书的额外验证(除了 OS 默认值之外)。