Вопрос или проблема
Я столкнулся с проблемой настройки моего Tomcat с библиотекой apr native,
у меня есть следующие данные:
- Tomcat: 7.0.42
- Java: 1.7.0_40-b43
- OS: Centos 6.4 (2.6.32-358.18.1.el6.i686)
- APR: 1.3.9
- Native lib: 1.1.27
- OpenSSL: openssl-1.0.0-27.el6_4.2.i686
Мой server.xml
выглядит так:
...
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
...
<Connector port="8443" protocol="HTTP/1.1"
SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
SSLCertificateFile="/tmp/monitoringPortalCert.pem"
SSLCertificateKeyFile="/tmp/monitoringPortalKey.pem"
SSLPassword="hide"
/>
...
Я скомпилировал библиотеку как следует:
./configure --with-apr=/usr/bin/apr-1-config --with-ssl=yes --prefix=$CATALINA_HOME
make && make install
APR загружается нормально:
Oct 06, 2013 7:55:14 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.27 using APR version 1.3.9.
Но я все еще получаю эту ошибку:
SEVERE: Failed to initialize the SSLEngine.
org.apache.tomcat.jni.Error: 70023: Эта функция не была реализована на этой платформе
Результат выполнения ./configure
[root@localhost native]# ./configure --with-apr=/usr/bin/apr-1-config --with-ssl=yes -- prefix=$CATALINA_HOME && make && make install
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking for working mkdir -p... yes
Tomcat Native Version: 1.1.27
checking for chosen layout... tcnative
checking for APR... yes
setting CC to "gcc"
setting CPP to "gcc -E"
checking for JDK location (please wait)... /usr/java/jdk1.7.0_40 from environment
checking Java platform... checking Java platform...
checking for sablevm... NONE
adding "-I/usr/java/jdk1.7.0_40/include" to TCNATIVE_PRIV_INCLUDES
checking os_type directory... linux
adding "-I/usr/java/jdk1.7.0_40/include/linux" to TCNATIVE_PRIV_INCLUDES
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for OpenSSL library... using openssl from /usr/lib and /usr/include
checking OpenSSL library version... ok
checking for OpenSSL DSA support... yes
setting TCNATIVE_LDFLAGS to "-lssl -lcrypto"
adding "-DHAVE_OPENSSL" to CFLAGS
setting TCNATIVE_LIBS to ""
setting TCNATIVE_LIBS to " /usr/lib/libapr-1.la -lpthread"
configure: creating ./config.status
config.status: creating tcnative.pc
config.status: creating Makefile
config.status: executing default commands
make[1]: Entering directory `/usr/apache-tomcat-7.0.42/bin/tomcat-native-1.1.27- src/jni/native'
make[1]: Nothing to be done for `local-all'.
make[1]: Leaving directory `/usr/apache-tomcat-7.0.42/bin/tomcat-native-1.1.27- src/jni/native'
make[1]: Entering directory `/usr/apache-tomcat-7.0.42/bin/tomcat-native-1.1.27- src/jni/native'
make[1]: Nothing to be done for `local-all'.
make[1]: Leaving directory `/usr/apache-tomcat-7.0.42/bin/tomcat-native-1.1.27- src/jni/native'
/usr/lib/apr-1/build/mkdir.sh /usr/apache-tomcat-7.0.42/include/apr-1 /usr/apache- tomcat-7.0.42/lib/pkgconfig \
/usr/apache-tomcat-7.0.42/lib /usr/apache-tomcat-7.0.42/bin
/usr/bin/install -c -m 644 tcnative.pc /usr/apache-tomcat-7.0.42/lib/pkgconfig/tcnative- 1.pc
list=""; for i in $list; do \
( cd $i ; make DESTDIR= install ); \
done
/bin/sh /usr/lib/apr-1/build/libtool --mode=install /usr/bin/install -c -m 755 libtcnative-1.la /usr/apache-tomcat-7.0.42/lib
libtool: install: /usr/bin/install -c -m 755 .libs/libtcnative-1.so.0.1.27 /usr/apache- tomcat-7.0.42/lib/libtcnative-1.so.0.1.27
libtool: install: (cd /usr/apache-tomcat-7.0.42/lib && { ln -s -f libtcnative- 1.so.0.1.27 libtcnative-1.so.0 || { rm -f libtcnative-1.so.0 && ln -s libtcnative- 1.so.0.1.27 libtcnative-1.so.0; }; })
libtool: install: (cd /usr/apache-tomcat-7.0.42/lib && { ln -s -f libtcnative- 1.so.0.1.27 libtcnative-1.so || { rm -f libtcnative-1.so && ln -s libtcnative-1.so.0.1.27 libtcnative-1.so; }; })
libtool: install: /usr/bin/install -c -m 755 .libs/libtcnative-1.lai /usr/apache-tomcat- 7.0.42/lib/libtcnative-1.la
libtool: install: /usr/bin/install -c -m 755 .libs/libtcnative-1.a /usr/apache-tomcat- 7.0.42/lib/libtcnative-1.a
libtool: install: chmod 644 /usr/apache-tomcat-7.0.42/lib/libtcnative-1.a
libtool: install: ranlib /usr/apache-tomcat-7.0.42/lib/libtcnative-1.a
libtool: install: warning: remember to run `libtool --finish /usr/local/apr/lib'
Результат выполнения make && make install:
make[1]: Entering directory `/usr/apache-tomcat-7.0.42/bin/tomcat-native-1.1.27- src/jni/native'
make[1]: Nothing to be done for `local-all'.
make[1]: Leaving directory `/usr/apache-tomcat-7.0.42/bin/tomcat-native-1.1.27- src/jni/native'
make[1]: Entering directory `/usr/apache-tomcat-7.0.42/bin/tomcat-native-1.1.27- src/jni/native'
make[1]: Nothing to be done for `local-all'.
make[1]: Leaving directory `/usr/apache-tomcat-7.0.42/bin/tomcat-native-1.1.27- src/jni/native'
/usr/lib/apr-1/build/mkdir.sh /usr/apache-tomcat-7.0.42/include/apr-1 /usr/apache- tomcat-7.0.42/lib/pkgconfig \
/usr/apache-tomcat-7.0.42/lib /usr/apache-tomcat-7.0.42/bin
/usr/bin/install -c -m 644 tcnative.pc /usr/apache-tomcat-7.0.42/lib/pkgconfig/tcnative- 1.pc
list=""; for i in $list; do \
( cd $i ; make DESTDIR= install ); \
done
/bin/sh /usr/lib/apr-1/build/libtool --mode=install /usr/bin/install -c -m 755 libtcnative-1.la /usr/apache-tomcat-7.0.42/lib
libtool: install: /usr/bin/install -c -m 755 .libs/libtcnative-1.so.0.1.27 /usr/apache- tomcat-7.0.42/lib/libtcnative-1.so.0.1.27
libtool: install: (cd /usr/apache-tomcat-7.0.42/lib && { ln -s -f libtcnative- 1.so.0.1.27 libtcnative-1.so.0 || { rm -f libtcnative-1.so.0 && ln -s libtcnative- 1.so.0.1.27 libtcnative-1.so.0; }; })
libtool: install: (cd /usr/apache-tomcat-7.0.42/lib && { ln -s -f libtcnative- 1.so.0.1.27 libtcnative-1.so || { rm -f libtcnative-1.so && ln -s libtcnative-1.so.0.1.27 libtcnative-1.so; }; })
libtool: install: /usr/bin/install -c -m 755 .libs/libtcnative-1.lai /usr/apache-tomcat- 7.0.42/lib/libtcnative-1.la
libtool: install: /usr/bin/install -c -m 755 .libs/libtcnative-1.a /usr/apache-tomcat- 7.0.42/lib/libtcnative-1.a
libtool: install: chmod 644 /usr/apache-tomcat-7.0.42/lib/libtcnative-1.a
libtool: install: ranlib /usr/apache-tomcat-7.0.42/lib/libtcnative-1.a
libtool: install: warning: remember to run `libtool --finish /usr/local/apr/lib'
Кажется, что все в порядке, но ошибка не объяснима.
Может кто-то помочь понять, где моя ошибка? Что я упускаю?
Я знаю, что это старое, но я подумал, что все равно дам на это ответ.
Единственная проблема, которую я вижу, это использование --with-ssl=yes
при настройке нативных библиотек. Я всегда использовал --with-ssl=/usr
при их настройке.
Ответ или решение
При настройке Apache Tomcat с использованием библиотеки APR на CentOS 6 и включением SSL могут возникать различные проблемы. Ваше описание ситуации предоставило много информации, и я помогу вам разобраться с проблемой, особенно с ошибкой «Failed to initialize the SSLEngine. org.apache.tomcat.jni.Error: 70023: This function has not been implemented on this platform».
Анализ проблемы
Судя по вашему описанию, вся основная часть системы установлена и настроена. Вы используете:
- Tomcat: 7.0.42
- Java: 1.7.0_40
- CentOS: 6.4
- APR: 1.3.9
- OpenSSL: openssl-1.0.0
Ошибка, которую вы получаете, часто указывает на то, что функция SSL, которую вы пытаетесь использовать, не поддерживается вашей версией библиотеки APR или компиляцией вашей Tomcat Native. Ваша конфигурация с использованием --with-ssl=yes
при компиляции Tomcat Native может быть причиной проблемы.
Рекомендации по решению
-
Переустановите Tomcat Native, указав путь до OpenSSL:
Вместо--with-ssl=yes
, попробуйте использовать--with-ssl=/usr
. Ваша команда компиляции должна выглядеть как:./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr --prefix=$CATALINA_HOME make && make install
Это укажет системе использовать библиотеки OpenSSL, установленные в вашей системе, и может помочь устранить несовместимости между разными версиями.
-
Проверьте поддержку SSL в вашей библиотеке APR:
Убедитесь, что ваша версия APR поддерживает необходимые функции OpenSSL. Иногда более старые версии могут иметь ограничения в функционале. Вы можете попробовать обновить APR до версии 1.4.0 или новее, если это возможно. -
Логи и подробные сообщения об ошибках:
Обратите внимание на логи Tomcat (например,catalina.out
) для получения более детальной информации о возможных ошибках во время инициализации SSLEngine. Часто в них можно найти сведения о том, какого компонента или функции не хватает. -
Проверка файлов сертификата:
Убедитесь, что файлы сертификата (SSLCertificateFile
иSSLCertificateKeyFile
) корректны и что права доступа к ним установлены для пользователя, под которым запускается Tomcat. Неправильные пути или разрешения могут также вызвать ошибки при инициализации SSL. -
Проверка сборки:
Убедитесь, что при компиляции библиотек Tomcat Native были установлены все необходимые заголовочные файлы и зависимости. Проверьте, нет ли ошибок при компиляции:make clean ./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr --prefix=$CATALINA_HOME make
Заключение
Использование правильных аргументов при компиляции библиотек Tomcat Native часто решает проблемы с SSL. Попробуйте изменить параметр --with-ssl
и убедитесь, что все сертификаты и ключи корректны. Если после этих действий проблема сохраняется, возможно, нужно будет рассмотреть возможность обновления компонентов или более детально изучить проблему с помощью логов.