背景

背景

背景

我有一台运行 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 文件。

相关内容