HTTPS работает только на локальном хосте

Я пытаюсь настроить https на одном из моих экземпляров EC2. Я делал это много раз, но по какой-то причине, в данном случае, он отказывается работать.

Проблема

Когда я подключаюсь к домену через локальный ip, https работает нормально. Когда я подключаюсь к домену через общедоступный IP-адрес, https не работает, а ответ браузера "ERR CONNECTION REFUSED REFUSED"

Когда я иногда перезагружаюсь, вы можете видеть, что он принимает https, а затем сразу же блокирует его, как будто есть правило брандмауэра, но его нет.

нормальный http работает на 100% локально и общедоступно.

На данном этапе я не блокирую порты через группы безопасности на Amazon. У меня нет правил для таблиц ip, и я отключил ufw.

Я включил SSL для apache, и тестовые ключи отлично работают локально.

Это вывод sudo netstat -tlnp

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      937/sshd
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1060/mysqld
tcp6       0      0 :::22                   :::*                    LISTEN      937/sshd
tcp6       0      0 :::443                  :::*                    LISTEN      2798/apache2
tcp6       0      0 :::80                   :::*                    LISTEN      2798/apache2

Это мой файл /etc/apache2/ports.conf:

Listen 80
Listen 443

Я включил сайт по умолчанию-ssl без каких-либо ошибок.

Это мой файл /etc/hosts:

127.0.0.1 localhost


# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Я также пытался использовать 0.0.0.0 вместо 127.0.0.0, и это ничего не дало.

Это файл конфигурации моего веб-сайта для apache (в целях безопасности я заменил свое настоящее имя сайта на «mysite.com»):

<VirtualHost *:80>
     DocumentRoot /var/www/html/mysite.com
     ServerName mysite.com
     ServerAlias www.mysite.com
        <Directory /var/www/html/mysite.com>
                AllowOverride All
                RewriteEngine On
                Require all granted
                Options -Indexes +FollowSymLinks
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
     DocumentRoot /var/www/html/mysite.com
     ServerName mysite.com
     ServerAlias www.mysite.com
     SSLEngine on
     SSLCertificateFile /usr/local/ssl/public.crt
     SSLCertificateKeyFile /usr/local/ssl/private/private.key
     SSLCACertificateFile /usr/local/ssl/intermediate.crt
</VirtualHost>

Точно такой же файл конфигурации работал в другом экземпляре, что говорит мне о том, что проблема не в этом файле.

Что мне не хватает? Любая помощь, пожалуйста. заранее спасибо

РЕДАКТИРОВАТЬ

Вот мои загруженные модули для apache:

sudo apache2ctl -M
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php5_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 wsgi_module (shared)

РЕДАКТИРОВАТЬ 2

Некоторые интересные записи apache error.log, не когда я перезапустил службу, а просто случайным образом несколькими минутами ранее (может ли это быть причиной проблем?):

[Wed Feb 17 21:04:48.478106 2016] [ssl:warn] [pid 3629] AH02292: Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Wed Feb 17 21:04:48.507277 2016] [ssl:warn] [pid 3630] AH02292: Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Wed Feb 17 21:04:48.507324 2016] [:warn] [pid 3630] mod_wsgi: Compiled for Python/3.4.0.
[Wed Feb 17 21:04:48.507329 2016] [:warn] [pid 3630] mod_wsgi: Runtime using Python/3.4.3.
[Wed Feb 17 21:04:48.509502 2016] [mpm_prefork:notice] [pid 3630] AH00163: Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.14 OpenSSL/1.0.1f mod_wsgi/3.4 Python/3.4.3 configured -- resuming normal operations
[Wed Feb 17 21:04:48.509517 2016] [core:notice] [pid 3630] AH00094: Command line: '/usr/sbin/apache2'

Я отключил модуль wsgi, чтобы убедиться, что это не моя проблема, и перезапустил службу apache, но все равно не повезло, та же проблема.

РЕДАКТИРОВАТЬ 3

