31

証明書のシリアル番号は X509 証明書の一意のキーですか? ユーザーが証明書を選択すると、プログラムはシリアル番号を設定に保存します。次のコードは、選択した証明書を返しますか?

public static X509Certificate2 GetCertificateBySerialNumber(string serialNumber)
{
    X509Certificate2 selectedCertificate = null;
    X509Store store = null;
    try
    {
        // get certificate from the store "My", "CurrentUser"
        store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
        X509Certificate2Collection allCertificates = (X509Certificate2Collection)store.Certificates;
        X509Certificate2Collection foundCertificates = (X509Certificate2Collection)allCertificates.Find(X509FindType.FindBySerialNumber, serialNumber, false);

        // select the first certificate in collection
        foreach (X509Certificate2 certificate in foundCertificates)
        {
            selectedCertificate = certificate;
            break;
        }
    }
    finally
    {
        if (store != null)
        {
            store.Close();
        }
    }

    return selectedCertificate;
}

更新: jglouieで提案されているように、証明書の拇印を使用することになりました。

4

4 に答える 4

21

いいえ。たとえば、OpenSSLでは、ユーザーが証明書を作成するときにこれを設定できます。

参照:http ://www.openssl.org/docs/apps/x509.html

-set_serial nは、使用するシリアル番号を指定します。このオプションは、-signkeyまたは-CAオプションのいずれかと一緒に使用できます。-CAオプションと組み合わせて使用​​する場合、シリアル番号ファイル(-CAserialまたは-CAcreateserialオプションで指定)は使用されません。

シリアル番号は、10進数または16進数(前に0xが付いている場合)にすることができます。負のシリアル番号も指定できますが、その使用はお勧めしません。

于 2012-02-01T22:12:57.857 に答える
14

TL;DR : 発行者名とシリアル番号の複合キーを使用する必要があります。単純なキーが必要な場合は、証明書の拇印を使用します。


security.stackexchange から @ThomasPornin を引用:

証明書では、シリアル番号は証明書を発行した CA によって選択されます。証明書に書いてあるだけです。CA は、シリアル番号を任意の方法で選択できますが、必ずしもランダムに選択する必要はありません (20 バイトに収まる必要があります)。CA は固有のシリアル番号、つまりCA固有のシリアル番号を選択することになっています。シリアル番号が世界中で一意であるとは期待できません。X.509 の夢の世界では、世界的に一意なのは issuerDN+serial のペアです (各 CA は独自の識別名を持ち、シリアル番号を再利用しないように注意します)。

拇印は、署名を含むすべてのフィールドを含む完全な証明書に対して計算されたハッシュ値です。これは、特定の証明書に対して、使用されるハッシュ関数の固有の衝突耐性まで、世界中で一意です。Microsoft ソフトウェアは SHA-1 を使用する傾向があり、理論的な弱点がいくつか知られていますが、実際の衝突は (まだ) 発生していません。

から: https://security.stackexchange.com/questions/35691/what-is-the-difference-between-serial-number-and-thumbprint

于 2015-10-08T11:57:54.070 に答える
13

別の回答で述べたように、シリアル番号は CA 内で一意である必要があります。したがって、シリアル番号だけを証明書の一意の ID として使用することはできません。異なる CA からの証明書が同じシリアル番号を持つことができます。Issuer プロパティと SerialNumber プロパティの組み合わせを保存する必要があります。また、自己署名証明書と自作の CA ソフトウェアの場合、多くの人が 0 から番号付けを開始するため、番号が衝突する可能性が高くなります。

于 2012-08-03T19:15:03.883 に答える
10

はい、X.509仕様によると、シリアル番号は特定のCAに固有です。

4.1.2.2シリアル番号

シリアル番号は、CAによって各証明書に割り当てられた整数です。特定のCAによって発行された証明書ごとに一意である必要があります(つまり、発行者名とシリアル番号は一意の証明書を識別します)。

于 2012-03-18T21:48:16.950 に答える