У меня есть сервер 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
В ...
части не буквально находятся в файле - я просто опустил эти части, чтобы сделать этот вопрос более читабельным.
a2enmod ssl
(печатает Module ssl already enabled
).<Directory /> SSLRequireSSL </Directory>
внутри конфигурации VirtualHost. (Ничего не изменилось. Веб-сайт по-прежнему доступен по http, но не доступен по https.)SSLRequireSSL
в /var/www/html/.htaccess
. (Ничего не изменилось. Веб-сайт по-прежнему доступен по http, но недоступен по https.)Сервер 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 через telnet, чтобы узнать, доступен ли он с самого сервера. Должно получиться так:
$ telnet localhost 443
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Между прочим: если вы хотите, чтобы пользователи получали доступ к вашему сайту только через 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.