Dan*_*gen 5 c# ssl certificate
我已创建自签名证书并将其安装到我的客户端的受信任根目录并用于.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;
}
Run Code Online (Sandbox Code Playgroud)
那么有人可以创建一个假的certification.pfx并将其与他的假服务器关联并将我的客户端连接到他的假服务器上吗?
SSL 证书的通用名称 (CN) 字段应该是您尝试连接的主机的 DNS 名称。您“信任”“受信任的根证书颁发机构”,他们不会在未验证 CN 中列出的 DNS 名称的所有权的情况下颁发带有 CN 的证书。
您已通过手动将证书颁发机构 (CA) 添加到受信任列表来绕过此问题。因此,计算机信任您的个人 CA,它从服务器收到的证书被授权用于证书上列出的任何 CN。
攻击者无法制作“假”证书,因为颁发未经授权的证书的 CA 不“受信任”,因此验证失败。
这就是合作代理通常的工作方式。IT部门在工作站上安装CA。当您发出 SSL 请求时,它会通过代理,当回复返回时,代理会拦截“CN=*.google.com
由 VeriSign 签名”并将其发送到您的工作站“CN=*.google.com
由 XYZ 公司代理签名”。由于 IT 部门预先安装了受信任的根 CA,因此浏览器不会抱怨。
但是,如果您使用的浏览器不使用普通商店,或者没有安装 CA,您将收到证书错误,因为您的计算机将看到“由 XYZ Coperate Proxy 签名”证书,不知道该 CA 是谁,然后返回RemoteCertificateChainErrors
关于sslPolicyErrors
论证。
检查 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;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1896 次 |
最近记录: |