9

如何比较两个 X509Certificate2 对象?

我需要找出两个证书是否相同。这是出于用户身份验证的目的,我需要确定两个证书是否属于同一个人。

我可以使用它的序列号或指纹属性吗?还是有其他方法?

我也是新手,想知道使用 X509Certificate 进行用户身份验证是否安全?

4

3 回答 3

12

指纹是证书的唯一值,通常用于在证书存储中查找特定证书。更多的...

序列号是证书颁发者颁发的唯一编号。更多的...

于 2012-07-12T10:24:50.357 回答
2

正如@Rattle 指出的那样:

出于安全目的比较证书时,不应使用 Equals 方法。而是使用RawData属性或 Thumbprint属性的哈希值。


晚会(最近需要自己比较两个 X509 证书)。

X509Certificate类有一个Equals()方法:

如果两个对象是 X509Certificate 对象并且它们具有相同的颁发者和序列号,则认为它们是相等的。

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);
        }
    }

}
于 2019-07-26T06:30:53.843 回答
0

晚了,但是...

请注意,X509 证书本质上是身份(专有名称,证书所有者的“名称”)和公钥之间的绑定,使用第三方(称为证书颁发机构或加利福尼亚州)。

X509 证书是公开的,可以克隆、复制等。仅凭证书不足以验证其所有者。

身份验证方案通常必须确保所有者拥有与证书中的公钥相关联的私钥,通常通过执行私钥操作,如签署质询(随机数或随机位序列)。然后接收方验证操作是使用正确的私钥(使用证书中的公钥)执行的。只有当两个密钥都来自同一对时,验证才会成功(这是公钥密码学的本质)。

此外,接收方必须验证证书:查看颁发者和所有者身份,检查颁发者是否是经批准的 CA,证书是否适合预期用途(有效期、策略和密钥使用),证书是否签名通过使用 CA 证书中的公钥有效 - 直接受信任,或由受信任的更高级别 CA 签名 - 证书仍然有效(证书过期,没有什么是永恒的!),并且颁发证书的 CA 不会撤销证书。

@Rattle 指出的重要一点是,为了比较证书(例如,将代码签名者的证书与一组批准的证书进行比较时),您不应该使用X509Certificate.Equals() 方法。而是比较指纹。

于 2020-11-20T10:59:09.053 回答