2 заметки с тегом

ssl

HTTP/2.0 в Nginx на CentOS 7

UPD
Вышло обновление openssl-1.0.2k и даное руководство больше не актуально.
_____________________________________________________________________

Решил включить HTTP/2.0 в Nginx. В процессе тестирование, при прохождении теста выяснилось, что не активно ALPN (Application-Layer Protocol Negotiation).

Для полноценной работы HTTP/2.0, Nginx должен быть собран с OpenSSL версии не ниже чем 1.0.2. В репах CentOS есть только OpenSSL версии 1.0.1.
Решить эту проблему можно двумя способами: собрать Nginx с флагом —with-openssl или собрать OpenSSL 1.0.2 для CentOS.
Первый вариант у меня не взлетел, сборка пакета завершалась неудачно, поэтому я остановился на втором варианте.
В интернет нашел сайт, где автор предлагает пачтить сорцы OpenSSL, но недавно в CentOS прилетело обновление glibc-2.17.

rpm -qa | grep glibc
glibc-common-2.17-157.el7_3.4.x86_64
glibc-2.17-157.el7_3.4.x86_64
glibc-devel-2.17-157.el7_3.4.x86_64
glibc-headers-2.17-157.el7_3.4.x86_64
readelf -s /usr/lib64/libc.so.6 | grep secure_getenv
614: 0000000000038950    27 FUNC    WEAK   DEFAULT   12 __libc_secure_getenv@@GLIBC_PRIVATE
857: 0000000000038950    27 FUNC    WEAK   DEFAULT   12 __secure_getenv@GLIBC_2.2.5
1715: 0000000000038950    27 FUNC    WEAK   DEFAULT   12 secure_getenv@@GLIBC_2.17
5228: 0000000000038950    27 FUNC    LOCAL  DEFAULT   12 __GI___libc_secure_getenv
6506: 0000000000038950    27 FUNC    WEAK   DEFAULT   12 __secure_getenv@GLIBC_2.2
6529: 0000000000038950    27 FUNC    WEAK   DEFAULT   12 secure_getenv
6918: 0000000000038950    27 FUNC    WEAK   DEFAULT   12 __libc_secure_getenv

Так что ничего патчить не нужно, а просто собираем openssl из FC23. Дополнительно потребуется пересобрать еще один пакет из FC23 crypto-policies.

yum install epel-release && yum update && yum install mock
mkdir -p ~/rpmbuild/{SPECS,SOURCES,SRPMS}
wget http://nginx.org/packages/centos/7/SRPMS/nginx-1.12.1-1.el7.ngx.src.rpm
rpm -ivh ~/nginx-1.12.1-1.el7.ngx.src.rpm
grep 'Requires: openssl >= 1.0.1' -P -R -I -l ~/rpmbuild/SPECS/nginx.spec | xargs sed -i 's/Requires: openssl >= 1.0.1/Requires: openssl >= 1.0.2/g'
grep 'BuildRequires: openssl-devel >= 1.0.1' -P -R -I -l ~/rpmbuild/SPECS/nginx.spec | xargs sed -i 's/BuildRequires: openssl-devel >= 1.0.1/BuildRequires: openssl-devel >= 1.0.2/g'
grep 'define main_release 1' -P -R -I -l  ~/rpmbuild/SPECS/nginx.spec | xargs sed -i 's/define main_release 1/define main_release 2/g'
grep '%changelog' -P -R -I -l  /root/rpmbuild/SPECS/nginx.spec | xargs sed -i 's/%changelog/%changelog\n* Wed Jul 12 2017 Aleksandr Chernyshev <mail@aschernyshev.ru>\n- 1.12.1 \n- Rebuild with openssl-1.0.2d\n/g'
/usr/bin/mock -r epel-7-x86_64 --spec=~/rpmbuild/SPECS/nginx.spec --sources=~/rpmbuild/SOURCES/ --resultdir=~/rpmbuild/SRPMS/ --no-clean --buildsrpm
wget https://aschernyshev.ru/repository/rhel/7/noarch/crypto-policies-20150518-3.gitffe885e.el7.centos.noarch.rpm
wget https://aschernyshev.ru/repository/rhel/7/x86_64/openssl-libs-1.0.2d-2.el7.centos.x86_64.rpm
wget https://aschernyshev.ru/repository/rhel/7/x86_64/openssl-1.0.2d-2.el7.centos.x86_64.rpm
wget https://aschernyshev.ru/repository/rhel/7/x86_64/openssl-devel-1.0.2d-2.el7.centos.x86_64.rpm
/usr/bin/mock -r epel-7-x86_64 --init
/usr/bin/mock -r epel-7-x86_64 --install ~/crypto-policies-20150518-3.gitffe885e.el7.centos.noarch.rpm
/usr/bin/mock -r epel-7-x86_64 --install ~/openssl-libs-1.0.2d-2.el7.centos.x86_64.rpm
/usr/bin/mock -r epel-7-x86_64 --install ~/openssl-1.0.2d-2.el7.centos.x86_64.rpm
/usr/bin/mock -r epel-7-x86_64 --install ~/openssl-devel-1.0.2d-2.el7.centos.x86_64.rpm
/usr/bin/mock -r epel-7-x86_64 --no-clean ~/rpmbuild/SRPMS/nginx-1.12.1-2.el7.centos.ngx.src.rpm

Устанавливаем получившиеся crypto-policies, openssl, openssl-libs , nginx.

 Нет комментариев    49   2017   centos   nginx   ssl

Получаем SSL сертификат Let’s Encrypt.

sudo yum install epel-release
sudo yum install certbot
vi /etc/nginx/letsencrypt.conf
location ^~ /.well-known/acme-challenge {
    alias /var/lib/letsencrypt/.well-known/acme-challenge;
    default_type "text/plain";
    try_files $uri =404;
}

В конфигурационном файле хоста, секцию server, include-ом добавляем конфиг.

vi /etc/nginx/conf.d/$HOST.conf
server {
    ...

    include letsencrypt.conf;
}

Изменяем группу и выставляем права.

chgrp nginx /var/lib/letsencrypt && chmod g+s /var/lib/letsencrypt

Получаем сертификат.

certbot certonly --webroot --email mail@example.com -w /var/lib/letsencrypt -d example.com -d www.example.com

Сертификат действует 90 дней, после чего его необходимо продлить. Для автоматизации этой процедуры создаем systemd.service и systemd.timer.

/etc/systemd/system/certbot.service
[Unit]
Description=Renew Certbot certificate (nginx)
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --renew-hook "/usr/bin/systemctl reload nginx.service"

Timer будет запускать основной сервис ежедневно в 12 и 00 часов.

/etc/systemd/system/certbot.timer
[Unit]
Description=Daily renewal of Let's Encrypt's certificates

[Timer]
OnCalendar=*-*-* 00,12:00:00
Persistent=true

[Install]
WantedBy=timers.target

Активируем timer.

sudo systemctl daemon-reload
systemctl start certbot.timer
systemctl enable certbot.timer
 Нет комментариев    34   2016   nginx   ssl   web