2012-02-01 7 views
15

証明書シリアル番号は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; 
} 

UPDATE:jglouieにより示唆されるように私は、証明書の拇印を使用して終了。

+1

サムネイル≠拇印 –

+0

更新日:拇印を使用します。 – isobretatel

答えて

12

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

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

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

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

3

はい、X.509 specificationシリアル番号に応じて、特定のCAに一意である:

4.1.2.2シリアル番号

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

+7

シリアル番号のみでは、異なるCAの証明書に同じシリアル番号を付けることができるため、証明書を一意に識別することはできません。 –

10

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

+3

+1。または、シリアルナンバーが何であるかという手がかりがないので、常に0に設定します; – TomTom

2

TL:DR:発行者名+シリアル番号の複合キーを使用する必要があります。単純なキーが必要な場合は、証明書の拇印を使用します。 security.stackexchangeから@ThomasPorninを引用


certificate

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

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

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

+2

https://shattered.io/ SHA-1は正式に壊れています。 – foo