Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
I. Автор: levandowskiy Автор: afev Caused by: java.io.IOException: Хранилище искажено или пароль неверный. at ru.CryptoPro.JCP.KeyStore.TrustStore.engineLoad(Unknown Source) Хранилище в панели JCP открывается с этим паролем?
В ControlPane происходит удивительное дело: 1. я создаю Certificate Store и задаю ему пароль 2. добавляю в него все необходимые сертификаты 3. закрываю панель 4. когда вновь ее открываю пароль к хранилищу не подходит - выдается сообщение об ошибке: Can't open the store. IO error: Keystore was tampered with, or password was incorrect. Я предполагаю, что у меня некорректно установилось JCP в связи с этим. Встречались ли вы когда-нибудь с подобной ошибкой? Запрос пароля происходит 1 раз при создании хранилища и добавлении сертификата? Или несколько раз? Какая версия jcp? II. Автор: levandowskiy И еще вот какой вопрос возникает: Я взял сертификат (.cer) полученный от НБКИ, положил его в CertStore icrsStore вот таким образом: Код:
Certificate certificate = generateCertificateFromFile(
new File(СERT_PATH + "\\icrs_nbki_ru_2013.cer"));
writeCertInStore(certificate, "nbki_main", CERT_STORE,
STORE_PATH, "123456");
где функция generateCertificateFromFile(File) - получает сертификат из файла: Код:
public static Certificate generateCertificateFromFile(File certFile) {
FileInputStream fis = null;
Certificate certificate = null;
try {
fis = new FileInputStream(certFile);
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
certificate = cf.generateCertificate(fis);
} catch (CertificateException ex) {
ex.printStackTrace();
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return certificate;
}
а функция writeCertInStore(Certificate, String, String, String, String) - записывает этот сертификат в хранилище Код:
public static void writeCertInStore(Certificate cert, String alias,
String storeType, String storePath, String storePassword)
throws Exception {
File file = new File(storePath);
KeyStore keyStore = KeyStore.getInstance(storeType, "JCP");
if (file.exists()) {
keyStore.load(new FileInputStream(storePath), storePassword.toCharArray());
} else {
keyStore.load(null, null);
}
keyStore.setCertificateEntry(alias, cert);
keyStore.store(new FileOutputStream(file), storePassword.toCharArray());
}
После этого попробовал соединиться с сервером вот так: Код:
public static void main(String[] args) throws Exception {
System.setProperty("javax.net.ssl.supportGVO", "true");
System.setProperty("javax.net.ssl.trustStoreType", "CertStore");
System.setProperty("javax.net.ssl.trustStore", DOCUMENTS_PATH + "\\icrsStore");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
final SSLSocketFactoryImpl sslFact = new SSLSocketFactoryImpl();
HttpsURLConnection.setDefaultSSLSocketFactory(sslFact);
URL url = new URL("https://icrs.demo.nbki.ru/");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
String response = "";
while ((line = rd.readLine()) != null) {
response += line + "\r\n";
}
rd.close();
is.close();
System.out.println(response);
connection.disconnect();
}
Java-машина выкидывает исключение: Код:
Exception in thread "main" javax.net.ssl.SSLException: Server selected improper ciphersuite SSL_NULL_WITH_NULL_NULL
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1747)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:231)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHello(ClientHandshaker.java:415)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:125)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:943)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)
at org.cashcom.nbch.connections.CryptoTest.main(CryptoTest.java:35)
Java Result: 1
У меня в коллекции сертификатов полученных от НБКИ лежали еще 4 файла с расширением p7b. Я решил их тоже засунуть в это хранилище. Для этого написал следующий код (все p7b сертификаты у меня хранятся в директории CERT_PATH): Код:
File[] files = new File(CERT_PATH).listFiles();
for (int i = 0, length = files.length; i < length; i++) {
Certificate[] certs = CertChainLoader.loadChain(files[i].getAbsolutePath());
for (int j = 0; j < certs.length; j++) {
writeCertInStore(certs[j], files[i].getName() + (j + 1),
CERT_STORE,
STORE_PATH, "123456");
}
}
storeInfo(STORE_PATH, CERT_STORE);
Попробовал выполнить снова подключение с тем же кодом что и раньше и получил точно такую же ошибку SSL_NULL_WITH_NULL_NULL ... Скажите в чем заключается моя ошибка? Предполагаю , что я неправильно добавляю цепочку сертификатов в контейнер или добавляю ее не в тот контейнер. Буду признателен за помощь В стектрейсе нет упоминания cpSSL (классы из пакета вида ru.CryptoPro.ssl) - создается впечатление, что он у вас не установлен (из какого пакета класс SSLSocketFactoryImpl?). Проверьте с помощью "java -cp samples.jar ComLine.CheckConfFull" - в списке проверяемых модулей должен быть cpSSL. Отредактировано пользователем 26 декабря 2013 г. 8:49:34(UTC)
| Причина: Не указана |