我正在构建一个加密 Web 应用程序,它允许用户在浏览器中的客户端进行签名和加密。该应用程序必须与 IE 和 Firefox 兼容。它在 IE 中的 Firefox 中运行良好我面临一个问题。
最近,印度政府开始向个人颁发两份数字证书,一份用于签署数据,一份用于加密。这些证书具有相同的 CN。我正在使用以下代码循环遍历证书。
public static Certificate selectedCert = null;
KeyStore keystore1 ;
keystore1 = KeyStore.getInstance("Windows-MY");
keystore1.load(null, null);
if (keystore1 != null) {
enumeration = keystore1.aliases();
while (enumeration.hasMoreElements()) {
alias = enumeration.nextElement();
selectedCert = keystore1.getCertificate(alias));
System.out.println(selectedCert.getPublicKey());
}
}
从 firefox 密钥库读取证书时,别名由 firefox 生成,它们是唯一的,但在 IE 中,它从 IE 获取证书,它以通用名称 (CN) 作为别名。这样,它会获得两个具有相同别名的此类条目。现在,每当我想获得整个证书对象时,我都必须传递别名,所以每当我传递别名时,它总是会给我第一个证书,而我无法访问具有相同别名的第二个证书。
澄清一下,如果我有两个以“Kuntal Shah”名义的证书和一个以“Abhishek Desai”名义的证书。然后当我这样做时,别名枚举将具有“Kuntal Shah”“Kuntal Shah”“Abhishek Desai”
selectedCert = keystore1.getCertificate(alias));
它总是返回我第一个,而我永远无法得到第二个。
我在 C# 中尝试了一些代码,我有一个更简单的解决方案
X509Store storeMy = new X509Store(StoreName.My,StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.ReadOnly);
Console.WriteLine("Found certs with the following subject " +"names in the {0} store:", storeMy.Name);
foreach (X509Certificate2 cert in storeMy.Certificates)
{
Console.WriteLine("\t{0}", cert.SubjectName.Name);
}
但这不适用于 firefox,也不适用于 Linux。
谁能告诉我如何访问第二个证书?或者还有其他不同的方式吗?