Ошибку InvocationTargetException при чтении сертификата из хранилища я победил. А подписание jar-ник апплета сертификатом не помогло.
Теперь другая проблема:
java.lang.NoClassDefFoundError: org/bouncycastle/cms/CMSAttributeTableGenerator
Cause:java.lang.ClassNotFoundException: org.bouncycastle.cms.CMSAttributeTableGenerator
Где-то в этом коде:
CAdESSignature cadesSignature = new CAdESSignature(detached);
cadesSignature.setCertificateStore(getCollectionStore(chain));
// Создаем подписанта CAdES-BES.
cadesSignature.addSigner(CAdESConfig.getDefaultDigestSignatureProvider(), JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID,
privateKey, chain, CAdESType.CAdES_BES, null, false, getSignedAttributes(), getUnsignedAttributes());
// Создаем подписанта CAdES-X Long Type 1.
cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_X_Long_Type_1, tsa_address);
CMSAttributeTableGenerator.class расположен в bcmail-jdk16.jar
Апплет грузится в этом html-коде:
<applet code="applet.CryptoJCPApplet.class" WIDTH="400" HEIGHT="60"
id="jcpapplet" codebase="$dcs.crypto/applet"
archive="JCPApplet.jar, bcmail-jdk16.jar, bcprov-jdk16.jar, bctsp-jdk16.jar, commons-logging.jar, junit.jar, serializer.jar, xalan.jar, xmlsec.jar, xml-apis.jar, xercesImpl.jar"
ALT="Java applet CryptoPro JCP"></applet>
Где все внешние jar-ники перечислены. Сами jar-ники расположены в той же папке, что и апплет.
Причем если вызывать классы bouncycastle напрямую из апплета - всё нормально.
ClassNotFoundException только когда их из CAdES.jar вызывают.
В качестве эксперимента, скопировал все jar-ники из jcp папки dependencies в JRE (C:\Program Files (x86)\Java\jre7\lib\ext\) и данная ошибка исчезла.
Вопрос: нужно ли содержимое dependencies вручную копировать в JRE и если нет - как заставить CAdES "видеть" их там же, где и апплет?
Отредактировано пользователем 27 марта 2013 г. 8:28:03(UTC)
| Причина: Не указана