0

ユーザーがブラウザ内のクライアント側で署名および暗号化できる暗号化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番目の証明書にアクセスする方法を教えてもらえますか?それとも他の方法がありますか?

4

2 に答える 2

0

私はこの解決策が好きではありませんが、deleteEntryを呼び出すことができるかもしれません。必要なエイリアスをロードし、証明書が必要なものであるかどうかを確認します。そうでない場合は、削除してください。次に、もう一度ロードしてみてください。多分あなたはそれらをすべてそのように読むことができます。KeyStore.storeを呼び出さないように注意してください。IEで証明書を削除したくない。

于 2012-06-14T00:12:04.553 に答える
0

このソリューションは、他のソリューションよりもさらに醜いですが、実際には機能する可能性があります。リフレクションを使用して、すべてのキーおよび証明書エントリのコレクションに直接アクセスできます。

public void printKeystore() {
    Field spiField = KeyStore.class.getDeclaredField("keyStoreSpi");
    spiField.setAccessible(true);
    KeyStoreSpi spi = (KeyStoreSpi) spiField.get(keystore1);
    Field entriesField = spi.getClass().getSuperclass().getDeclaredField("entries");
    entriesField.setAccessible(true);
    Collection entries = (Collection) entriesField.get(spi);
    for (Object entry : entries) {
        String alias = (String) invokeGetter(entry, "getAlias");
        Key privateKey = (Key) invokeGetter(entry, "getPrivateKey");
        X509Certificate[] certificateChain = (X509Certificate[]) invokeGetter(entry, "getCertificateChain");
        System.out.println(alias + ": " + privateKey + Arrays.toString(certificateChain));
    }
}

private Object invokeGetter(Object instance, String methodName)
        throws NoSuchMethodException, IllegalAccessException,
        InvocationTargetException {
    Method getAlias = instance.getClass().getDeclaredMethod(methodName);
    getAlias.setAccessible(true);
    return getAlias.invoke(instance);
}
于 2012-06-14T01:59:25.510 に答える