Curl умеет ПОЛУЧАТЬ с https; но из golang http.get() тот же URL-адрес https не работает

Когда я делаю curl https://10.184.96.62:3000/status, сервер отправляет обратно данные json. Все хорошо.

Используя приведенный ниже код golang, приложение печатает:

2019/05/21 18:29:15 Get https://10.184.96.62:3000/status: x509: cannot validate certificate for 10.184.96.62 because it doesn't contain any IP SANs

package main

import (
        "log"
        "net/http"
)

func main() {
        _, err := http.Get("https://10.184.96.62:3000/status")
        if err != nil {
                log.Fatal(err)
        }
}

Что мне не хватает?

вы уже видели этот stackoverflow.com/a/12122718/2270041?

Matteo 21.05.2019 15:12

Как curl проверяет сертификат?

JimB 21.05.2019 15:17

@ Маттео, да, есть. Но это отключение сертификата. Я хочу с сертификатом.

iam thadiyan 21.05.2019 15:25

@JimB Я этого не знаю. Я установил сертификат на `/usr/local/share/ca-certificates/`. Извините, если я пропустил что-то очевидное.

iam thadiyan 21.05.2019 15:26

Вы можете попробовать Шаг 3. Предоставление сертификатов клиенту, как описано в статье

Matteo 21.05.2019 15:32

@iamthadiyan: ты бегал update-ca-certificates? Если он уже включен в корневые сертификаты, то сертификат неверен. Вы уверены, что создали его с помощью IP SAN?

JimB 21.05.2019 15:39

@JimB Да, я сделал это. Вот почему curl преуспевает.

iam thadiyan 21.05.2019 16:33

@iamthadiyan, дает ли curl -v какую-либо информацию о том, как принимается сертификат? Я думал, что он может принимать IP-адрес в CN, а не в SAN.

JimB 21.05.2019 16:40

@JimB Вот подробная информация из curl. $ curl -vvvv https://10.184.96.62:3000/status * Trying 10.184.96.62... * Connected to 10.184.96.62 (10.184.96.62) port 3000 (#0) * found 150 certificates in /etc/ssl/certs/ca-certificates.crt * found 605 certificates in /etc/ssl/certs * ALPN, offering http/1.1 * SSL connection using TLS1.2 / ECDHE_RSA_AES_128_GCM_SHA256

iam thadiyan 22.05.2019 03:52
* server certificate verification OK * server certificate status verification SKIPPED * common name: 10.184.96.62 (matched) * server certificate expiration date OK * server certificate activation date OK * certificate public key: RSA * certificate version: #3 * subject: C=AU,ST=State,L=Locaton,O=Org,OU=Unit,CN=10.184.96.62 * start date: Tue, 21 May 2019 11:13:49 GMT
iam thadiyan 22.05.2019 03:53
* expire date: Thu, 27 Apr 2119 11:13:49 GMT * issuer: C=AU,ST=State,L=Locaton,O=Org,OU=Unit,CN=10.184.96.62 * compression: NULL * ALPN, server accepted to use http/1.1 > GET /status HTTP/1.1 > Host: 10.184.96.62:3000 > User-Agent: curl/7.47.0 > Accept: */* >
iam thadiyan 22.05.2019 03:53

Таким образом, похоже, что у вас есть IP-адрес в CN, который технически недействителен, но curl, похоже, позволяет это сделать. Используйте SAN, как упоминалось ранее.

JimB 22.05.2019 04:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
821
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема, на которую указывает сообщение об ошибке, связана с комбинацией HTTPS с IP-адресами: обычно SSL-сертификат использует имя хоста для проверки подлинности сервера. В вашем случае нет имени хоста, а вместо него IP-адрес. Есть два возможных решения вашей проблемы:

  1. Используйте имя хоста вместо IP-адреса и поместите это имя хоста в свой сертификат.
  2. Введите IP-адрес, который вы хотите использовать, в поле subjectAltNames («Альтернативные имена субъекта» — SAN) вашего сертификата (см. RFC 5280).

Я создал самозаверяющий сертификат с помощью openssl. Поскольку curl может использовать сертификат, я предполагаю, что сделал это правильно.

iam thadiyan 22.05.2019 03:27
Ответ принят как подходящий

Проблема была с сертификатом, который я сгенерировал. Я использовал openssl для создания самозаверяющего сертификата. Как я поделился, curl смог использовать его для установления соединения с сервером. Но не приложение go.

На каком-то форуме я увидел комментарий, в котором говорилось, что заставить openssl работать в этом сценарии сложно. Поэтому я использовал этот перейти код для создания сертификата. Используя этот сертификат, приложение go также смогло выполнить запрос без внесения каких-либо изменений в исходный код, которым я поделился в своем вопросе.

Надеюсь, это поможет кому-то в этом нуждается.

Другие вопросы по теме