如何确保我的软件连接到正确的服务器
本文关键字:连接 服务器 软件 我的 何确保 确保 | 更新日期: 2023-09-27 18:37:25
我有一个用SSL证书标识自己的服务器。证书是自签名的。
我想确保如果用户尝试替换服务器并将"假"证书添加到操作系统信任的证书列表中,该软件不会发送数据。
这是我到目前为止想出的:
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
bool result = false;
if (sender is HttpWebRequest)
{
var wr = sender as HttpWebRequest;
if (wr.Address.Host == "<my host>")
{
if (cert == null)
{
return false;
}
if (cert.GetCertHashString() == "<certificate hash string>")
{
return true;
}
return false;
}
}
return result;
}
我理解代码的方式是,它将信任我的证书my host
,但它不会受到用户主机替换的保护。
我希望软件仅在 in 使用 <certificate hash string>
标识自己的证书时才接受my host
,如果my host
提供其他证书,则必须拒绝连接。
我该怎么做?
由于您事先知道服务器如何确保我的软件连接到正确的服务器?
,因此您知道服务器应使用的证书和公钥。要利用这些知识,请使用一种称为固定的技术。OWASP在证书和公钥固定中对此进行了讨论。
C# 的代码相当简单。以下摘自OWASP页面。它连接到 Google,并确保服务器使用预期的公钥:
// Encoded RSAPublicKey
private static String PUB_KEY = "30818902818100C4A06B7B52F8D17DC1CCB47362" +
"C64AB799AAE19E245A7559E9CEEC7D8AA4DF07CB0B21FDFD763C63A313A668FE9D764E" +
"D913C51A676788DB62AF624F422C2F112C1316922AA5D37823CD9F43D1FC54513D14B2" +
"9E36991F08A042C42EAAEEE5FE8E2CB10167174A359CEBF6FACC2C9CA933AD403137EE" +
"2C3F4CBED9460129C72B0203010001";
public static void Main(string[] args)
{
ServicePointManager.ServerCertificateValidationCallback = PinPublicKey;
WebRequest wr = WebRequest.Create("https://encrypted.google.com/");
wr.GetResponse();
}
public static bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (null == certificate)
return false;
String pk = certificate.GetPublicKeyString();
if (pk.Equals(PUB_KEY))
return true;
// Bad dog
return false;
}
证书固定不适用于 Google 和其他一些公司。这是因为他们每 30 天左右轮换一次证书,以保持移动客户端的 CRL 较小。但是他们重新认证相同的公钥,以允许固定等关键连续性方案正常工作。因此,公钥固定将按预期工作。