我有一个Web-API服务器,其中包含一些使用自签名SSL证书的功能。我有一个用于Windows和Android应用程序的类库 关于这个类库的重要事项:
ServicePointManager.ServerCertificateValidationCallback += ValidateCert;
方法本身:
private bool ValidateCert(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
var apiCertHash = new byte[]
{118, 15, 13, 101, 224, 50, 146, 17, 66, 100, 153, 11, 98, 175, 102, 166, 111, 225, 105, 111};
if (sslPolicyErrors == SslPolicyErrors.None)
{
// Good certificate.
return true;
}
bool certMatch = false; // Assume failure
byte[] certHash = certificate.GetCertHash();
if (certHash.Length == apiCertHash.Length)
{
certMatch = !certHash.Where((t, idx) => t != apiCertHash[idx]).Any();
}
return certMatch;
}
所有这一切都适用于我的_httpClient.PostAsync()
和_httpClient.GetAsync()
但仅限于WINDOWS 。另一方面,在Xamarin.Android中,我无法通过HTTPS访问我的服务器,所有请求都会挂起,直到抛出TaskCancelledException。我可以通过模拟器的浏览器通过HTTP和HTTPS访问我的服务器(我会收到证书警告) AND 通过我的应用程序通过HTTP访问它。当我尝试在Xamarin.Android应用程序中使用HTTPS时,我的ValidateCert
未被调用,服务器根本看不到任何请求。该应用具有所有可能的权限。