AWS ACM подтвердил проблему ALB SSL - PullRequest
0 голосов
/ 11 ноября 2018

Я использовал HTTPS для прослушивателя балансировки нагрузки приложений AWS с использованием сертификата ACM.

Я запросил открытый сертификат для субдомена у ACM: test.example.com и создаю для него CNAME на маршруте 53:

Name: _xxxxxxxxxxx.test.example.com

Type: CNAME

Value: xxxxxx.xxx.acm-validations.aws.

Я могу использовать DNS ALB ( xxxx.us-east-1.elb.amazonaws.com ) для успешного вызова API в POSTMAN, однако, когда я использую запросы Python или cURL для вызова один и тот же API, он всегда говорит мне, что есть проблема с SSL.

Curl:

Код:

curl -X POST \
  https://xxxxx.us-east-1.elb.amazonaws.com/prod/testapi \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "paras1": "xxxxx"
}'

Ошибка:

* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=test.example.com
*  start date: Nov 11 00:00:00 2018 GMT
*  expire date: Dec 11 12:00:00 2019 GMT
*  subjectAltName does not match xxxx.us-east-1.elb.amazonaws.com
* SSL: no alternative certificate subject name matches target host name 'xxxx.us-east-1.elb.amazonaws.com'
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, Client hello (1):
curl: (51) SSL: no alternative certificate subject name matches target host name 'xxxx.us-east-1.elb.amazonaws.com'

Запросы Python:

Код:

import requests

url = "https://xxxxx.us-east-1.elb.amazonaws.com/prod/testapi"

payload = "{\"paras1\": \"xxxxx\"}"
headers = {
    'Content-Type': "application/json",
    'cache-control': "no-cache"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

Ошибка:

HTTPSConnectionPool(host='xxxx.us-east-1.elb.amazonaws.com', port=443): 
Max retries exceeded with url: /prod/testapi 
(Caused by SSLError(CertificateError("hostname 'xxxx.us-east-1.elb.amazonaws.com' doesn't match 'test.example.com'",),))

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я могу использовать DNS ALB (xxxx.us-east-1.elb.amazonaws.com)

Это не так, как это задумано. Вам нужно указать test.example.com на ELB в DNS, а затем:

url = "https://test.example.com/prod/testapi"
0 голосов
/ 12 ноября 2018

Ясно, что вы звоните по адресу xxxx.us-east-1.elb.amazonaws.com, для которого настроен сертификат для test.example.com. Несмотря на то, что сертификат может быть действительным, он не соответствует URL-адресу, по которому вы звоните, что означает, что сертификат НЕ действителен для ЭТОГО вызова. Я думаю, вы также должны установить собственный домен для шлюза API . https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

Редактировать: спасибо за комментарий. Я не уверен, как я читаю "elb" как шлюз API. Моя вина. Тем не менее, DNS для ELB должен совпадать с тем, что указан в сертификате. Вы можете создать CNAME из своего домена в домен ELB. Это должно работать (по крайней мере, так мы это делаем).

...