В чем разница между реализацией SSL протокола SSL и JSSE для SSL на TOMCAT5.5
Я настраиваю SSL для поддержки HTTPS на TOMCAT 5.5, поэтому я упомянул http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html, в котором подробно описывается, как реализовать SSL.
В этом документе описаны два способа реализации SSL: реализация APR и реализация JSSE. Интересно, какая разница между ними, включая их недостатки и преимущества.
Ответы
Ответ 1
Разница в том, что JDK использует собственную реализацию SSL, в то время как APR использует то, что установлено на компьютере, то есть OpenSSL в большинстве случаев.
Если у вас низкий/средний трафик для https, решение Java просто отлично, но для очень большой загрузки (например, когда большая часть страниц работает на https), собственное решение OpenSSL намного лучше, и его можно перекомпилировать и оптимизировать, поэтому он будет работать еще быстрее и будет потреблять меньше ресурсов.
Основным недостатком APR + OpenSSL является то, что он требует большей настройки и настройки + тестирования, версия Java работает просто из коробки.
То, что я обычно делаю, заключается в том, чтобы всегда использовать стандартное Java-решение Java вместе с инструментами мониторинга, и если трафик становится тяжелым, и только, чем тратить усилия на настройку APR-решения.
Ответ 2
При использовании APR Tomcat может использовать движок OpenSSL, уязвимый для ошибки Heartbleed (http://heartbleed.com).
Затем вы можете просто переключить свой сервер .xml из APR:
<-- Define a APR SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol"
port="8443" .../>
К реализации Java SSL, которая не уязвима этой ошибкой:
<-- Define a blocking Java SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector protocol="org.apache.coyote.http11.Http11Protocol"
port="8443" .../>
Или, если вы хотите использовать APR в любом случае, убедитесь, что вы используете библиотеку Tomcat Native, которая была скомпилирована с версией OpenSSL, которая не уязвима для Heartbleed (OpenSSL 1.0.1g или выше), см. https://issues.apache.org/bugzilla/show_bug.cgi?id=56363.
Ответ 3
Версия Tomcat менее 5.5.29 поддерживает не новый атрибут соединителя "allowUnsafeLegacyRenegotiation", и если вы используете старую java-машину (jvm 1.6 или ранее без исправлений безопасности) и не хотите обновлять или java ни Tomcat - единственный способ - использовать APR.
См:
О пакетах защиты от RFC 5746 CVE-2009-3555
О патчах Tomcat
О уязвимости MITM
Ответ 4
В следующей таблице, взятой из официальных документов Tomcat, показано, как соединители связаны друг с другом. Наиболее важные отличия, изображенные в таблице:
- APR поддерживается с Tomcat 5.5.x, NIO был добавлен в Tomcat 6.x, а NIO2 добавлен в Tomcat 8.x.
- APR может использовать только OpenSSL, но NIO и NIO2 могут использовать либо JSSE, либо OpenSSL.
- APR блокируется при выполнении рукопожатия SSL, в то время как другие два не делают.
![OpenSSL connector comparison]()
Также обратите внимание на это утверждение, которое показывает отличную совместимость между атрибутами конфигурации JSSE и OpenSSL начиная с Tomcat 8.5:
Соединители NIO и NIO2 используют либо реализацию JSSE Java SSL, либо реализацию OpenSSL, тогда как APR/собственный соединитель использует только OpenSSL. До Tomcat 8.5 различные атрибуты конфигурации использовались для JSSE и OpenSSL. Начиная с Tomcat 8.5 и, насколько это возможно, общие атрибуты конфигурации используются как для JSSE, так и для OpenSSL. Также, если используется реализация JSSE OpenSSL, конфигурация может быть установлена с использованием атрибутов JSSE или APR (примечание: но не оба типа в одной и той же конфигурации). Это делается для упрощения переключения между реализациями коннекторов для коннекторов SSL.
В инструкции Tomcat SSL есть раздел, в котором более подробно рассматривается взаимосвязь между коннекторами. Вот как заставить NIO или NIO2 использовать JSSE:
<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO implementation -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
port="8443" .../>
<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO2 implementation -->
<Connector protocol="org.apache.coyote.http11.Http11Nio2Protocol"
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
port="8443" .../>
А вот как настроить NIO для использования OpenSSL (аналогично для NIO2):
<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO implementation and OpenSSL -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443"
sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
.../>
Наконец, чтобы настроить APR:
<!-- Define an HTTP/1.1 Connector on port 8443, APR implementation -->
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol"
port="8443" .../>