Я изменяю подписанный апплет, который использует сертификат пользователя для подключения к сервлету, а затем подтверждает некоторую информацию о пользователе (его имя - псевдоним. Это официальный сертификат).
В основном он использует 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");
}
Что противоречит ошибке «Отсутствует провайдер» ...
Есть идеи?