Данная статья устарела, оставлена исключительно для желающих покомпилировать php. Остальным людям предлагаю поставить php5.5 из репозитария, т.к. в нем он относительно свежий и телодвижений требуется совершить меньше.
Написал я как-то год назад себе мануальчик как ставить php из сырцов, а сегодня столкнулся с проблемой обработки https. И все бы ничего — создал устройство /dev/urandom и отключил проверку сертификатов — вроде бы что-то заработало, но работало это что-то через раз. Т.е. file_get_contents тянул файлы каждый третий раз, в остальное время выдавая ошибки SSL подобного плана:
Warning: file_get_contents() [function.file-get-contents]: SSL: Success in /../../1.php on line .... Warning: file_get_contents() [function.file-get-contents]: Failed to enable crypto in /../../1.php on line ... Warning: file_get_contents(https://gmail.com) [function.file-get-contents]: failed to open stream: operation failed in /../../1.php on line ...
На просторах интернетов проблема обычно решалась «переходом на CURL» — такой вариант меня не устроил и я нашел себе развлечение на пару дней 🙂 Как выяснилось — в состав Ubuntu 10.04 входит крайне древняя версия openssl 0.9.8k от 2009 года, которая и содержала глюки. За одно было решено и php обновить. Собственно запишу ниже как ставил.
Эта статья является продолжением этого мануала
Подготовка
Сначала ставим пакеты, необходимые для компиляции PHP 5.3.19 и прочего добра:
sudo apt-get install autoconf2.13 libcurl4-openssl-dev libmysqld-dev libssl-dev libcurl4-gnutls-dev libjpeg62-dev libpng12-dev libmysql++-dev libfreetype6-dev libt1-dev libc-client-dev mysql-client libevent-dev libxml2-dev libtool libmcrypt-dev
А еще нам потребуется checkinstall для автоматической сборки пакетов:
sudo apt-get install checkinstall
Теперь поставим новый OpenSSL из исходников
cd /usr/local/src/ wget -O ./openssl-0.9.8x.tar.gz http://www.openssl.org/source/openssl-0.9.8x.tar.gz tar xvfz ./openssl-0.9.8x.tar.gz rm ./openssl-0.9.8x.tar.gz cd ./openssl-0.9.8x ./config make make test sudo checkinstall --type=debian --default --pkgname=openssl-0.9.8x -pkgversion=1
После удачной установки наш OpenSSL будет находиться тут /usr/local/ssl, теперь подправим маленько конфиги:
/etc/manpath.config
добавим строчку
MANPATH_MAP /usr/local/ssl/bin /usr/local/ssl/man
Далее обновим базу мануалов:
sudo mandb
Поправим файл переменных окружения /etc/environment добавив наш путь /usr/local/ssl/bin перед /usr/bin
Теперь перелогинимся. Если в консоли набрать openssl version то увидим что-то типа:
OpenSSL 0.9.8x 10 May 2012
Старые программы, скомпилированные под старый OpenSSL продолжат работать на старых библиотеках, а PHP мы сейчас соберем.
Ставим PHP 5.3.19 из сырцов
cd /usr/local/src wget -O ./php-5.3.19.tar.gz http://php.net/get/php-5.3.19.tar.gz/from/ru2.php.net/mirror tar xvfz ./php-5.3.19.tar.gz rm ./php-5.3.19.tar.gz cd ./php-5.3.19
Конфигурируем с указанием пути к новому OpenSSL:
./configure --enable-inline-optimization --enable-fpm --with-mcrypt --enable-mbstring --with-openssl=/usr/local/ssl --with-mysql --with-mysql-sock --with-gd --with-jpeg-dir=/usr/lib --enable-gd-native-ttf --with-pdo-mysql --with-libxml-dir=/usr/lib --with-mysqli=/usr/bin/mysql_config --with-curl --enable-zip --enable-sockets --with-zlib --enable-exif --enable-ftp --with-iconv --with-gettext --enable-gd-native-ttf --with-t1lib=/usr --with-freetype-dir=/usr --prefix=/usr/local/php --with-fpm-user=www-data -–with-fpm-group=www-data --with-fpm-conf=/usr/local/php/etc/php-fpm.conf --with-config-file-path=/usr/local/php/etc
Останавливаем и сносим старый php, установленный по этому мануалу
sudo service php-fpm stop sudo dpkg -r php
Собираем и ставим новый:
sudo checkinstall --type=debian --default --pkgname=php-5.3.19 -pkgversion=1
После сборки встанет он туда же, куда и старый и конфиги автоматически сами подхватятся. Правда после обновления PHP до версии наш скомпилированный eaccelerator не сможет работать и его надо будет переустановить по мануалу.
Осталось помочь OpenSSL работать в chroot в php-fpm — для этого в папке chroot нашего сайта создадим /dev/urandom и подобные источники.
sudo mkdir /home/koteika.ru/dev sudo mknod /home/koteika.ru/dev/urandom c 1 9 sudo mknod /home/koteika.ru/dev/null c 1 3 sudo mknod /home/koteika.ru/dev/zero c 1 5 sudo chmod 666 dev/null dev/zero dev/urandom
А поскольку скрипты будут работать в chroot то им надо иметь доступ к сертификатам для проверки https. Скопируем в chroot нашего сайта папку симлинков и самих сертификатов:
mkdir /home/koteika.ru/etc/ssl cp -R /etc/ssl/certs /home/koteika.ru/etc/ssl/certs mkdir /home/koteika.ru/usr/share cp -R /usr/share/ca-certificates /home/koteika.ru/usr/share/ca-certificates cp -R /usr/share/ssl-cert /home/koteika.ru/usr/share/ssl-cert
Обновлять сертификаты у сайта придется теперь ручками %)
Запускаем php
sudo service php-fpm start
Во время экспериментов перепробовал разные версии OpenSSL — версии выше 0.9.8 у меня работали, но из под PHP я так и не смог заставить брать сертификаты из папки (даже принудительно указанной в скрипте PHP, хотя принудительно из одного файла сертификатов работало нормально).
[…] Обновление PHP до 5.3.19 и решение проблемы с httpsOpenSSL. […]