Назад | Перейти на главную страницу

Apache2 использует http вместо https, несмотря на LetsEncrypt

Задний план

У меня есть сервер Ubuntu 16.04 с Apache / 2.4.18 (Ubuntu). Я установил Let's-encrypt из github и запустил ./letsencrypt-auto --apache, выбрав второй вариант в следующем диалоговом окне:

Please choose whether HTTPS access is required or optional.
------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
------------------------------------------------------------------

что привело к сообщению

Congratulations! You have successfully enabled
my.own.server.tld

и автоматически сгенерированный файл виртуального хоста. Затем я перезапустил сервер.

Эта проблема

Я попытался получить доступ к своему сайту, который работал с http (без проблем), но не с https (Firefox и Chrome пытались загрузить страницу, и время ожидания истекло через две минуты). Я ожидал, что сайт будет доступен исключительно через https или, по крайней мере, через https вообще.

Конфигурация

Есть только один файл в /etc/apache2/sites-enabled/:
my.own.server.tld-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName my.own.server.tld

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLCertificateFile /etc/letsencrypt/live/my.own.server.tld/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/my.own.server.tld/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

где /etc/letsencrypt/options-ssl-apache.conf также был автоматически сгенерирован посредством Let-encrypt и выглядит как

SSLEngine on

# Intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:...
SSLHonorCipherOrder     on
SSLCompression          off

SSLOptions +StrictRequire

# Add vhost name to log entries:
LogFormat "..." vhost_combined
LogFormat "..." vhost_common

В ... части не буквально находятся в файле - я просто опустил эти части, чтобы сделать этот вопрос более читабельным.

Что я пробовал

Дополнительная информация

Сервер my.own.server.tld работает в моем университете. Я контролирую только my часть и не имеют ни знаний, ни контроля над базовой системой, но я предполагаю, что мой сервер является экземпляром OpenStack. У сервера должен быть только один IP.

apache2ctl -S печатает

VirtualHost configuration:
*:443                  my.own.server.tld (/etc/apache2/sites-enabled/my.own.server.tld-le-sll.conf:2)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex ssl-stapling: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/lock/apache2" mechanism=fcntl 
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33

netstat -pant | grep apache2 печатает

tcp6    0    0 :::80     :::*    LISTEN    8592/apache2    
tcp6    0    0 :::443    :::*    LISTEN    8592/apache2 

netstat -l46n печатает

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp        0      0 0.0.0.0:22    0.0.0.0:*       LISTEN
tcp6       0      0 :::80         :::*            LISTEN
tcp6       0      0 :::22         :::*            LISTEN
tcp6       0      0 :::443        :::*            LISTEN
udp        0      0 0.0.0.0:68    0.0.0.0:*

telnet localhost 443 печатает ожидаемый результат.

iptables -L -n печатает

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
f2b-sshd   tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain f2b-sshd (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0   

Нет ошибок в /var/log/apache2/error.log.

  • Работал ли когда-нибудь https раньше или перестал работать после перехода на Let's Encrypt?
  • Является ли ваш сервер экземпляром Amazon EC2? (Возможная проблема с группами безопасности)
  • Этот аналогичный вопрос дает некоторые идеи, которые стоит попробовать Почему не работает https?:

Попробуйте подключиться к порту https через telnet, чтобы узнать, доступен ли он с самого сервера. Должно получиться так:

    $ telnet localhost 443
    Trying 127.0.0.1...
    Connected to localhost.localdomain (127.0.0.1).
    Escape character is '^]'.
  • Как выглядят ваши правила брандмауэра? (iptables -L -n)
  • Виртуальный хост https указывает на ту же папку, что и http? (Проблема с разрешением)
  • Что-нибудь есть в журнале ошибок apache? (по умолчанию /var/logs/apache2/error.log)
  • На вашем сервере настроено несколько IP-адресов?
  • Бегать netstat-брюки | grep apache2 чтобы узнать, прослушивает ли apache порт 80 и 443

Между прочим: если вы хотите, чтобы пользователи получали доступ к вашему сайту только через https, вам необходимо настроить что-то подобное в виртуальном хосте http, чтобы перенаправить их на https:

<VirtualHost *:80>
        ServerName my.own.server.tld
        ServerAlias www.my.own.server.tld
        RewriteEngine On
        RewriteCond %{SERVER_PORT} !443
        RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]
        RewriteCond %{SERVER_NAME} =www.my.own.server.tld
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</VirtualHost>

Я получил свой сертификат с LE через опцию certonly. Затем измените определение вашего сайта apache на:

<VirtualHost _DEFAULT_:443>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
    CustomLog ${APACHE_LOG_DIR}/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    DocumentRoot /var/www-example.com
    <directory /var/www-example.com>
        Options All
                AllowOverride All
                Require all granted
    </directory>
    ErrorLog ${APACHE_LOG_DIR}/ssl-example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/ssl-example.com-access.log combined
</VirtualHost>

Затем включите SSL в apache - a2enmod ssl - а затем перезапустите apache2.

Выход apache2ctl -S вы показываете, похоже, это правильно - если вы (повторно) запустите apache2, он будет отображаться как прослушивание, если вы посмотрите через netstat -l46n ?

SSLCertificateFile /etc/letsencrypt/live/my.own.server.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my.own.server.tld/privkey.pem

Файл pem - это просто файл-контейнер и сам по себе не является сертификатом. Вам понадобится файл CRT.