«Модуль Secmod уже настроен» в апплете при перезагрузке - PullRequest
0 голосов
/ 10 октября 2011

Я изменяю подписанный апплет, который использует сертификат пользователя для подключения к сервлету, а затем подтверждает некоторую информацию о пользователе (его имя - псевдоним. Это официальный сертификат).

В основном он использует getLocalCertificates () (после подключения), и в Explorer он отлично работает, возвращая псевдоним и подключаясь к сервлету, защищенному SSL, и возвращая информацию о пользователе. В Firefox (и Chrome, и Safari ...) он возвращает пустое значение как псевдоним и возвращает 403.

Итак, я реализовал систему setSSLSocketFactory () для Firefox на основе загрузки сертификатов в локальную базу данных NSS.

Это ошибка, которую я получаю в консоли Java Firefox.

Я получаю эту ошибку:

·· _pk11provider 
      _pk11provider Secmod module already configured
  ·· Set keyStore: 
java.lang.IllegalArgumentException: missing provider
    at java.security.KeyStore.getInstance(Unknown Source)
    at com.cmt.applets.notif.AppletNotif.setMozillaKeyStore(AppletNotif.java:1635)
    at com.cmt.applets.notif.AppletNotif.setAlias(AppletNotif.java:1404)
    at com.cmt.applets.notif.AppletNotif.init(AppletNotif.java:223)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception: java.lang.IllegalArgumentException: missing provider

Код для Firefox (на данный момент только для Windows) -

[...]

String userProfile = Mozilla.getMozillaUserProfileDirectory();

// Define provider
String providerConfig = "name = NSS" + "\n" + "nssLibraryDirectory = "
        + dir + "\n" + "nssSecmodDirectory = \"" + userProfile + "\"\n"
        + "nssDbMode = readOnly" + "\n" + "nssModule = keystore" + "\n"
        + "\r";

// Load Firefox Dlls
Mozilla.loadDll(dir);

ByteArrayInputStream localByteArrayInputStream = new ByteArrayInputStream(
        providerConfig.getBytes());

SunPKCS11 pk11provider = null;

System.out.println("  ·· _pk11provider ");
try {

    pk11provider = new SunPKCS11(localByteArrayInputStream);
    System.out.println("    ·· addProvider(_pk11provider) ");
    Security.addProvider(pk11provider);
    System.out.println("    ·· _pk11provider.login ");
    pk11provider.login(new Subject(), new DialogCallbackHandler());
//} catch (Throwable e) {
} catch (Exception e) {
    System.out.println("      _pk11provider " + e.getMessage());
}

// Set keyStore using PKCS11 (for NSS Firefox)
System.out.println("  ·· Set keyStore: ");

try {
    keyStore = KeyStore.getInstance("PKCS11", pk11provider);
} catch (KeyStoreException e) {
    System.out.println("   Exception en keyStore.getInstance");
    e.printStackTrace();
}

System.out.println("    ·· Load keystore");

try {
    keyStore.load(localByteArrayInputStream, null);
} catch (NoSuchAlgorithmException e) {
    System.out.println("   NoSuchAlgorithmException en keyStore.load(). ");
    e.printStackTrace();
} catch (CertificateException e) {
    System.out.println("   CertificateException en keyStore.load(). ");
    e.printStackTrace();
} catch (IOException e) {
    System.out.println("   IOException en keyStore.load(). ");
    e.printStackTrace();
}

System.out.println("localByteArrayInputStream.close() ");
try { 
    localByteArrayInputStream.close(); 
} catch(final Exception e) 
{ 
    System.out.println("localByteArrayInputStream.close() " + e.getMessage());
}

[...]

Этот код вызывается из Applet.init () ... поэтому его следует вызывать только в первый раз. Это работает ... один раз. Если я перезагружаю апплет на той же вкладке Firefox, я получаю сообщение об ошибке «Отсутствует поставщик» из-за «Модуль Secmod уже настроен»

В поиске «Модуль Secmod уже настроен» в Google и Bing я получаю исходный код библиотеки Java для SunPKCS11.java:

if (nssModule.hasInitializedProvider()) {
    throw new ProviderException(
        "Secmod module already configured");
}

Что противоречит ошибке «Отсутствует провайдер» ...

Есть идеи?

1 Ответ

0 голосов
/ 11 октября 2011

удалось решить с помощью довольно простого решения ...

Я сделал SunPKCS11 pk11provider = null частной статической глобальной переменной. Тогда я только инициализирую, если это нуль. Да, использовать глобальную переменную безобразно, но она работает.

...