2013-06-12 5 views
3

Прежде всего, я относительно новичок в Java (и не очень продвинутый в программировании вообще), поэтому, если я пропустил что-то очевидное, я заранее извиняюсь за то, что тратил ваше время ,Java-апплет не может получить доступ к хранилищу сертификатов Firefox

Я пытаюсь создать апплет, который будет иметь доступ к Firefox «Магазин сертификатов. Что было испорчено, так это то, что я поклялся, что этот код работал, когда я его написал, и сначала проверил его; Затем я сместился в компьютер и после перезагрузки он больше не работал и с тех пор.

Он всегда терпит неудачу в самом начале - в KeyStore ks = KeyStore.getInstance("PKCS11"); с

java.security.KeyStoreException: PKCS11 not found 
at java.security.KeyStore.getInstance(Unknown Source) 

и

Caused by: java.security.NoSuchAlgorithmException: PKCS11 KeyStore not available 
at sun.security.jca.GetInstance.getInstance(Unknown Source) 

Я не думаю, что есть что-то, что это актуально в коде, но до сих пор, вот функция, не удалось:

/* Process PDF with Firefox */ 
private static byte[] processFirefox() throws GeneralSecurityException, IOException, DocumentException { 
    KeyStore ks = KeyStore.getInstance("PKCS11"); 
    ks.load(null, "myPassword".toCharArray()); 
    String alias = (String) ks.aliases().nextElement(); 
    PrivateKey pk = (PrivateKey) ks.getKey(alias, null); 
    Certificate[] chain = ks.getCertificateChain(alias); 
    @SuppressWarnings("unused") 
    TSAClient tsaClient = null; 
    for (int i = 0; i < chain.length; i++) { 
     X509Certificate cert = (X509Certificate)chain[i]; 
     String tsaUrl = CertificateUtil.getTSAURL(cert); 
     if (tsaUrl != null) { 
      tsaClient = new TSAClientBouncyCastle(tsaUrl); 
      break; 
     } 
    } 
    List<CrlClient> crlList = new ArrayList<CrlClient>(); 
    crlList.add(new CrlClientOnline(chain)); 
    return SignPDF.sign(chain, pk, DigestAlgorithms.SHA256, "PKCS11", CryptoStandard.CMS, "A Reason", "A Location", null, null, null, 0); 
} 

Сначала я подумал, что это потому, что я не специфицировал ify провайдера. Тогда я сделал, и ничего не изменилось. Что интересно, я также попробовал запустить тот же апплет в Chrome, и он дал мне ту же ошибку. Поэтому я предполагаю, что либо апплет не может получить доступ/читать хранилище сертификатов Firefox, либо что-то еще происходит совсем. Тот же код работает отлично, если я заменю PKCS11 на "Windows-MY", "SunMSCAPI" и пароль для null, поэтому я думаю, что это проблема, характерная для PKCS11/Firefox.

Итак, я мог бы действительно помочь с этим. Я прочитал буквально каждый хит Google на первых двух страницах результатов поиска, но либо я слишком зеленый для них, чтобы помочь, либо они действительно не были достаточно полезными.

Если я забыл добавить какую-либо важную информацию, которая поможет вам помочь, сообщите мне.

Спасибо! Ben

ответ

0

Возможно, ваша настройка безопасности изменилась?

Проверьте эти ссылки:

Вы можете получить доступ к местоположению магазина, используя простой FileReader?

+0

Я думал, что это может быть что-то вроде этого. Я попытался снизить настройки безопасности в java cpl до самого низкого значения. Я попытался настроить настройки безопасности браузера. Я попробовал подписанную банку без знака. Он просто не работает. Как сказано, он работает для типа «Windows-MY» и поставщика «SunMSCAPI», поэтому я предполагаю, что речь идет не о правах доступа Java. Я не совсем понял, как использовать FileReader. Я могу получить доступ к файлу cert8.db Firefox, но, как сказано, апплет не работает в KeyStore.getInstance, поэтому прежде чем я загружу KeyStore из InputStream. –

+0

- Работает ли это, если вы просто извлекаете эту часть кода и запускаете ее как автономное приложение Java? - Проверьте это: http://docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html - Правильно ли настроен ваш провайдер? - Возможно, вы хотите попытаться динамически создать поставщика? 'String configName =" /opt/bar/cfg/pkcs11.cfg "; Поставщик p = new sun.security.pkcs11.SunPKCS11 (configName); Security.addProvider (p); ' – TFuto

+0

Я перепроверял все несколько раз, возился с конфигом, пытался динамически создавать провайдера и запускать все как автономное приложение. Нет торта. Я начинаю думать, что я думал, что он работает в первый раз. Думаю, я просто попытаюсь найти альтернативный способ сделать это. NSS/JSS кажутся хорошими идеями, хотя мне нужно выяснить, как получить каталог профиля пользователя Firefox «на лету» (FF1.7 + больше не разрешает веб-страницы AFAIK). Но это еще один вопрос. –

Смежные вопросы