1

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

问题

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

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

正常 http 100% 本地和公共工作。

在这个阶段,我不会通过亚马逊上的安全组阻止任何端口。我对 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

我已经启用了 default-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 证书才能使任何这些都正常工作。我现在正在尝试,会让大家知道...

4

2 回答 2

1

在 AWS 上的 VPC 内的负载均衡器后面的私有子网中实现到 EC2 实例的 HTTPS 流量的唯一方法是在负载均衡器 (ELB) 本身上安装一个 HTTPS 侦听器,并使用特定服务器/域的证书负载均衡器。就我而言,即使您在负载均衡器(入站、出站)和 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的唯一方法联系。它只是说明当您想要一个 HTTPS 负载平衡器时,这是要走的路,这可能意味着两件不同的事情,但是,我很高兴它已经解决了。

于 2016-02-18T14:29:08.863 回答
0

您还可以附加日志以显示任何 Apache 错误输出吗?

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

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

于 2016-02-17T20:41:29.077 回答