Недавно мы были вынуждены перенести наши производственные облачные серверы с GoDaddy на Azure, потому что GoDaddy прекращает работу службы облачных серверов.
Одним из наших серверов был CentOS 5.7 со стеком JasperReports Bitnami. В процессе миграции я обновляю все серверы до последней версии и перестраиваю Jasper из образа Azure Bitnami Jasper в Ubuntu 12.04LTS.
У вас должен быть установлен сертификат SSL на JasperServer и он работает правильно
Все новые серверы работают прекрасно, вот где возникает проблема.
У нас также есть выделенный виртуальный сервер CentOS 5.8 на GoDaddy, который остается там (пока), на указанном сервере есть набор сайтов, которые обслуживают отчеты от Джаспера через Soap.
Однако при попытке подключения возникают сбои рукопожатия.
#openssl s_client -connect newjasperserver.com:443
CONNECTED(00000003)
9092:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:583:
и:
#openssl version
OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
новый сервер работает:
#openssl version
OpenSSL 1.0.1c 10 May 2012
Теперь, после долгих исследований, выяснилось, что существует несовместимость между OpenSSL <0.9.8k и OpenSSL 1.0.1.
Я определил следующие варианты:
Перенести сервер на сервер CentOS 6.4 в Azure (идеально, но политически сложно, не спрашивайте, почему)
Обновите сервер на месте (не поддерживается, и я не хочу пробовать его на рабочем сервере)
Протрите сервер и восстановите его с помощью 6.4 (хотя, возможно, если я это сделаю, я принудительно выберу вариант 1)
Удалите OpenSSL с сервера и установите более новую версию (опять же, что-то мне не нравится на рабочем сервере)
Установите второй экземпляр OpenSSL (мой вариант №2, но я не уверен, что делать дальше)
Установите альтернативу OpenSSL (даже не задумываясь об этом)
Отключите принудительное шифрование на сервере Jasper и разрешите соединение через http (это похоже на мое лучшее временное решение, пока я не смогу принудительно перенести этот сервер в Azure)
Есть ли варианты, которые я пропустил? Есть ли способ на стороне Jasper разрешить соединения из более старого OpenSSL?
Несовместимость, с которой вы столкнулись, заключается в следующем:
Версия OpenSSL на RHEL5 (и ее производных) вообще не рекламирует поддержку TLS. Это только SSLv3 и SSLv2.
Версия OpenSSL на RHEL6 (и ее производных) поддерживает TLS вплоть до TLSv1.2. Он также поддерживает SSLv3, но хочет согласовать TLS.
Oни должен по-прежнему иметь возможность согласовывать сеанс, так как существует (небольшой) список общих шифров для них обоих, но в зависимости от того, что вы выбрали для настроек шифрования на сервере (например, для смягчения BEAST, устранения шифров с низким уровнем безопасности и т. .) не может быть никаких общих шифров, которые клиент и сервер могут использовать для связи.
Наборы шифров для сервера будут установлены в <Connector ciphers=
в вашем Tomcat server.xml
или в Apache SSLCipherSuite
если он у вас сидит за апачем. Клиент будет использовать все, что он был настроен для использования, или DEFAULT
в противном случае.
Решение - проверить комплекты шифров на сервере, например с участием openssl ciphers -v STRING
где STRING - это то, что вы настроили на сервере, повторяя то же самое на клиенте, а затем настраивая один или оба до тех пор, пока не будет доступен набор шифров, который будет согласован обоими.