09.07.2007 13:19:13Пример использования JTLS из руководства Ответов: 7
Даниил Швед, Астра-СТ
Пытаюсь исполнить пример из 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.

Подскажите, пожалуйста, что не так.
 
Ответы:
12.07.2007 15:14:44Ольга
для запуска сервера из примера необходимо указать путь для пары: закрытый ключ обмена - сертификат аутентификации сервера:

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");

удачи
26.08.2007 19:09:47Андрей
Скачал JTLS 1.0.28 и пришёл точно к такому же результату, причём выставил все системные проперти, скажите пожалуйста как нибудь удалось устранить эту ошибку( и как вообще понимать сообщение Illegal key size or default parameters, я неправильно сгенерил ключ, или как?)
27.08.2007 9:26:50Ольга
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."
29.08.2007 19:25:20Андрей
Сделал всё как Вы сказали, CheckConf говорит, что всё настроено правильно, скачал policy jar-ники для jre1.6.0.

Установка соединения происходит без проблем, а вот данные не передаются. В примере из руководства по JTLS отменил аутентификацию клиента, выставил системные переменные. Соединение устанавливается, но программа валится тк в течение таймаута из InputStream не удаётся достать ничего. (Увеличение таймаутов ни на что не влияет)
30.08.2007 14:19:06Ольга
Будем разбираться...
14.09.2007 15:05:50Ольга
Вышли новые версии JCP и JTLS.
25.09.2007 19:59:25Андрей
Действительно после установки новой версии всё заработало....