0

主にキーストアからデジタル証明書にアクセスするために使用される Java でアプレットを開発しました。

ほとんどの場合、アプレットは問題なく動作しますが、一部の安全な銀行ネットワークでは、アプレットの動作が予測不能になります。

HTML でアプレット タグを使用してアプレットにアクセスしています。

私の最初の質問は、これには JNLP を使用してデプロイする必要があるかということです。

2 つ目は、過去に 1 つのテスト アプリケーションを用意したことです。アプレットの 1 つのメソッドを呼び出すだけで、すべての証明書の公開情報をロードしてコンソールに表示することができました。以前は問題なく動作していました。

以下は同じコードです。

アプレット方式

   public void init() {
    printMessageToConsole("Applet Initialized Version : " + appletVersion);
    browserName = "Internet Explorer";
    try {
        String osName = System.getProperty("os.name");
        printMessageToConsole("Operating system name =>" + osName);

    } catch (Exception e) {
        printMessageToConsole("Error in Get OS Init.");
        e.printStackTrace();
    }
}


 public List<String> getCertificateAllDetails() throws NoSuchFieldException,
        SecurityException, IllegalArgumentException,
        IllegalAccessException, NoSuchMethodException,
        InvocationTargetException {
    printMessageToConsole("Get All Certificate Details");
    String certString = "";
    int count =0;
    String pubKey = "";
    KeyStore browserKeyStore = null;
    String certDetails = "";
    browserKeyStore = initializeBrowserKeyStore();
    List<String> resultValues = new ArrayList<String>();
    String aliasnew = null;

    printMessageToConsole(browserName);
    if (browserKeyStore != null) {
        printMessageToConsole("INSIDE IE CERTIFICATE READING");
        Field spiField = KeyStore.class.getDeclaredField("keyStoreSpi");
        spiField.setAccessible(true);
        KeyStoreSpi spi = (KeyStoreSpi) spiField.get(browserKeyStore);
        Field entriesField = spi.getClass().getSuperclass().getDeclaredField("entries");
        entriesField.setAccessible(true);
        @SuppressWarnings("rawtypes")
        Collection entries = (Collection) entriesField.get(spi);
        resultValues.add("Total Certificates in Browser : " + entries.size() + "<br><br><br>");
        printMessageToConsole("Total Certificates in Browser : " + entries.size());
        for (Object entry : entries) {
            aliasnew = (String) invokeGetter(entry, "getAlias");
            PrivateKey privateKey = (PrivateKey) invokeGetter(entry,"getPrivateKey");
            X509Certificate[] certificateChain = (X509Certificate[]) invokeGetter(entry, "getCertificateChain");
            for (X509Certificate current : certificateChain) {
                certString = "";
                if (certDetails != null && getkeyUsage(current.getKeyUsage()) != "") {
                    count ++;
                    pubKey = this.bASE64Encoder.encode(current.getPublicKey().getEncoded());
                    certDetails = getX509CertificateDetails(current);
                    Map<String, String> valueMap = new HashMap<String, String>();
                    valueMap = getMetadata(certDetails);
                    certString += "====================== Certificate Details for Certificate No : " + count + "======================<br>";
                    certString += "Alias : " + aliasnew + " <br>";
                    certString += "Name : "+ valueMap.get(CERT_DETAILS.NAME) + " <br>";
                    certString += "Key Usage : " + getkeyUsage(current.getKeyUsage()) + "<br>";
                    certString += "CNName : "+ valueMap.get(CERT_DETAILS.CN_NAME) + "<br>";
                    printMessageToConsole(certString);
                    resultValues.add(certString);
                    break;
                } else {
                    printMessageToConsole("Cert Details is NULL");
                }
            }
        }
    }
    else {
        printMessageToConsole("Keystore is NULL");
    }

    return resultValues;
}

HTML ページ

<html>
<head> 
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<SCRIPT LANGUAGE="JavaScript">
    function getAllCertificates()
    {
        document.write("Certificate Reading Started.")
        var certificates = document.securityApplet.getCertificateAllDetails();
        document.write(certificates);


    }
</SCRIPT>
<body>
    <div>Digital Certificate Test Application</div>
    <script src="http://www.java.com/js/deployJava.js"></script>

    <applet name="securityApplet" code="SecurityApplet.class"
    archive="securityApplet.jar" width="0" height="0" MAYSCRIPT="true"
    scriptable="true" > </applet>
    <button type="button" onclick="getAllCertificates()">Load Certificates!</button>

</body>

最近このページを開いたところ、ローカル ネットワークでアプレットが適切に初期化されましたが、ボタンをクリックしてもそれ以上呼び出すことができません。

ページのロード時のコンソール出力。

Applet Initialized Version : 30
Operating system name =>Windows 7
basic: Applet initialized
basic: Starting applet
basic: completed perf rollup
basic: Applet made visible
basic: Applet started
basic: Told clients applet is started

上記のロードまではすべて問題ありません

[証明書の読み込み] ボタンをクリックすると、次のようなコンソール ログが表示されますが、何も起こりません。そして、セキュリティで保護されたネットワークでは、最後の 2 行さえ来ません。

basic: Starting applet teardown
basic: Finished applet teardown
basic: Removed progress listener: sun.plugin.util.ProgressMonitorAdapter@1b9bbe8
plugin2manager.parentwindowDispose

以下は、ループに入るコンソール出力です。

同じことについての答えを楽しみにしています。前もって感謝します。

4

1 に答える 1