В чем разница между реализацией 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" .../>