背景
我有一台运行 Apache/2.4.18 (Ubuntu) 的 Ubuntu 16.04 服务器。我从 github 安装了 lets-encrypt 并运行./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
也是由 lets-crypt 自动生成的,看起来像
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
这些...
部分实际上并不在文件中——我只是省略了这些部分以使这个问题更具可读性。
我尝试过
- 重新加载/重新启动 apache。
- 重新启动整个服务器。
a2enmod ssl
(印刷Module ssl already enabled
)。- 在 VirtualHost 配置中写入
<Directory /> SSLRequireSSL </Directory>
。(没有改变任何东西。网站仍然可以通过 http 访问,但无法通过 https 访问。) - 写入
SSLRequireSSL
。/var/www/html/.htaccess
(没有改变任何内容。网站仍然可以通过 http 访问,但无法通过 https 访问。)
附加信息
服务器my.own.server.tld
在我所在的大学运行。我只控制部分my
,对底层系统既不了解也不控制,但我猜我的服务器是一个 OpenStack 实例。服务器应该只有一个 IP。
apache2ctl -S
印刷
VirtualHost 配置: *:443 my.own.server.tld(/etc/apache2/sites-enabled/my.own.server.tld-le-sll.conf:2) 服务器根目录:“/etc/apache2” 主文件根目录:“/var/www/html” 主错误日志:“/var/log/apache2/error.log” 互斥看门狗回调:using_defaults 互斥重写映射:using_defaults 互斥 SSL 装订刷新:using_defaults 互斥 SSL 绑定:using_defaults 互斥 SSL 缓存:using_defaults 互斥默认值:dir="/var/lock/apache2" mechanism=fcntl Pid文件:“/var/run/apache2/apache2.pid” 定义:DUMP_VHOSTS 定义:DUMP_RUN_CFG 用户:name="www-data" id=33 组: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
。
答案1
- https 以前能用吗?或者切换到 Let's Encrypt 后就停止工作了?
- 您的服务器是 Amazon EC2 实例吗?(安全组的潜在问题)
- 这个类似的问题给出了一些值得尝试的想法为什么 https 不工作?:
尝试通过 telnet 连接到 https 端口,看看是否可以从服务器本身访问。它应该如下所示:
$ telnet localhost 443
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
- 你的防火墙规则是什么样的?(iptables -L -n)
- https虚拟主机是否指向与http虚拟主机相同的文件夹?(权限问题)
- apache 错误日志里有什么内容吗?(默认为 /var/logs/apache2/error.log)
- 你的服务器是否配置了多个IP?
- 跑步netstat -pant | grep apache2查看 apache 是否正在监听端口 80 和 443
顺便说一句:如果您希望用户仅通过 https 访问您的网站,您需要在 http Virtualhost 中配置类似这样的内容以将他们重定向到 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>
答案2
我通过 certonly 选项获得了带有 LE 的证书。然后修改您的 apache 站点定义如下:
<VirtualHost _DEFAULT_:443>
ServerName example.com
ServerAlias www.example.com
ServerAdmin [email protected]
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>
然后在 apache 中启用 SSL——a2enmod ssl
然后重新启动 apache2。
您所显示的输出apache2ctl -S
看起来是正确的 - 如果您(重新)启动 apache2,如果您通过它查看,它是否显示为正在监听netstat -l46n
?
答案3
SSLCertificateFile /etc/letsencrypt/live/my.own.server.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my.own.server.tld/privkey.pem
pem 文件只是一个容器文件,本身并不是证书。您需要一个 CRT 文件。