Когда я делаю 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)
}
}
Что мне не хватает?
Как curl проверяет сертификат?
@ Маттео, да, есть. Но это отключение сертификата. Я хочу с сертификатом.
@JimB Я этого не знаю. Я установил сертификат на `/usr/local/share/ca-certificates/`. Извините, если я пропустил что-то очевидное.
Вы можете попробовать Шаг 3. Предоставление сертификатов клиенту, как описано в статье
@iamthadiyan: ты бегал update-ca-certificates
? Если он уже включен в корневые сертификаты, то сертификат неверен. Вы уверены, что создали его с помощью IP SAN?
@JimB Да, я сделал это. Вот почему curl
преуспевает.
@iamthadiyan, дает ли curl -v
какую-либо информацию о том, как принимается сертификат? Я думал, что он может принимать IP-адрес в CN, а не в SAN.
@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
* 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
* 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: */* >
Таким образом, похоже, что у вас есть IP-адрес в CN, который технически недействителен, но curl, похоже, позволяет это сделать. Используйте SAN, как упоминалось ранее.
Проблема, на которую указывает сообщение об ошибке, связана с комбинацией HTTPS с IP-адресами: обычно SSL-сертификат использует имя хоста для проверки подлинности сервера. В вашем случае нет имени хоста, а вместо него IP-адрес. Есть два возможных решения вашей проблемы:
subjectAltNames
(«Альтернативные имена субъекта» — SAN) вашего сертификата (см. RFC 5280).Я создал самозаверяющий сертификат с помощью openssl. Поскольку curl может использовать сертификат, я предполагаю, что сделал это правильно.
Проблема была с сертификатом, который я сгенерировал. Я использовал openssl
для создания самозаверяющего сертификата. Как я поделился, curl
смог использовать его для установления соединения с сервером. Но не приложение go.
На каком-то форуме я увидел комментарий, в котором говорилось, что заставить openssl
работать в этом сценарии сложно. Поэтому я использовал этот перейти код для создания сертификата. Используя этот сертификат, приложение go также смогло выполнить запрос без внесения каких-либо изменений в исходный код, которым я поделился в своем вопросе.
Надеюсь, это поможет кому-то в этом нуждается.
вы уже видели этот stackoverflow.com/a/12122718/2270041?