| ||||
| ||||
Пытаюсь исполнить пример из tls.html. Причем как целиком, так и по отдельности клиент и сервер. 1) Комментирую строки запуска клиента, в начале main() добавляю код: System.setProperty("javax.net.ssl.trustStore", "c:\\...\\newtrust"); System.setProperty("javax.net.ssl.trustStorePassword", "tomcat"); System.setProperty("javax.net.ssl.keyStoreType", "FloppyStore"); Вставляю System.in.read() после старта сервера, просто чтобы он не выгружался. Во FloppyStore лежит ключ, с ним цепочка длины 2, этот ключ успешно используется сервером IIS. Делаю csptest -tlsc, чтобы проверить работоспособность сервера. Получаю результат: C:\Program Files\Crypto Pro\CSP>csptest -tlsc -server 127.0.0.1 -port 1357 -proto 4 -v CSP (Type:71) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED. CSP (Type:75) v3.0.3293 KC1 Release OS:Windows CPU:IA32 FastCode:READY,ENABLED. csptest -tlsc -server 127.0.0.1 -port 1357 -proto 4 -v 76 bytes of handshake data sent 1699 bytes of handshake data received **** Error 0x80090308 returned by InitializeSecurityContext (2) An error occurred in running the program. .\WebClient.c:417:Error performing handshake. Error number 57 (87). Параметр задан неверно. Total: SYS: 0.016 sec USR: 0.063 sec UTC: 0.250 sec [ErrorCode: 0x00000001] То есть сервер из примера не работает, причем симптомы такие же, как у Tomcat. Сам сервер выдает ошибку "Server error:javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake". 2) Наоборот, закомментировал код вызова сервера, остальное байт в байт как в примере. Пытаюсь подключиться к "www.dan.shved" (Это моя машина), на порт 443, который слушает IIS. Получаю ошибку: ... (SSLHandshakeException):...:PKIX path building failed at ru.CryptoPro.ssl.G.a(Unknown source) Caused by: java.security.cert.CertificateException Caused by: sun.security.provider.certpath.SunCertPathBuilderException Ну хорошо, мое предположение: сертификат от сервера получен, но проверить его подлинность не удается. Тогда я добавил в начало main() строки: System.setProperty("javax.net.ssl.trustStore", "c:\\...\\newtrust"); System.setProperty("javax.net.ssl.trustStorePassword", "tomcat"); Получаю ошибку: Exception in thread "main" javax.net.ssl.SSLException: java.lang.RuntimeException: Invalid key exchange at ru.CryptoPro.ssl.G.a(Unknown Source) ... Caused by: java.lang.RuntimeException: Invalid key exchange at ru.CryptoPro.ssl.a.n(Unknown Source) ... Caused by: java.security.InvalidKeyException: Illegal key size or default parameters at javax.crypto.Cipher.a(DashoA13*..) ... 3) Пытаюсь запустить весь пример целиком. Ошибки - примерно как в случае 2 (только клиент). Если не делать System.setProperty(...), т.е. оставить код как в "руководстве программиста", то сервер говорит: Server error:javax.net.ssl.SSLHandshakeException: no cipher suites in common, а клиент: Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: HANDSHAKE_FAILURE at ru.CryptoPro.ssl.G.a(Unknown Source) ... Если же прописать keystore и truststore в System.setProperty(), то сервер говорит: Server error:javax.net.ssl.SSLException: Received fatal alert: INTERNAL_ERROR а клиент: Exception in thread "main" javax.net.ssl.SSLException: java.lang.RuntimeException: Invalid key exchange at ru.CryptoPro.ssl.G.a(Unknown Source) ... PS: файл c:\...\newstore существует, его можно загрузить d MainControlPane, и там лежит один сертификат, импортированный из .cer-файла - самоподписанный сертификат Test Center CRYPTO-PRO. Подскажите, пожалуйста, что не так. | ||||
Ответы: | ||||
| ||||
для запуска сервера из примера необходимо указать путь для пары: закрытый ключ обмена - сертификат аутентификации сервера: System.setProperty("javax.net.ssl.keyStoreType","FloppyStore"); System.setProperty("javax.net.ssl.keyStorePassword","password"); (см. руководство) настройки для клиента: System.setProperty("javax.net.ssl.trustStore", "c:\\...\\newtrust"); System.setProperty("javax.net.ssl.trustStorePassword", "tomcat"); System.setProperty("javax.net.ssl.keyStoreType", "HDImageStore"); удачи | ||||
| ||||
Скачал JTLS 1.0.28 и пришёл точно к такому же результату, причём выставил все системные проперти, скажите пожалуйста как нибудь удалось устранить эту ошибку( и как вообще понимать сообщение Illegal key size or default parameters, я неправильно сгенерил ключ, или как?) | ||||
| ||||
1)Запустите класс CheckConf из samples.jar\ComLine, он проверит основные настройки провайдеров JCP, Crypto и JTLS. 2)Из руководства: "Возможна ситуация, когда установленная SUNовская JRE имеет экспортные ограничения. США запрешает экспорт "сильной" криптографии и JCP с длиной ключа 256 бит попадает под это ограничение. Ограничения устанавливаются файлами local_policy.jar и US_export_policy.jar в каталоге <JRE>/jre/lib/security. Для снятия экспортных ограничений необходимо скачать файл с политиками со страницы http://java.sun.com/j2se/1.4.2/download.html. Для отладки же можно просто скопировать US_export_policy.jar в local_policy.jar." | ||||
| ||||
Сделал всё как Вы сказали, CheckConf говорит, что всё настроено правильно, скачал policy jar-ники для jre1.6.0. Установка соединения происходит без проблем, а вот данные не передаются. В примере из руководства по JTLS отменил аутентификацию клиента, выставил системные переменные. Соединение устанавливается, но программа валится тк в течение таймаута из InputStream не удаётся достать ничего. (Увеличение таймаутов ни на что не влияет) | ||||
| ||||
Будем разбираться... | ||||
| ||||
Вышли новые версии JCP и JTLS. | ||||
| ||||
Действительно после установки новой версии всё заработало.... | ||||