ユーザーがブラウザ内のクライアント側で署名および暗号化できる暗号化Webアプリケーションを構築しています。アプリケーションはIEおよびFirefoxと互換性がある必要があります。IEのFirefoxでは完全に正常に動作します。1つの問題に直面しています。
最近、インド政府は、データの署名用と暗号化用の2つのデジタル証明書を個人に発行し始めました。これらの証明書には同じ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)を取得します。そうすれば、同じエイリアスを持つ2つのそのようなエントリを取得します。これで、証明書オブジェクト全体を取得する場合は常にエイリアスを渡す必要があるため、エイリアスを渡すと常に最初の証明書が提供され、同じエイリアス名の2番目の証明書にアクセスできなくなります。
さらに明確にするために、「Kuntal Shah」という名前の証明書が2つ、「AbhishekDesai」という名前の証明書が1つある場合。次に、エイリアスの列挙には、「Kuntal Shah」、「Kuntal Shah」、「AbhishekDesai」が含まれます。
selectedCert = keystore1.getCertificate(alias));
それは常に私に最初のものを返します、そして私は決して2番目のものを手に入れることができません。
私は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では機能しません。
2番目の証明書にアクセスする方法を教えてもらえますか?それとも他の方法がありますか?