Илдар Posted October 29, 2019 Posted October 29, 2019 Известно, что в отличие от многих других сайтов, api.github.com разрешает доступ к себе ТОЛЬКО (не ниже) по TLS 1.2 Пример PHP скрипта, генерирующий ошибку: <?php $arr_hosts = array( 'yandex.ru' ,'api.github.com' ); foreach($arr_hosts as $host){ print "check $host:<br/>\r\n"; $fp = stream_socket_client("tlsv1.2://$host:443", $errno, $errstr, 30); if (!$fp) { die("Unable to connect: $errstr ($errno)"); } $header = "GET / HTTP/1.0\r\nHost: $host\r\nAccept: */*\r\n\r\n"; print $header; fwrite($fp, $header); if (!feof($fp)) { echo fgets($fp, 1024); } fclose($fp); } ?> Выдаёт ошибку "error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version" : Цитата check yandex.ru:<br/> GET / HTTP/1.0 Host: yandex.ru Accept: */* HTTP/1.1 200 Ok check api.github.com:<br/> <br /> <b>Warning</b>: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version in <b>/opt/share/www/test_crypto.php</b> on line <b>42</b><br /> <br /> <b>Warning</b>: stream_socket_client(): Failed to enable crypto in <b>/opt/share/www/test_crypto.php</b> on line <b>42</b><br /> <br /> <b>Warning</b>: stream_socket_client(): unable to connect to tlsv1.2://api.github.com:443 (Unknown error) in <b>/opt/share/www/test_crypto.php</b> on line <b>42</b><br /> Unable to connect: (0) учитывая, что curl работает корректно curl https://api.github.com/repos/danog/MagicalSerializer/zipball/87b6ed05a86021e9364f31133089bb83980d5e24 Поставил на десктоп PHP 7.2.22, там тестовый скрипт отрабатывает без ошибок. , могу предположить что PHP как-то криво откомпилирован, либо его версия под линукс работает некорректно. Что тут можно сделать? Quote
Илдар Posted October 29, 2019 Author Posted October 29, 2019 Добавлю также, что проблема очевидно не в тестовом скрипте (способе доступа к сайту), т.к. споткнулся на этом composer, который пытался скачать зависимости. Quote
Александр Рыжов Posted October 30, 2019 Posted October 30, 2019 Entware ≠ Debian. Это вопрос конфигурирования пакетов на роутере. Если хотите аналогичного поведения, посмотрите на своём десктопе секцию default_conf в /etc/ssl/openssl.cnf и соответвующим образом поправьте в Entware /opt/etc/ssl/openssl.cnf. Quote
Илдар Posted October 30, 2019 Author Posted October 30, 2019 Не очень понятно, почему вопрос конфигурирования OpenSSL, если другие утилиты, его использующие (curl например) коннектятся корректно. Десктоп в моём случае = windows, там есть только идущий вместе с PHP libssl-1_1.dll без файлов конфигурации SSL и с пустой секцией по openssl в php.ini т.е. никаких настроек. Quote
Александр Рыжов Posted October 30, 2019 Posted October 30, 2019 3 часа назад, Илдар сказал: Не очень понятно, почему вопрос конфигурирования OpenSSL, если другие утилиты, его использующие (curl например) коннектятся корректно. Я в душе́ не знаю почему на предложение о renegotiation со стороны api.github.com PHP скатывается в TLS1.0, curl так не делает. Если не предлагать renegotiation (что видно в выводе openssl s_client -connect api.github.com:443 -tls1_3), то при указаниии в PHP контекста "tlsv1.3" соединение устанавливается нормально. Опциями в /etc/ssl/openssl.cnf Debian запрещает использование всего, что хуже TLS1.2 для всех пакетов системы: # System default openssl_conf = default_conf … [default_conf] ssl_conf = ssl_sect [ssl_sect] system_default = system_default_sect [system_default_sect] MinProtocol = TLSv1.2 #CipherString = DEFAULT@SECLEVEL=2 Этим и пресекаются попытки PHP скатиться в TLS1.0. Аналогичные правки вы можете сделать и на Entware. Quote
Илдар Posted October 30, 2019 Author Posted October 30, 2019 добавил в начало файла /opt/etc/ssl/openssl.cnf: Цитата openssl_conf = default_conf [default_conf] ssl_conf = ssl_sect [ssl_sect] system_default = system_default_sect [system_default_sect] MinProtocol = TLSv1.2 Однако же, ничего не изменилось. Проблема так и осталась. Quote
Александр Рыжов Posted October 30, 2019 Posted October 30, 2019 Почему в начало? Посмотрите как это сделано в том же Debian файлом patches\Set-systemwide-default-settings-for-libssl-users.patch В PHP-скриптах оставьте вместо "tlsv1.2" просто "tls". Придётся последовательно разбираться в вопросе, потому что если копипастить без понимая, то ничего не выйдет. Quote
Илдар Posted October 30, 2019 Author Posted October 30, 2019 отлично, сработало. приложу сюда файл, в следующий раз когда придётся фактори резет делать, пригодится. openssl.cnf Quote
Илдар Posted October 30, 2019 Author Posted October 30, 2019 Однако, для понимания, почему Цитата В PHP-скриптах оставьте вместо "tlsv1.2" просто "tls" ? Смутно представляю компиляцию PHP и связь с библиотеками, неужели всё же он был сконфигурирован с доступом к старым хидерам каким-то? Ведь на винде работает прекрасно и с tlsv1.2, а на роутере только с tls заработал, хотя версия точно такая же. Непонятно почему так. Quote
Илдар Posted November 2, 2019 Author Posted November 2, 2019 На самом деле проблема не решилась, так как для других сайтов и способов доступа опять возникают эта и подобные ошибки: OpenSSL Error messages: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure Жду пересборку последней версии PHP с корректными хидерами и версией OpenSSL. С этой версией PHP невозможна нормальная работа с интернетом. Quote
zyxmon Posted November 18, 2019 Posted November 18, 2019 В 02.11.2019 в 09:24, Илдар сказал: Жду пересборку последней версии PHP с корректными хидерами и версией OpenSSL. php собирается с корректными хедерами и версией openssl. Версия php будет обновлена после того, как это сделают в openwrt, и будет собрана с теми же опциями и хедерами, что и в openwrt. Quote
Илдар Posted November 18, 2019 Author Posted November 18, 2019 Цитата Zyxmon: Если хотите продолжать, то продолжайте в той теме, где начали. Приведите список установленных пакетов, укажите обновлялись ли пакеты (при обновлениях бывают ошибки, способы решения которых известны). Приводите информацию, конфиги, а не домыслы. Т.к. автообновление роутера до версии 3.1.10 привело к его неработоспособности, то был сброс настроек и всё было установлено заново с нуля. Список установленных пакетов: Скрытый текст ~ # opkg list-installed busybox - 1.31.0-1 ca-bundle - 20190110-1 coreutils - 8.30-2 coreutils-groups - 8.30-2 cron - 4.1-3 curl - 7.66.0-1 dropbear - 2019.78-2 entware-release - 1.0-2 etherwake - 1.09-5 findutils - 4.6.0-4 git - 2.22.0-1 git-http - 2.22.0-1 grep - 3.3-1 ldconfig - 2.27-8 libatomic - 7.4.0-8 libbz2 - 1.0.8-1 libc - 2.27-8 libcurl - 7.66.0-1 libdb47 - 4.7.25.4.NC-5 libexpat - 2.2.7-1 libffi - 3.2.1-3 libgcc - 7.4.0-8 libgdbm - 1.18.1-1 libgmp - 6.1.2-2 libgnutls - 3.6.9-2 libintl-full - 0.19.8.1-2 liblzma - 5.2.4-5 libncurses - 6.1-5 libncursesw - 6.1-5 libndm - 1.1.10-1a libnettle - 3.5.1-1 libopenssl - 1.1.1d-1 libopenssl-conf - 1.1.1d-1 libpcre - 8.43-1 libpthread - 2.27-8 librt - 2.27-8 libsqlite3 - 3290000-1 libssp - 7.4.0-8 libstdcpp - 7.4.0-8 libtirpc - 1.1.4-2 libuuid - 2.34-1 libxml2 - 2.9.9-2 lighttpd - 1.4.54-1 lighttpd-mod-access - 1.4.54-1 lighttpd-mod-accesslog - 1.4.54-1 lighttpd-mod-alias - 1.4.54-1 lighttpd-mod-auth - 1.4.54-1 lighttpd-mod-authn_file - 1.4.54-1 lighttpd-mod-fastcgi - 1.4.54-1 locales - 2.27-8 msmtp - 1.8.5-2 ndmq - 1.0.2-5a openssl-util - 1.1.1d-1 opkg - 2019-06-14-dcbc142e-1 opt-ndmsv2 - 1.0-12 perl - 5.28.1-2 perl-image-exiftool - 11.65+perl5.28-1 perlbase-base - 5.28.1-2 perlbase-bytes - 5.28.1-2 perlbase-class - 5.28.1-2 perlbase-config - 5.28.1-2 perlbase-cwd - 5.28.1-2 perlbase-dynaloader - 5.28.1-2 perlbase-encode - 5.28.1-2 perlbase-errno - 5.28.1-2 perlbase-essential - 5.28.1-2 perlbase-fcntl - 5.28.1-2 perlbase-file - 5.28.1-2 perlbase-filehandle - 5.28.1-2 perlbase-i18n - 5.28.1-2 perlbase-integer - 5.28.1-2 perlbase-io - 5.28.1-2 perlbase-list - 5.28.1-2 perlbase-locale - 5.28.1-2 perlbase-mime - 5.28.1-2 perlbase-params - 5.28.1-2 perlbase-posix - 5.28.1-2 perlbase-re - 5.28.1-2 perlbase-scalar - 5.28.1-2 perlbase-selectsaver - 5.28.1-2 perlbase-socket - 5.28.1-2 perlbase-symbol - 5.28.1-2 perlbase-tie - 5.28.1-2 perlbase-time - 5.28.1-2 perlbase-unicore - 5.28.1-2 perlbase-utf8 - 5.28.1-2 perlbase-xsloader - 5.28.1-2 php7 - 7.2.22-1 php7-cgi - 7.2.22-1 php7-cli - 7.2.22-1 php7-fpm - 7.2.22-1 php7-mod-ctype - 7.2.22-1 php7-mod-curl - 7.2.22-1 php7-mod-dom - 7.2.22-1 php7-mod-exif - 7.2.22-1 php7-mod-fileinfo - 7.2.22-1 php7-mod-gmp - 7.2.22-1 php7-mod-hash - 7.2.22-1 php7-mod-json - 7.2.22-1 php7-mod-mbstring - 7.2.22-1 php7-mod-openssl - 7.2.22-1 php7-mod-pdo - 7.2.22-1 php7-mod-pdo-sqlite - 7.2.22-1 php7-mod-phar - 7.2.22-1 php7-mod-sqlite3 - 7.2.22-1 php7-mod-tokenizer - 7.2.22-1 php7-mod-xml - 7.2.22-1 php7-mod-xmlwriter - 7.2.22-1 php7-mod-zip - 7.2.22-1 poorbox - 1.31.0-1 python3 - 3.7.4-2 python3-asyncio - 3.7.4-2 python3-base - 3.7.4-2 python3-cgi - 3.7.4-2 python3-cgitb - 3.7.4-2 python3-codecs - 3.7.4-2 python3-ctypes - 3.7.4-2 python3-dbm - 3.7.4-2 python3-decimal - 3.7.4-2 python3-distutils - 3.7.4-2 python3-email - 3.7.4-2 python3-gdbm - 3.7.4-2 python3-light - 3.7.4-2 python3-logging - 3.7.4-2 python3-lzma - 3.7.4-2 python3-multiprocessing - 3.7.4-2 python3-ncurses - 3.7.4-2 python3-openssl - 3.7.4-2 python3-pydoc - 3.7.4-2 python3-sqlite3 - 3.7.4-2 python3-unittest - 3.7.4-2 python3-urllib - 3.7.4-2 python3-xml - 3.7.4-2 terminfo - 6.1-5 zlib - 1.2.11-3 zoneinfo-asia - 2019c-1 zoneinfo-europe - 2019c-1 ~ # Quote
zyxmon Posted November 18, 2019 Posted November 18, 2019 Тут с пакетами проблемы не вижу. Значит, как выше посоветовали В 30.10.2019 в 16:42, Александр Рыжов сказал: Придётся последовательно разбираться в вопросе, потому что если копипастить без понимая, то ничего не выйдет. Quote
Илдар Posted November 18, 2019 Author Posted November 18, 2019 (edited) Я не разберусь, т.к. профессионально далёк от этой области. Мне проще использовать другие устройства без OPKG, на которых нет такой проблемы. Edited November 18, 2019 by Илдар Quote
TheBB Posted November 27, 2019 Posted November 27, 2019 Возможно, наш случай https://github.com/openwrt/packages/pull/10639. Quote
Александр Рыжов Posted November 27, 2019 Posted November 27, 2019 Скорее всего нет. Если бы у нас не собирался соответствующий deprecated openssl API, то его бы не возможно было заставить работать способом, описанным выше. Quote
TheBB Posted November 27, 2019 Posted November 27, 2019 /root # php tls.php check yandex.ru:<br/> GET / HTTP/1.0 Host: yandex.ru Accept: */* HTTP/1.1 200 Ok check api.github.com:<br/> GET / HTTP/1.0 Host: api.github.com Accept: */* HTTP/1.0 403 Forbidden /root # если оно, надо ковырять патч Quote
Александр Рыжов Posted November 27, 2019 Posted November 27, 2019 Да, оно. Раз до ответов 200/403 дошло, то TLS-соединение установилось. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.