我已经创建了我的自签名的证书,并将其安装到我的客户的信任的根,用于.PFX [服务器端]来确认认证和认证进展顺利,没有任何错误任何人都可以创建虚假认证吗?
但是有一个问题,真的混淆我有没有什么办法让黑客伪造我的客户端的身份验证?用他的假证书和服务器?
例子:
我的代码来验证认证
private static bool OnCertificateValidation(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
{
if (CaVerify(chain) && ServerVerify(certificate)) return true;
}
return false;
}
public static bool CaVerify(X509Chain chain)
{
if (chain.ChainElements.Count > 0)
{
var certHash = chain.ChainElements[chain.ChainElements.Count - 1].Certificate.GetCertHash();
if (certHash.Length == ApiCertHash.Length)
{
for (var idx = 0; idx < certHash.Length; idx++)
{
if (certHash[idx] == ApiCertHash[idx])
{
return true;
}
}
}
}
return false;
}
public static bool ServerVerify(X509Certificate certificate)
{
var certHash = certificate.GetCertHash();
if (certHash.Length == ApiCertHash.Length)
{
for (var idx = 0; idx < certHash.Length; idx++)
{
if (certHash[idx] == ApiCertHash[idx])
{
return true;
}
}
}
return false;
}
所以可能有人创建一个假certification.pfx和其关联到他的假服务器和我的客户端连接到他的假服务器?
是的,他能,*他的机器上只* 。这不会是一个“主要在中东”,攻击者控制一个端点,对此你可以做的事情不多。你可以把在证书的指纹,但一个更聪明的想法是把CA的指纹和检查,这样你可以发布新的证书(说你需要改变你要连接的DNS名称,你会需要一个新的证书并为此颁发新的证书指纹)。我将添加一些快速代码来演示如何。 –
因此,Ssl只是为了保护我的客户端服务器免受MITM攻击,而不是控制客户端的EndPoint? –
保护端点是可行的。如果最终用户可以运行任意代码,那么你已经丢失了。攻击者所要做的就是附加他自己的调试器,他们可以在正在运行的程序中做任何他们想做的事情。你可以让它变得很难,但是你无法阻止它。 “阻止它”的唯一方法是不允许最终用户运行他们想要的任何东西。一个例子是** un-jailbroken ** iPhone,用户只能从应用程序商店运行应用程序,而商店没有调试工具,因此最终用户无法攻击该程序。但如果越狱...你是你开始的地方,无法阻止它。 –