Шлюз AWS API «x509: сертификат, подписанный неизвестным органом» при попытке отправить ответ в websocket

#amazon-web-services #go #websocket #aws-lambda #aws-api-gateway

#amazon-web-services #Вперед #websocket #aws-lambda #aws-api-gateway

Вопрос:

Я создал базовый сервис websocket с использованием AWS lambda api gateway с использованием golang и AWS SDK v2.

Я корректно работаю при использовании сгенерированного ACM сертификата, но когда я пытаюсь использовать самозаверяющий сертификат, импортированный в ACM, возникает эта ошибка:

 request send failed, Post "https:/xxxxxxxxxxxxxxxx/dev/@connections/xxxxxxxxxxxx": x509: certificate signed by unknown authority
  

Сертификат сгенерирован правильно, и импорт работает.

На самом деле я могу получить доступ по протоколу https и просмотреть сертификат и цепочку.

Я также могу правильно подключиться к websocket, но проблема заключается в том, когда обработчик websocket lambda пытается отправить ответ клиенту.

Есть ли способ сообщить AWS apigatewayadmin api , работающему на lambda , что он не проверяет наличие действительного CA?

Ответ №1:

Итак, проблема заключалась в следующем: когда вы отвечаете на сообщение websocket из лямбда-выражения, вам нужно вызвать PostToConnection метод для ответа на определенное соединение.

Для этого вам необходимо создать свой apigatewaymanagementapi клиент, определяющий endponit для вашего текущего URL-адреса службы.

Для этого во всех примерах они используют этот метод:

         config, _ := external.LoadDefaultAWSConfig(request.RequestContext.DomainName)
    config.EndpointResolver = aws.ResolveWithEndpointURL(
            fmt.Sprintf("https://%s/%s",
                    request.RequestContext.DomainName,
                    request.RequestContext.Stage))

    apigw := apigatewaymanagementapi.New(config)
  

request.RequestContext.DomainName Определяется с помощью URL-адреса запроса, и он работает, когда вы используете api gateway для генерации URL-адреса в формате {api-id}.execute-api.{aws-zone}.com.

При использовании custom domain name с центром сертификации, отличным от AWS, этот код завершается ошибкой, поскольку lambda пытается отправить сообщение по этому URL.

Мое решение заключалось в замене запроса.Запросите context.DomainName к сгенерированной конечной точке {api-id}.execute-api.{aws-zone}.com

Обновить:

Вы можете создать конечную точку в своем lambda, используя переменную AWS_REGION env и RequestContext.Идентификатор приложения, подобный этому:

 fmt.Sprintf("https://%s.execute-api.%s.com/%s",
            request.RequestContext.APPID,
            os.Getenv("AWS_REGION"),
            request.RequestContext.Stage)