Я сбрасываю часть своего phpinfo(), чтобы показать больше информации. SSL установлен на ДА. Я понятия не имею, что происходит :(

введите здесь описание изображения

РЕДАКТИРОВАТЬ 4

Я думаю, что мне может понадобиться добавить сертификат SSL в балансировщик нагрузки, чтобы все это работало. Сейчас попробую, сообщу всем...


person Janpan    schedule 17.02.2016    source источник
comment
Похоже, ваш апач слушает только IPv6...?   -  person Joachim Isaksson    schedule 17.02.2016
comment
@JoachimIsaksson Я видел это, я не эксперт, но он работает локально и публично для порта 80 (http). Будет ли это иметь значение для порта 443? И еще, как заставить его слушать IPv4?   -  person Janpan    schedule 17.02.2016
comment
Что ж, похоже, он также прослушивает только порт 80 на IPv6, поэтому, если этот порт работает, я думаю, он просто отображается странным образом.   -  person Joachim Isaksson    schedule 17.02.2016
comment
@JoachimIsaksson Я пытался указать общедоступный IP-адрес в своем файле ports.conf. Например. Слушайте public_ip:443 . Однако при перезапуске apache я получил ошибку. не удалось привязать к адресу   -  person Janpan    schedule 17.02.2016
comment
Я сейчас иду домой, Уилл, ответ через 15 минут.   -  person Janpan    schedule 17.02.2016
comment
балансировщик нагрузки! У вас все это время был балансировщик нагрузки или вы его настраиваете? Это совершенно новая игра. Ссылка на статью для справки для развлечения docs.aws .amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/   -  person Kyle Burkett    schedule 18.02.2016
comment
Да, у меня был один все это время. Я занят настройкой сертификата с балансировщиком нагрузки, дам вам знать, когда я закончу, если это сработает. спасибо за ссылку! Еще одна вещь, мне бы очень хотелось получить окончательный ответ на вопрос, необходимо это или нет, например. Итак, у вас есть балансировщик нагрузки, единственный способ разрешить https-трафик — добавить сертификаты в балансировщик нагрузки. Или что-то подобное. Вот почему я тестирую это сейчас, потому что я не уверен   -  person Janpan    schedule 18.02.2016


Ответы (2)


Единственный способ получить трафик HTTPS к экземпляру EC2 в частной подсети, находящейся за балансировщиком нагрузки в VPC на AWS, — это иметь прослушиватель HTTPS на самом балансировщике нагрузки (ELB) с сертификатом конкретного сервера/домена на балансировщик нагрузки. В моем случае, даже если у вас открыт HTTPS 443 в ваших правилах безопасности балансировщика нагрузки (входящий, исходящий) и на экземпляре EC2 (входящий, исходящий), ELB все равно блокирует весь HTTPS-трафик на этом порту к экземпляру EC2, если у ELB нет прослушивателя с действительным сертификатом. Нигде в документации, насколько я читал, об этом явно не говорится. Надеюсь это поможет.

Шаг 1

Отправьте сертификат из экземпляра EC2 в IAM с помощью AWS cli.

Я добавил файлы сертификатов на свой сервер и должен был загрузить их в IAM вот так (да, часть file:// необходима даже в Linux):

aws iam upload-server-certificate --server-certificate-name my-server-cert 
--certificate-body file://my-certificate.pem --private-key file://my-private-key.pem 
--certificate-chain file://my-certificate-chain.pem

как описано здесь: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html

Шаг 2

Затем вам нужно настроить прослушиватель на ELB, к которому подключен экземпляр EC2. Затем прослушиватель предназначен для HTTPS и порта 443. Слушатель запросит сертификат, и он уже будет иметь тот, который вы добавили из aws cli ранее, уже в списке. Если его нет в списке, выйдите из консоли AWS и войдите снова. После этого трафик через HTTPS начнет поступать на ваш экземпляр EC2.

Я не был уверен, что это необходимо, потому что у меня были открыты порты для 443 в группе безопасности балансировщика нагрузки, и нигде в документации явно не говорится, что если вы используете балансировщик нагрузки, это ЕДИНСТВЕННЫЙ способ установить HTTPS соединение. Это только объясняет, что это правильный путь, когда вам нужен балансировщик нагрузки HTTPS, что может означать две разные вещи, однако я рад, что с этим разобрались.

person Janpan    schedule 18.02.2016

Можете ли вы также прикрепить журнал, чтобы показать любой вывод ошибок Apache?

Измените порядок ваших виртуальных хостов и поставьте 443 первым.

Возможно, на вас может повлиять это: https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/795315

person Kyle Burkett    schedule 17.02.2016
comment
Я переставил 443 и поставил его первым в virualhost, а также в ports.conf (где у меня есть Listen 443). Затем перезапустил службу apache и все еще имеет ту же проблему. Кроме того, я не вижу ошибок в файлах журнала apache... Я просматриваю их снова... - person Janpan; 18.02.2016
comment
Я добавил несколько интересных записей, которые нашел в своем журнале error.log, см. Редактирование 2 выше. - person Janpan; 18.02.2016
comment
у вас есть несколько виртуальных хостов ssl? - person Kyle Burkett; 18.02.2016
comment
нет, только один. Но даже без виртуальных хостов я могу получить доступ ко всем сайтам через https с локальным ip. Очевидно, что без сертификатов выдается предупреждение и т. д., но это работает. Однако извне я просто получаю сообщение «Отказано в подключении». - person Janpan; 18.02.2016
comment
Кроме того, я только что обновил свою версию apache с 2.4.7 марта 2015 г. до 2.4.7 14 января 2016 г. Те же ошибки... - person Janpan; 18.02.2016