用于 ELB 的 AWS Certificate Manager 指向在 EC2 上运行的 Apache 服务器

Posted

技术标签:

【中文标题】用于 ELB 的 AWS Certificate Manager 指向在 EC2 上运行的 Apache 服务器【英文标题】:AWS Certificate Manager for ELB pointing to a Apache Server Running on EC2 【发布时间】:2017-09-19 01:47:11 【问题描述】:

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

在文档中它有以下内容,

注意目前,ACM 证书与 Elastic Load 相关联 平衡负载均衡器或 Amazon CloudFront 分配。虽然 您在 Amazon EC2 实例上安装您的网站,您不部署 那里有 ACM 证书。相反,将 ACM 证书部署在您的 Elastic Load Balancing 负载均衡器或您的 CloudFront 分布。

据我了解,这意味着我们可以将应用程序部署在 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

【问题讨论】:

【参考方案1】:

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

因此,您将不再需要&lt;VirtualHost *:443&gt;

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

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

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

【讨论】:

我认为这是一个经典的ELB。你的方法让我更进一步。谢谢。

以上是关于用于 ELB 的 AWS Certificate Manager 指向在 EC2 上运行的 Apache 服务器的主要内容,如果未能解决你的问题,请参考以下文章

将 aws ELB 用于另一个托管实例

用于解析 aws elb 日志的猪脚本

无法通过 Kubernetes 的 AWS ELB 访问 Grafana(用于 prometheus)

Codeigniter 删除 index.php 在本地工作,但不适用于 aws ELB

直接将 AWS ELB 与 Gunicorn 一起使用(没有 nginx)有啥缺点?

Netflix Zuul/Ribbon/Eureka 与 AWS ELB/ALB 和 ECS