Можно ли включить HTTPS / TLS для Tomcat с использованием OpenSSL, не требуя собственных библиотек и APR? - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь включить HTTPS / TLS для Tomacat (8.x), предпочитая альтернативу OpenSSL, потому что конфигурация сертификата / ключа проще (по сравнению с обычным JSSE с хранилищем ключей).

Следовал официальной документации и включил раздел разъемов следующим образом:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
          sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
          maxThreads="150" SSLEnabled="true" scheme="https" secure="true">

        <SSLHostConfig protocols="TLSv1.2">
            <Certificate 
               certificateKeyFile="conf/MyKey.key"
               certificateFile="conf/MyCertificate.crt"
               type="RSA" />
        </SSLHostConfig>
    </Connector>

ПРИМЕЧАНИЕ , что я все еще использую Http11NioProtocol, а не разъем APR Http11AprProtocol.

Однако при такой конфигурации запуск завершается неудачно, так как эта комбинация конфигурации, по-видимому, требует собственных библиотек Tomcat для сборки и настройки:

14-Jun-2019 10:38:46.363 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-8443]]
 org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8443]]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:112)
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:549)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:875)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:621)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:644)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:309)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
Caused by: java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.Pool.create(J)J
    at org.apache.tomcat.jni.Pool.create(Native Method)
    at org.apache.tomcat.util.net.openssl.OpenSSLEngine.<clinit>(OpenSSLEngine.java:70)
    at org.apache.tomcat.util.net.openssl.OpenSSLUtil.getImplementedProtocols(OpenSSLUtil.java:61)
    at org.apache.tomcat.util.net.SSLUtilBase.<init>(SSLUtilBase.java:53)
    at org.apache.tomcat.util.net.openssl.OpenSSLUtil.<init>(OpenSSLUtil.java:41)
    at org.apache.tomcat.util.net.openssl.OpenSSLImplementation.getSSLUtil(OpenSSLImplementation.java:36)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:104)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:87)
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:225)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1082)
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:267)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:581)
    at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:66)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:993)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)

Я собрал и установил Tomcat нативную библиотеку + APR и настроил ее в пути класса Tomcat env, который устранил проблему, но это не имеет значения. Дело в том, разве библиотеки APR / native не требуются, только если я использую Http11AprProtocol, который я не использую? Что мне не хватает? Любые указатели / помощь будут высоко ценится. Спасибо!

1 Ответ

0 голосов
/ 19 июня 2019

Ошибка, которую я сделал, состояла в том, что я явно настроил sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation" в конфигурации Соединителя. Именно это вызывает зависимость от собственных библиотек и ошибку при запуске.

Не указывается sslImplementationName оставляет значение по умолчанию org.apache.tomcat.util.net.jsse.JSSEImplementation и отлично работает с сертификатом стиля OpenSSL и конфигурацией ключа. Конечный конфиг:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
          maxThreads="150" SSLEnabled="true" scheme="https" secure="true">

        <SSLHostConfig protocols="TLSv1.2">
            <Certificate 
               certificateKeyFile="conf/MyKey.key"
               certificateFile="conf/MyCertificate.crt"
               type="RSA" />
        </SSLHostConfig>
    </Connector>

Итак, ответ на главный вопрос: да, можно использовать чистую конфигурацию в стиле Java / JSSE со стилем OpenSSL SSLHostConfig.

(однако APR / OpenSSL с нативными библиотеками относительно более эффективны.)

...