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 负载平衡器时,这是要走的路,这可能意味着两件不同的事情,但是,我很高兴它已经解决了。
我正在尝试在我的一个 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 负载平衡器时,这是要走的路,这可能意味着两件不同的事情,但是,我很高兴它已经解决了。