Jump to content

api.github.com недоступен через PHP


Recommended Posts

Известно, что в отличие от многих других сайтов, 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 как-то криво откомпилирован, либо его версия под линукс работает некорректно.

Что тут можно сделать?

 

Link to comment
Share on other sites

Добавлю также, что проблема очевидно не в тестовом скрипте (способе доступа к сайту), т.к. споткнулся на этом composer, который пытался скачать зависимости.

Link to comment
Share on other sites

Entware ≠ Debian. Это вопрос конфигурирования пакетов на роутере.

Если хотите аналогичного поведения, посмотрите на своём десктопе секцию default_conf в /etc/ssl/openssl.cnf и соответвующим образом поправьте в Entware /opt/etc/ssl/openssl.cnf.

Link to comment
Share on other sites

Не очень понятно, почему вопрос конфигурирования OpenSSL, если другие утилиты, его использующие (curl например) коннектятся корректно.

Десктоп в моём случае  = windows, там есть только идущий вместе с PHP libssl-1_1.dll без файлов конфигурации SSL и с пустой секцией по openssl в php.ini

т.е. никаких настроек.

Link to comment
Share on other sites

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.

 

Link to comment
Share on other sites

добавил в начало файла /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
 

Однако же, ничего не изменилось.

Проблема так и осталась.

Link to comment
Share on other sites

Почему в начало? Посмотрите как это сделано в том же Debian файлом patches\Set-systemwide-default-settings-for-libssl-users.patch

В PHP-скриптах оставьте вместо "tlsv1.2" просто "tls".

Придётся последовательно разбираться в вопросе, потому что если копипастить без понимая, то ничего не выйдет.

Link to comment
Share on other sites

Однако, для понимания, почему 

Цитата

В PHP-скриптах оставьте вместо "tlsv1.2" просто "tls"

?

Смутно представляю компиляцию PHP и связь с библиотеками, неужели всё же он был сконфигурирован с доступом к старым хидерам каким-то?

Ведь на винде работает прекрасно и с tlsv1.2, а на роутере только с tls заработал, хотя версия точно такая же. Непонятно почему так.

Link to comment
Share on other sites

На самом деле проблема не решилась, так как для других сайтов и способов доступа опять возникают эта и подобные ошибки:

OpenSSL Error messages: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

Жду пересборку последней версии PHP с корректными хидерами и версией OpenSSL.

С этой версией PHP невозможна нормальная работа с интернетом.

Link to comment
Share on other sites

  • 3 weeks later...
В 02.11.2019 в 09:24, Илдар сказал:

Жду пересборку последней версии PHP с корректными хидерами и версией OpenSSL.

php собирается с корректными хедерами и версией openssl.

Версия php будет обновлена после того, как это сделают в openwrt, и будет собрана с теми же опциями и хедерами, что и в openwrt.

Link to comment
Share on other sites

Цитата

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
~ #
 

 

Link to comment
Share on other sites

Тут с пакетами проблемы не вижу. Значит, как выше посоветовали

В 30.10.2019 в 16:42, Александр Рыжов сказал:

Придётся последовательно разбираться в вопросе, потому что если копипастить без понимая, то ничего не выйдет.

 

Link to comment
Share on other sites

Я не разберусь, т.к. профессионально далёк от этой области.

Мне проще использовать другие устройства без OPKG, на которых нет такой проблемы.

Edited by Илдар
Link to comment
Share on other sites

  • 2 weeks later...
/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 #

если оно, надо ковырять патч

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...