web-dev-qa-db-ja.com

シリアル番号はX509証明書の一意のキーですか?

証明書のシリアル番号は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で提案されているように、証明書の拇印を使用することになりました。

19
isobretatel

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

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

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

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

14
jglouie

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

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

4.1.2.2シリアル番号

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

4
alexkasko

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


Security.stackexchangeから@ThomasPorninを引用:

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

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

差出人: https://security.stackexchange.com/questions/35691/what-is-the-difference-between-serial-number-and-thumbprint

3
Dinei