AWS Certificate Manager for ELB 指向 EC2 上的 Apache 服务器 运行

AWS Certificate Manager for ELB pointing to a Apache Server Running on EC2

我正在阅读证书管理器的 aws 文档。我可以为 ELB 关联 SSL 证书。我已经这样做了,我的应用程序仍然驻留在部署在 Ubuntu EC2 服务器上的 Apache 服务器上。

并且在文档中有以下内容,

Note Currently, ACM Certificates are associated with Elastic Load Balancing load balancers or Amazon CloudFront distributions. Although you install your website on an Amazon EC2 instance, you do not deploy an ACM Certificate there. Instead, deploy the ACM Certificate on your Elastic Load Balancing load balancer or on your CloudFront distribution.

据我了解,这意味着我们可以将应用程序部署在 EC2 上,并将其添加到具有 ACM 证书的负载均衡下。

这就是您为 Web 应用程序使用 SSL 所需的全部内容。

但是当我不使用这种方法时,我使用以下 Apache 配置来配置 SSL。

<VirtualHost *:80>
        DocumentRoot /var/www/html/
        ServerName example.com
        ServerAlias example.com
        ErrorLog ${APACHE_LOG_DIR}/diyoron-error_log
        CustomLog ${APACHE_LOG_DIR}/diyoron-access_log common


        <Directory /var/www/html/>
                RewriteEngine on
                RewriteCond %{HTTPS} off
                RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R]
        </Directory>

</VirtualHost>

<VirtualHost *:443>
        # ServerAdmin webmaster@example.com
        DocumentRoot /var/www/html/

        ServerName example.com
        ServerAlias example.com
        ErrorLog ${APACHE_LOG_DIR}/example-error_log
        CustomLog ${APACHE_LOG_DIR}/example-access_log common
        SSLEngine On

        SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
        SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
        SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

</VirtualHost>

但在我目前的安排中,我无法在我的 Apache 配置中配置 SSLCertificateKeyFile、SSLCertificateChainFile、SSLCertificateFile。

如果有人能指引我走上正确的道路,我将不胜感激。

AH00016: Configuration Failed
[Fri Apr 21 23:14:01.184314 2017] [ssl:emerg] [pid 1190] AH02572: Failed to configure at least one certificate and key for example.com:443
[Fri Apr 21 23:14:01.184826 2017] [ssl:emerg] [pid 1190] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[Fri Apr 21 23:14:01.184834 2017] [ssl:emerg] [pid 1190] AH02311: Fatal error initialising mod_ssl, exiting. See /var/log/apache2/error.log for more information

您将在您的 ELB 上终止 SSL 并将其配置为将 HTTP 和 HTTPS 请求作为 HTTP 转发(到您实例的端口 80):

因此,您将不再需要 <VirtualHost *:443>

此外,在您的 Apache 配置中,如果连接未使用 SSL/TLS,您将在 <VirtualHost *:80> 中将用户重定向到 https://(顺便说一句,该条件是不必要的,请求将有如果它使用 https,则永远不会达到那个点——你可以无条件地重定向它)。这将不再可能,因为从 apache 的角度来看,所有传入连接都使用 http://

要确定客户端和负载均衡器之间使用的协议,请使用 X-Forwarded-Proto 请求 header(Elastic Load Balancing 将客户端和负载均衡器之间使用的协议存储在 X-Forwarded-Proto 请求 header 并将 header 传递给您的服务器):

RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]