C# 如何比较两个X509C证书#
如何比较两个X509Certificate2对象 我需要找出两个证书是否相同。这是为了用户身份验证,我需要找出两个证书是否属于同一个人 我可以使用它的序列号或thumprint属性吗?或者还有其他方法吗C# 如何比较两个X509C证书#,c#,.net,winforms,C#,.net,Winforms,如何比较两个X509Certificate2对象 我需要找出两个证书是否相同。这是为了用户身份验证,我需要找出两个证书是否属于同一个人 我可以使用它的序列号或thumprint属性吗?或者还有其他方法吗 另外,我还不熟悉这一点,我想知道使用X509Certificate进行用户身份验证是否安全?指纹是证书的唯一值,通常用于在证书存储中查找特定证书 序列号是由证书颁发者颁发的唯一编号 正如@Crattle所指出的: 比较的证书时不应使用Equals方法 安全目的。相反,使用RawData属性的散列
另外,我还不熟悉这一点,我想知道使用X509Certificate进行用户身份验证是否安全?指纹是证书的唯一值,通常用于在证书存储中查找特定证书
序列号是由证书颁发者颁发的唯一编号 正如@Crattle所指出的: 比较的证书时不应使用Equals方法 安全目的。相反,使用RawData属性的散列,或 指纹属性
迟到(最近我自己需要比较两个X509证书) 该类有一个方法: 如果两个对象是X509Certificate对象,则认为它们相等 他们有相同的发行人和序列号 很晚了,但是 请注意,X509证书本质上是身份(一个有区别的名称,证书所有者的“名称”)和公钥之间的绑定,由第三方(称为证书颁发机构或CA)的私钥签名 X509证书是公共的,可以进行克隆、复制等操作。仅凭一个证书不足以验证其所有者 身份验证方案通常必须确保所有者拥有与证书中的公钥相关联的私钥,通常通过执行私钥操作,如签名质询(nonce或随机位序列)。然后,接收方验证操作是否使用正确的私钥(使用证书中的公钥)执行。只有当两个密钥来自同一对时,验证才会成功(这是公钥密码的本质) 此外,接收者必须验证证书:查看颁发者和所有者身份,检查颁发者是否是经批准的CA,证书是否适合预期用途(有效日期、策略和密钥使用),证书签名通过使用CA证书中的公钥(直接受信任或由受信任的更高级别CA签名)有效,证书仍然有效(证书过期,没有任何东西是永恒的!),并且发出证书的CA未吊销证书 @Crattle指出的一件重要事情是,对于比较证书(例如,当比较代码签名者的证书与一组经批准的证书时),不应使用。
比较指纹。谢谢,这就是我需要知道的:)证书上还有其他独特的属性,但它们中的任何一个不仅可以用于在商店中查找证书,而且可以确保它是相同的未更改证书吗?换句话说,我想其中一些可能是伪造的。有安全的吗?我想序列号是可以伪造的。指纹安全吗?GetCertHash()安全吗?它们是一样的吗?请注意警告“出于安全目的,在比较证书时不应使用Equals方法。相反,请使用RawData属性或Thumbprint属性的散列。”@bragg:hmm,说得好,我没有注意到这一点。感谢MS将警告放在页面底部而不是顶部!让你想知道什么才是真正的平等?我会更新我的答案。纯粹是猜测,但我想有人指出比较的方法不太安全,但是更改实现会破坏现有的有效用法,所以他们通过文档进行修复。看起来这个警告是去年1月才添加的,这取决于你浏览该页面所需的时间,当你浏览时它可能不在那里。我想知道它有多不安全?我想这可能会允许拥有可信根私钥的人伪造证书。
using System;
using System.Security.Cryptography.X509Certificates;
public class X509
{
public static void Main()
{
// The paths to the certificate signed files
string Certificate = @"Signed1.exe";
string OtherCertificate = @"Signed2.exe";
// Starting with .NET Framework 4.6, the X509Certificate type implements the IDisposable interface...
using (X509Certificate certOne = X509Certificate.CreateFromCertFile(Certificate))
using (X509Certificate certTwo = X509Certificate.CreateFromCertFile(OtherCertificate))
{
bool result = certOne.Equals(certTwo);
Console.WriteLine(result);
}
}
}