证书序列号是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 所示。
答案 0 :(得分:14)
没有。例如,OpenSSL让用户在创建证书时设置它。
请参阅:http://www.openssl.org/docs/apps/x509.html
-set_serial n指定要使用的序列号。此选项可与-signkey或-CA选项一起使用。如果结合使用 使用-CA选项编写序列号文件(由...指定) - 未使用-CAserial或-CAcreateserial选项。
序列号可以是十进制或十六进制(如果前面带有0x)。负 也可以指定序列号,但不建议使用它们。
答案 1 :(得分:10)
如另一个答案所述,序列号在CA中必须是唯一的。因此,单独的序列号不能用作证书的唯一ID - 来自不同CA的证书可以具有相同的序列号。您需要存储Issuer和SerialNumber属性的组合。此外,对于自签名证书和自制CA软件,数字很可能会发生冲突,因为许多人将从0开始编号。
答案 2 :(得分:4)
是的,根据X.509 specification序列号对于特定CA来说是唯一的:
4.1.2.2序列号
序列号是CA为每个分配的整数 证书。对于每个颁发的证书,它必须是唯一的 给定CA(即发行者名称和序列号标识唯一 证书)。
答案 3 :(得分:3)
TL; DR :您必须使用发卡行名称+序列号的复合密钥。如果您需要一个简单的密钥,请使用证书的指纹。
从security.stackexchange引用@ThomasPornin:
在certificate中,序列号由颁发的CA选择 证书。它只是写在证书中。 CA可以 以任何方式选择序列号,不一定 随机(并且它必须适合20个字节)。 CA 假定可供选择 唯一的序列号,即CA 的唯一。你不能指望 序列号在全球范围内独一无二;在X.509的梦想世界中, 它是pair issuerDN + serial,在全球范围内是唯一的(每个CA. 拥有自己独特的专有名称,并注意不要重复使用 序列号)。
指纹是在整个证书上计算的哈希值, 其中包括其所有字段,包括签名。那是 世界上独一无二的,对于给定的证书,直至固有的 使用哈希函数的抗冲突性。微软软件 倾向于使用SHA-1,其中已知一些理论上的弱点, 但是还没有产生实际的碰撞。