当前位置: 首页 > 知识库问答 >
问题:

ELB到使用带有自签名证书的HTTPS的后端服务器

赵星华
2023-03-14

我希望建立一个ELB,使用HTTPS与后端服务器通信。我正在尝试使用单个后端服务器进行概念验证,但似乎无法让ELB与服务器通信。我几乎可以肯定这是一个证书问题,因为任何没有SSL的设置都可以完美工作。

我如何设置?我尝试了来自多个答案和博客帖子的各种建议,但没有成功。

我现在所做的是使用以下命令设置自签名证书(来自AWS ELB-

$ openssl genrsa \
  -out /path/to/ssl.key 2048
$ openssl req \
  -sha256 \
  -new \
  -key /path/to/ssl.key \
  -out /path/to/ssl.csr
$ openssl x509 \
  -req \
  -days 365 \
  -in /path/to/ssl.csr \
  -signkey /path/to/ssl.key \
  -out /path/to/ssl.crt

我在签名时尝试了多个域名,我可以使用它们:

curl https://[Public DNS, or private DNS or IP used to create the SSL crt]/status --cacert /path/to/ssl.crt

这里有我应该使用的域/IP/DNS条目吗?我感觉很好,至少卷曲能起作用。

当前,我的nginx配置(在启用站点的文件中)如下所示:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate     /path/to/ssl.crt;
    ssl_certificate_key /path/to/ssl.key;

    server_name <dummy value of "_" or name used to make SSL certs>;
    client_max_body_size 20M;
    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        proxy_pass         http://127.0.0.1:8000/;
        proxy_redirect     off;

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

这适用于上面的curl命令。

我尝试过经典和应用程序负载平衡器。对于classic,我尝试添加ssl。crt内容-我看不到应用程序负载平衡器有类似的选项,尽管我希望尽可能使用它们,因为它们可以转发HTTP-

对缺失的内容有什么建议吗?或者如何确定缺少什么?

共有1个答案

司马自明
2023-03-14

离这里很近,只差几步。我和ALB ELB一起工作。

首先,我使用了一个类似于这里描述的脚本:https://myopswork.com/how-to-do-end-to-end-encryption-of-data-in-transit-b-w-aws-alb-and-ec2-3b7fd917cddd

#!/bin/bash

DIR=$(dirname $0)

domain=$(uname -n)
echo "Generating SSL for $domain"
commonname="$domain"
country="US"
state="California"
locality="LA"
organization="My Inc."
organizationalunit="Org"
email="my@email.com"

# Optional
password=dummypassword

echo "Generating key request for $domain"

mkdir -p /etc/ssl/private
chmod 700 /etc/ssl/private
mkdir -p /etc/ssl/certs

# Generate a key
openssl genrsa -des3 -passout pass:$password -out /etc/ssl/private/$domain.key 2048 -noout

# Remove passphrase from the key. Comment the line out to keep the passphrase
echo "Removing passphrase from key"
openssl rsa -in /etc/ssl/private/$domain.key -passin pass:$password -out /etc/ssl/private/$domain.key

# Create the request
echo "Creating CSR"
openssl req -new -key /etc/ssl/private/$domain.key -out /etc/ssl/private/$domain.csr -passin pass:$password \
    -subj "/C=$country/ST=$state/L=$locality/O=$organization/OU=$organizationalunit/CN=$commonname/emailAddress=$email"

# Create the cert
openssl x509 -req -days 365 -in /etc/ssl/private/$domain.csr -signkey /etc/ssl/private/$domain.key -out /etc/ssl/certs/$domain.crt

# Setup nginx config
sed "s/{{hostname}}/${domain}/" < $DIR/template.conf > /etc/nginx/sites-available/site.conf
ln -sf /etc/nginx/sites-available/site.conf /etc/nginx/sites-enabled/site.conf

模板如下所示:

server {
    # listen 80 #uncomment to also listen on port 80 - useful for debugging
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name {{hostname}};

    ssl_certificate /etc/ssl/certs/{{hostname}}.crt;
    ssl_certificate_key /etc/ssl/private/{{hostname}}.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options sameorigin;
    add_header X-Content-Type-Options nosniff;

    location / {
        ...
    }
}

域看起来像ip-172-10-11-12

为了调试所有内容,我运行了如下内容——这是来自内存的,因此它可能会关闭详细信息。我首先确保我可以通过点击nginx在本地卷曲服务器:

curl https://ip-172-10-11-12/healthcheck --cacert /etc/ssl/certs/ip-172-10-11-12.crt

然后我得到了ELB的地址,并确保我可以卷曲到那个位置。我必须使用一台可以访问ELB机器的机器。请注意,根据安全规则,ELB不是pinagable,而是curl。我想我用两种方法测试了这一点。首先,我尝试:

curl https://elb-address/healthcheck --insecure

然后我将ip-172-10-11-12添加到 /etc/hosts文件并尝试:

curl https://ip-172-10-11-12/healthcheck --cacert /cert/file/copied/onto/machine

一旦我开始工作,ALB ELB就开始工作了。在最后一次通话成功之前,我必须检查防火墙规则、AWS安全组等。但当它工作时,ELB开始看到服务器。

我在调试时还有一个最终的见解:如果从公共互联网访问ELB,ELB必须只有公共子网,并且公共子网应该与目标机器位于相同的可用性区域

 类似资料:
  • 我已经准备好了用于在我的 AWS ELB 上终止外部 HTTPS 连接。我现在尝试使用带有自签名证书的 HTTPS 来保护 EC2 上的 ELB 和后端 NGINX 服务器之间的连接。我已经按照文档进行操作,但是通过HTTPS访问服务器会导致408 HTTP超时。我似乎无法获得任何调试信息来确定故障所在。 < li >我已经确认安全组允许EC2上的ELB和NGINX之间的连接。 < li >我已经

  • 问题内容: 我已经开始为API编写包装,该包装要求所有请求都通过HTTPS进行。我不想在开发和测试它时向实际的API发出请求,而是希望在本地运行自己的服务器来模拟响应。 我对如何生成创建HTTPS服务器并向其发送请求所需的证书感到困惑。 我的服务器看起来像这样: Pem文件是使用以下命令生成的: 一个请求看起来像这样: 通过此设置,我得到了,所以我认为我需要为该请求添加一个选项。 所以我的问题是我

  • 问题内容: 我对phonegap比较陌生,最近我在Windows apache服务器上使用自签名证书设置了HTTPS / SSL,并尝试发出HTTPS ajax发布请求。在浏览器中运行时,该请求工作正常,但在phonegap中运行时失败。我尝试将android:debuggable设置为false,但这不能解决问题。我也做了一些研究,似乎phonegap确实支持HTTPS ajax请求,所以我对请

  • 问题内容: 我正在尝试使用自签名服务器证书建立TLS连接。 我使用以下示例代码生成了证书:http : //golang.org/src/pkg/crypto/tls/generate_cert.go 我相关的客户端代码如下所示: 以及类似的服务器代码: 因为服务器证书是自签名的,所以对于服务器和客户端CA_Pool使用相同的证书,但这似乎不起作用,因为我总是会收到此错误: 我怎么了 问题答案:

  • 问题内容: 我完全被困在这里。我有一个Java客户端代码,需要使用自签名证书连接到SSL服务器。 仅 当我在服务器端禁用SSLv2支持时, 才会 出现此问题。 痕迹是 在服务器端,我可以看到以下跟踪: 如果启用SSL2,我会看到 而且一切正常。 我还知道那不是服务器端的东西,因为与其他软件连接可以正常工作。 知道我在做什么错吗? 还有人知道这个“读取客户端问候A / B”是什么意思吗? 谢谢 更新

  • 我需要创建web服务客户端,这家提供服务的公司向我们发送wsdl文件。我有wsdl文件、用户名和密码、服务url和txt文件,其中包含一些密钥,比如“20A9 38 4e 82 3a 94 d1…”。服务器有自签名证书,我试图通过InstallCert获取证书。java,使用keytool等生成密钥库。当我使用axis2 wsdl2java从wsdl生成客户端时,它会生成客户端,但在生成过程结束时