HTTPS 仅适用于本地主机

HTTPS only works on localhost

我正在尝试在我的一个 EC2 实例上设置 https。我已经这样做了很多次,但出于某种原因,在这个例子中,它拒绝工作。

问题

当我通过本地 ip 连接到域时,https 工作正常。 当我通过 public ip 连接到域时,https 不起作用 ,浏览器响应为 "ERR CONNECTION REFUSED"

有时我重新加载时,你可以看到它接受了https,然后它立即阻止了它,就像有防火墙规则一样,但没有。

正常的 http 工作 100% 本地和 public。

现阶段我不会通过亚马逊上的安全组阻止任何端口。 我没有关于 ip 表的规则,我已经禁用了 ufw。

我已经为 apache 启用了 SSL,并且测试密钥在本地工作正常。

这是 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 conf 文件(为了安全起见,我用 "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>

这个完全相同的 conf 文件正在另一个实例上运行,这告诉我问题不在于这个文件。

我错过了什么?请任何帮助。 提前致谢

编辑

这是我为 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 证书才能使其中任何一项正常工作。我现在正在尝试,会让大家知道...

您能否也附上日志以显示任何 Apache 错误输出?

重新排序您的虚拟主机并将 443 放在第一位。

您可能会受到此影响:https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/795315

在位于 AWS 上的 VPC 内的负载均衡器后面的私有子网中实现到 EC2 实例的 HTTPS 流量的唯一方法是在负载均衡器 (ELB) 本身上使用 HTTPS 侦听器和证书具体 server/domain 在负载均衡器上。就我而言,即使您在负载均衡器(入站、出站)和 EC2 实例(入站、出站)的安全规则中打开了 HTTPS 443,ELB 仍然会阻止该端口上到 EC2 实例的所有 HTTPS 流量,如果ELB 没有具有有效证书的侦听器。据我所知,文档中没有任何地方明确说明了这一点。希望这有帮助。

第 1 步

使用 AWS cli 将证书从 EC2 实例提交到 IAM。

我在我的服务器上添加了证书文件,并且必须像这样将它们上传到 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 步

然后您需要在附加了 EC2 实例的 ELB 上设置一个侦听器。然后侦听器用于 HTTPS 和端口 443。侦听器将请求证书,并且它将具有您之前从 aws cli 添加的证书,该证书已经列出。如果未列出,请退出 AWS 控制台并重新登录。之后,通过 HTTPS 的流量将开始流向您的 EC2 实例。

我不确定是否需要这样做,因为我在负载均衡器的安全组上为 443 打开了端口,但文档中没有任何地方明确说如果您使用负载平衡器,这是实现 HTTPS 连接的 ONLY 方式。它仅说明当您需要 HTTPS 负载平衡器时,这是要走的路,这可能意味着两件不同的事情,但是,我很高兴它已经解决了。