Я знаю, что ssl_handshake_failure - это общая ошибка, однако это мое последнее средство, поскольку я занимаюсь этой проблемой в течение трех недель.
Я развертываю сервер Apache HTTPD на сервере AIX. В AIX нет стандартного репозитория, поэтому я установил его из пакетов RPM с perzl.org/aix/
Мне было нелегко решить все зависимости, но в конце концов я заставил это работать. Я надеюсь, что RPM не позволит мне сделать это без всех необходимых зависимостей.
Сервер apache работает очень хорошо, когда я использую только HTTP через порт 80. Проблемы возникают, когда я пытаюсь подключиться к нему через порт 443.
Я тестирую это с помощью следующей команды:
openssl s_client -state -connect 127.0.0.1:443
Как только я запускаю эту команду, я получаю:
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
Затем OpenSSL ждет около двух минут, а затем выдает следующую ошибку:
804401144:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 305 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1505947800
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
Это очень странно, кажется, что апач не отправляет никаких данных обратно, то по истечении некоторого времени ожидания клиент OpenSSL «утомляется» ожиданием и выдает ошибку.
Я постарался сделать свою конфигурацию настолько простой, насколько мог, так как сейчас я просто хочу завершить рукопожатие.
Это мой httpd-ssl.conf
LoadModule ssl_module /opt/freeware/lib/httpd/modules/mod_ssl.so
Listen 443
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4
SSLProtocol all -SSLv3
<VirtualHost *:443>
DocumentRoot "/usr/local/Tomcat/tomcat1/webapps/ROOT"
ServerName <server_name>:443
ServerAdmin root@localhost
ErrorLog "logs/httpd/ssl_error_log"
LogLevel trace8
TransferLog "logs/httpd/ssl_access_log"
LogLevel trace8
SSLEngine on
SSLCertificateFile "cert.crt"
SSLCertificateKeyFile "cert.key"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/var/log/httpd/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
Я поместил все журналы на уровень trace8, но это мне не помогло, когда я пытаюсь завершить рукопожатие ssl, это все, что я получаю от ssl_error_log:
[ssl:info] [client 127.0.0.1:36193] AH01964: Connection to child 66 established (server <server_name>:443)
[ssl:trace2] ssl_engine_rand.c(125): Seeding PRNG with 136 bytes of entropy
[ssl:trace3] ssl_engine_kernel.c(1988): [client 127.0.0.1:36193] OpenSSL: Handshake: start
[ssl:trace3] ssl_engine_kernel.c(1996): [client 127.0.0.1:36193] OpenSSL: Loop: before/accept initialization
[ssl:info] [client 194.10.155.114:52781] AH01964: Connection to child 65 established (server <server_name>:443)
[ssl:trace2] ssl_engine_rand.c(125): Seeding PRNG with 136 bytes of entropy
[ssl:trace3] ssl_engine_kernel.c(1988): [client 194.10.155.114:52781] OpenSSL: Handshake: start
[ssl:trace3] ssl_engine_kernel.c(1996): [client 194.10.155.114:52781] OpenSSL: Loop: before/accept initialization
Версия OpenSSL:
OpenSSL 1.0.2j-fips 26 Sep 2016
Версия Apache HTTPD:
Server version: Apache/2.4.25 (Unix)
Есть идеи, что мне может не хватать, ребята? Почему для появления ошибки рукопожатия требуется значительное время, как и для ошибки тайм-аута?
Боюсь, это может быть что-то фиктивное, которое я пропустил, или какие-то сложные проблемы с зависимостями, поскольку я не устанавливал его из какого-либо репо.
Есть догадки?
Используйте настоящее имя сервера вместо "ServerName <server_name>:443
". https://httpd.apache.org/docs/current/en/mod/core.html#servername
«Если ServerName не указан, сервер пытается вывести видимое клиентом имя хоста, сначала запрашивая у операционной системы имя хоста системы, а если это не удается, выполняя обратный поиск по IP-адресу, присутствующему в системе».