Скажем, я хочу получить https://golang.org
программно. В настоящее время golang.org (ssl) имеет плохой сертификат, который выдается *.appspot.com
Итак, когда я запускаю это:
package main
import (
"log"
"net/http"
)
func main() {
_, err := http.Get("https://golang.org/")
if err != nil {
log.Fatal(err)
}
}
Я получаю (как я и ожидал)
Get https://golang.org/: certificate is valid for *.appspot.com, *.*.appspot.com, appspot.com, not golang.org
Теперь я сам хочу доверять этому сертификату (представьте себе самовольный сертификат, где я могу подтвердить отпечаток пальца и т. Д.): Как я могу сделать запрос и подтвердить / доверять сертификату?
Мне, вероятно, нужно использовать openssl, чтобы загрузить сертификат, загрузить его в свой файл и заполнить tls.Config
структуру !?
Ответы:
Примечание по безопасности: отключение проверок безопасности опасно, и этого следует избегать
Вы можете отключить проверки безопасности глобально для всех запросов клиента по умолчанию:
Вы можете отключить проверку безопасности для клиента:
источник
InsecureSkipVerify: true
. Это возможно?NameToCertificate
может помочь, см.tls.Config
документацию: golang.org/pkg/crypto/tls/#ConfigDialer.Timeout
.Вот способ сделать это без потери настроек по умолчанию
DefaultTransport
и без поддельного запроса в соответствии с комментарием пользователя.ОБНОВИТЬ
Более короткий путь:
Правильный способ (начиная с Go 1.13) (предоставляется ответом ниже ):
Предупреждение : только для тестирования / разработки. В остальном действуйте на свой страх и риск !!!
источник
mytransportsettings := &(*http.DefaultTransport.(*http.Transport))
а затем просто изменить конфигурацию клиента TLSmytransportsettings.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
?Все эти ответы неверны! Не используйте
InsecureSkipVerify
для работы с CN, которая не соответствует имени хоста. Разработчики Go неразумно были непреклонны в том, чтобы не отключать проверки имени хоста (которые имеют законное использование - туннели, натсы, общие сертификаты кластера и т. Д.), А также иметь что-то похожее, но фактически полностью игнорирующее проверку сертификата. Вы должны знать, что сертификат действителен и подписан сертификатом, которому вы доверяете. Но в обычных сценариях вы знаете, что CN не будет соответствовать имени хоста, с которым вы подключились. Для тех, установленServerName
наtls.Config
. Еслиtls.Config.ServerName
== remoteServerCN, то проверка сертификата завершится успешно. Это то, что вам нужно.InsecureSkipVerify
означает, что аутентификации НЕТ; и он созрел для человека-посередине; победить цель использования TLS.Есть одно законное использование
InsecureSkipVerify
: использовать его для подключения к хосту и получения его сертификата, а затем немедленно отключиться. Если вы настроили свой код для использованияInsecureSkipVerify
, это обычно происходит из-за того, что вы не установилиServerName
должным образом (он должен быть получен из env var или чего-то еще - не беспокойтесь об этом требовании ... делайте это правильно).В частности, если вы используете клиентские сертификаты и полагаетесь на них для аутентификации, у вас в основном будет поддельный логин, который фактически больше не будет входить в систему. Откажитесь от кода, который работает
InsecureSkipVerify
, иначе вы узнаете, что с ним не так, на собственном горьком опыте!источник
Правильный способ сделать это, если вы хотите сохранить настройки транспорта по умолчанию, сейчас (начиная с Go 1.13):
Transport.Clone делает глубокую копию транспорта. Таким образом, вам не нужно беспокоиться об отсутствии каких-либо новых полей, которые
Transport
со временем будут добавлены в структуру.источник
Если вы хотите использовать настройки по умолчанию из пакета http, поэтому вам не нужно создавать новый объект транспорта и клиента, вы можете изменить, чтобы игнорировать проверку сертификата следующим образом:
источник
panic: runtime error: invalid memory address or nil pointer dereference
Как правило, домен DNS URL-адреса ДОЛЖЕН совпадать с субъектом сертификата сертификата.
В прежние времена это могло быть либо путем установки домена как cn сертификата, либо путем установки домена в качестве альтернативного имени субъекта.
Поддержка cn давно устарела (с 2000 года в RFC 2818 ), и браузер Chrome больше не будет даже смотреть на cn, поэтому сегодня вам нужно иметь DNS-домен URL-адреса в качестве альтернативного имени субъекта.
RFC 6125 который запрещает проверку cn на наличие SAN для домена DNS, но не на наличие SAN для IP-адреса. RFC 6125 также повторяет, что cn устарел, что уже было сказано в RFC 2818. И должен присутствовать форум браузера центра сертификации, который в сочетании с RFC 6125 по существу означает, что cn никогда не будет проверяться на предмет доменного имени DNS.
источник