我创建了自签名证书,并将其安装到我的客户端的受信任根目录,并用于.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并将其与他的假服务器关联并将我的客户端连接到他的假服务器上吗?
答案 0 :(得分:4)
SSL证书的公用名(CN)字段应该是您尝试连接的主机的DNS名称。您“信任”“ 受信任的 根证书授权人”,他们不会在不验证CN中列出的DNS名称所有权的情况下向CN颁发证书。
您已通过手动将证书颁发机构(CA)添加到“受信任”列表来绕过此操作。因此,计算机信任您的个人CA,其从服务器收到的证书被授权用于证书上列出的任何CN。
攻击者无法制作“假”证书,因为颁发未经授权的证书的CA不是“受信任”,因此验证失败。
这是合作代理经常工作的方式。 IT部门在工作站上安装CA.当您发出SSL请求时,它会通过代理,当回复时,代理会拦截“CN=*.google.com
由VeriSign签名”并发送到您的工作站“CN=*.google.com
,由XYZ Corperate Proxy签名”。由于IT 预安装受信任的根CA,浏览器不会抱怨。
但是,如果您使用某些不使用普通商店的浏览器,或者未安装CA,则会出现证书错误,因为您的计算机会看到“由XYZ合作代理签名”证书,而不知道该CA是谁,然后在sslPolicyErrors
参数上返回RemoteCertificateChainErrors
。
检查CA散列的代码示例。
if (sslPolicyErrors == SslPolicyErrors.None)
{
var apiCertHash = new byte[] { 0x79, 0x04, 0x15, 0xC5, 0xC4, 0xF1, 0x6A, 0xA7, 0xC9, 0x12, 0xBB, 0x23, 0xED, 0x5A, 0x60, 0xA7, 0x92, 0xA8, 0xD5, 0x94 };
if(chain.ChainElements.Count > 0)
{
//Not 100% if the root is first or last in the array. Don't have the program running to check.
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;
}
}
}
}
}
答案 1 :(得分:1)
如果您要使用自签名证书,则需要使用您提供的代码,否则只需使用
private static bool OnCertificateValidation(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}
return false;
}