В этой статье в основном рассказывается, как использовать язык golang для разработки http/https Служить,Как позволить tls автоматически получить сертификат,Без необходимости обновления или сброса сертификата позже,Вам также необходимо перезапустить сервер Служить, чтобы бизнес снова заработал.,Эта статья разделена на три части,Часть В первом разделе будет представлен широко используемый метод шифрования TLS для анализа и обобщения. Хотя этот раздел не имеет особого отношения к магистральной сети, он поможет вам прояснить проблему, которую очень легко запутать при повседневном использовании; вторая будет сосредоточена на том, как создать весьма абстрактную http-часть, которая может автоматически обновлять TLS без перезапуска. третья Вся статья будет обобщена,Поверьте в обучение, основанное на этой статье,У вас определенно будет относительно глубокое понимание общих алгоритмов в области TLS, мониторинга трафика и защиты безопасности.,У меня также появилось новое понимание того, как абстрагировать самоподписанный голанг Служить. Итак, статья начинается!
Ранее я поделился статьей о преимуществах и недостатках использования кукловода на основе узлов и Scrapy Python для создания сканера. Я также рассказал, что когда я раньше сканировал зарубежный веб-сайт, поскольку проверка подписи страницы требует правильных параметров передачи, правильные результаты могут быть возвращены только при отправке в фоновом режиме в почтовом запросе. Есть также много отечественных сайтов, которые имеют эту проверку подписи. Да, например, когда я писал приложение для автоматической публикации статей на основе Puppeteer, некоторые платформы, такие как платформа Toutiao и Jianshu, могли использовать файлы cookie, кэшированные браузером, чтобы избежать повторных входов в систему и напрямую имитировать вход в браузер для публикации статей. . Однако, как и в случае с учетной записью Baidu в Baijia, только файлы cookie не могут быть успешно проверены. Только получив децентрализованный токен, можно полностью и успешно завершить процесс освобождения учетной записи Baijia. Короче говоря, «враг будет заблокирован, когда прибудут войска». и вода затопит землю».
Но рассмотрели ли вы,Эти платформы на самом деле основаны наtls
возможности проверки для защиты клиента и Служить Безопасность взаимодействия данных на стороне сервера,Однако основополагающие принципы различны.。НапримерJA3
Метод отпечатка пальца,это может быть основано наTLS
клиент с Служить Содержимое сообщения рукопожатия между узлами генерирует отпечаток пальца.,Конкретно,то естьсуществоватьруководитьTLS
при рукопожатии,Клиент отправит некоторую информацию о поддерживаемых им наборах шифров.、TLS/SSL
Версия и другие информационные сообщения передаются Служитьустройство,Служить ответит аналогичным сообщением,JA3
Отпечатки пальцев также генерируются на основе этих переданных сообщений.。Он основан на четырехуровневом протоколе сетевой передачи.,существоватьчетвертый этаж,То есть используется транспортный уровень. И пример, который я привел выше,Например向浏览устройство种token
,Добавьте его в заголовок сообщения о передаче.,Служитьустройство对В浏览устройство提交带着из这个token
руководить校验,определить его законность,Фактически, он работает на основе механизма аутентификации, используемого в протоколе прикладного уровня (уровень 7).,Вместо транспортного уровня (уровень 4 четырехуровневого сетевого транспортного протокола),Обратите внимание на различие здесь.
Для генерации tls,На самом деле существует множество алгоритмов,ноJA3
алгоритмнаиболее широко используемый,Это по сравнению с другими алгоритмами,Каковы его преимущества и недостатки? Я составил диаграмму, чтобы подвести итог,Для справки:
алгоритм | преимущество | недостаток |
---|---|---|
Алгоритм отпечатков пальцев JA3 | можно идентифицировать TLS Клиентская версия может генерировать отпечатки пальцев на основе содержимого сообщения о рукопожатии с более высокой точностью и обеспечивает хорошую согласованность на разных устройствах и операционных системах; Это открытый стандарт, и каждый может реализовать его и интегрировать в свои собственные приложения или инструменты, что делает его универсальным и расширяемым решением; Может использоваться для проверки того, был ли изменен TLS.,Отличается от отпечатка сертификата SSL,Алгоритм JA3 может обнаруживать атаки на уровне сети, такие как атаки «человек посередине»; | Невозможно определить влияние уровня прокси; невозможно идентифицировать клиентов с помощью пользовательских наборов шифров, которые можно использовать только для идентификации подтверждения TLS; |
SSL/TLS Сертификат Метод отпечатка пальца | На него не влияют такие факторы, как уровень прокси-сервера и версия клиента; можно определить, что используется клиент с собственным набором шифров. | Атаки типа «человек посередине» не могут быть идентифицированы; орган, выдающий сертификат, может быть ошибочным или мошенническим; |
HTTP Заголовок сообщения Метод отпечатка пальца | можно определить уровень прокси, CDN и другие эффекты имеют широкий спектр применения и могут быть использованы; HTTP Идентификация трафика. | Могут быть ошибочные оценки; для зашифрованного трафика можно идентифицировать только информацию прикладного уровня. |
TCP/IP Метод отпечатка пальца | можно идентифицироватьпрокси-слой、NAT и другие эффекты могут быть идентифицированы на сетевом уровне; | Он имеет высокий уровень ложных срабатываний; для зашифрованного трафика можно идентифицировать только информацию сетевого уровня. |
DNS Метод отпечатка пальца | Идентификация отпечатков пальцев может выполняться на этапе разрешения доменного имени; на нее не влияют такие факторы, как уровень прокси-сервера. | Невозможно идентифицировать зашифрованный трафик; возможно вмешательство DNS-кэша. |
JA3алгоритм также очень часто используется в Python, особенно в следующих сценариях:
Как прийтиразвертыватьgolangСлужить,Пусть он поддерживает динамические обновленияTLS certificates
без простоя?мы знаемTransport Layer Security(TLS)
это своего родаSSLv3
протокол шифрования,Используется для шифрования и дешифрования трафика между двумя сайтами. Другими словами,TLS
убедитесь, что высуществовать Данные, передаваемые между посещаемым сайтом и вами, не обнаруживаются.。Это достигается путем обмена цифровыми сертификатами друг с другом.:Депозитсуществовать Вweb
Служитьустройство上из私有证书,Еще один общедоступный сертификат, обычно распространяемый вместе с веб-браузерами.
существуют Производственная среда,Служить работает безопасно.,Однако срок действия проверки Служить истечет через определенный период. Затем проверьте и повторно создайте ответ Служить.,Никакого простоя не требуется,Вы можете повторно использовать сгенерированный сертификат проверки. Эта статья,Продемонстрируйте этоTLS
Проверкасуществовать基Вgolang
лингвистическийHTTPS
Служитькак использовать。
Это руководство имеет следующие предварительные требования.
Клиент-Служить
Модель Иметь базовое пониманиеGolang
базовые знанияПрежде чем начать эту статью,Сначала продемонстрируйте простойHTTP
Служить,Просто используйтеhttp.ListenAndServe
функция запускаетHTTP
Служить,повторное использованиеhttp.HandleFunc
функция对В特定endpoint
Зарегистрируйтеresponse handler
。
начинать,КонфигурацияHTTP
Служить:
package main
import (
"net/http"
"fmt"
"log"
)
func main(){
mux := http.NewServeMux()
mux.HandleFun("/",func(res http.ResponseWriter, req *http.Request){
fmt.Fprint(res, "Running Http Servcer")
})
srv := &http.Server{
Addr: fmt.Sprintf(":%d",8080),
Handler: mux,
}
//существовать порт 8080 работает
log.Fatal(srv.ListenAndServe())
}
Пример выше,использоватьgo run server.go
,встречасуществоватьHTTP
Служитьиз8080
порт работает,浏览устройство输入http://localhost:8080
,ты увидишьHello World!
выходсуществоватьна экране。
srv.ListenAndServe()
调использовать了goязыкHTTP
Служитьиз标准库Конфигурация,Однако,你可以使использоватьServer
Тип структуры для настройкиserver
。
начатьHTTPS
Служить,использовать Конфигурация调использоватьфункцияsrv.ListenAndServeTLS(certFile,keyFile)
,иsrv.ListenAndServe()
Похожие функции。ListenAndServe
иListenAndServeTLS
две функциисуществоватьHTTP
包иServer
структура中都да可использоватьиз。
ListenAndServeTLS
иListenAndServe
Похожие функции,За исключением бывшегоHTTPS
Служитьиз支持。
func ListenAndServeTLS(certFile string,keyFile string) error
Из приведенной выше сигнатуры функции видно, что,两者唯一из区别существовать В额外изcertFile
иkeyFile
параметр,Соответственно представляютSSL Certificate
документиз路径иprivate key
документ。
private key
иSSL certificate
以下дагенерироватькореньключевой сертификат
из步骤:
key
openssl genrsa -des3 -out rootCA.key 4096
certificate
Делатьсамоподпись (самоподпись)
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
затем,按下面из方式для每个Служитьгенерироватьcertificate
:
certificate key
openssl genrsa -out localhost.key 2048
certificate-signing request(CSR)
。CSR
дасуществовать哪里指定你想генерироватьизcertificate
из详情。кореньkey
из拥有者将执行request
来генерироватьcertificate
。当создаватьCSR
час,重要изда指定提供IP地址изCommon Name
,Доменное имя или Служить,в противном случаеcertificate
Не удалось проверить。openssl req -new -key localhost.key -out localhost.csr
TLS CSR
и密钥以及CA
корень密钥генерировать证书openssl x509 -req -in localhost.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out localhost.crt -days 500 -sha256
наконец,遵循同样步骤для每个客户端генерироватьcertificate
。
Поскольку существуетprivate key
иcertificate
документ,Вы можете изменить предыдущую программу go,这次использоватьListenAndServeTLS
заменять。
package main
import(
"net/http"
"fmt"
"log"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func( res http.ResponseWriter, req *http.Request ) {
fmt.Fprint( res, "Running HTTPS Server!!" )
})
srv := &http.Server{
Addr: fmt.Sprintf(":%d", 8443),
Handler: mux,
}
// run server on port "8443"
log.Fatal(srv.ListenAndServeTLS("localhost.crt", "localhost.key"))
}
Запустите вышеуказанную программу,将使использовать包含бегатьдокумент同级目录下изlocalhost.crt
какcertFile
,使использоватьlocalhost.key
какkeyFile
начатьHTTPS
Служить。再浏览устройство访问https://localhost:8443
,или Инструменты командной строки(CLI)
,Вы можете увидеть следующий вывод:
$ curl https://localhost:8443/ --cacert rootCA.crt --key client.key --cert client.crt
Running HTTPS Server!!
Вот и все! Это то, что нужно сделать большинству людей, чтобы запустить HTTPS-сервер. Это поведение и функциональность Go по умолчанию для управления связью TLS.
当бегать以上изHTTPS
Служить,ты положилcertFile
иkeyFile
прошел дальшеListenAndServeTLS
функция,Однако,если потому чтоcertificate
ИстекшийcertFile
иkeyFile
изменять,Чтобы изменения вступили в силу, необходимо перезапустить Служить.,Чтобы преодолеть кратковременное прерывание, вызванное этим прерыванием,,可以使использоватьnet/http
包изTLSConfig
。
cryto/tls
包изTLSConfig
структуравстреча Конфигурация СлужитьизTLS
параметр,включать Служить Сертификат и т. д.。всеTLSConfig
изпараметр都да可选项,同час也要注意给TLSconfig
изпараметр Конфигурация选项赋以空структура,就等同В赋个nil
стоит это дать。Однако,КонфигурацияGetCertificate
字段却да相当有益из。
type Config struct{
GetCertificate func(*ClientHelloInfo) (*Certicate,error)
}
TLSConfig
изGetCertificate
字段встреча基ВClientHelloInfo
сертификат возврата。
мне нужно реализоватьGetCertificate
闭包функция,该функция使использоватьtls.LoadX509KeyPair(certFile string, keyFile string) или tls.X509KeyPair(certFile []byte, keyFile []byte)
функция来获取证书,Приведите два примера:
#Это использование tls.LoadX509KeyPair(certFile string, keyFile строка) пример функции
func GetCertificate(certFile string, keyFile string) func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
log.Fatal(err)
}
return func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
return &cert, nil
}
}
#Это пример использования tls.X509KeyPair:
func GetCertificate(certData []byte, keyData []byte) func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
cert, err := tls.X509KeyPair(certData, keyData)
if err != nil {
log.Fatal(err)
}
return func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
return &cert, nil
}
}
#Две вышеупомянутые функции после использования возвращают замыкание, которое можно использовать как поле GetCertificate в структуре tls.config.
сейчассуществовать我将使использоватьTLSConfig
字段值создаватьServer
структура:
package main
import (
"crypto/tls"
"fmt"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func( res http.ResponseWriter, req *http.Request ) {
fmt.Fprint( res, "Running HTTPS Server!!\n" )
})
srv := &http.Server{
Addr: fmt.Sprintf(":%d", 8443),
Handler: mux,
TLSConfig: &tls.Config{
GetCertificate: func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
// Всегда получайте последние версии localhost.crt и localhost.key.
// Сохраните файлы сертификатов в глобальном расположении, чтобы их можно было обновлять при создании новых сертификатов, а функция закрытия могла ссылаться на них.
cert, err := tls.LoadX509KeyPair("localhost.crt", "localhost.key")
if err != nil {
return nil, err
}
return &cert, nil
},
},}
// существовать8443порт работает Служить log.Fatal(srv.ListenAndServeTLS("", ""))
}
В описанной выше процедуре,我实сейчас了GetCertificate
闭包функция,通过使использоватьLoadX509KeyPair
及证收и之前создаватьиз私有документ,вернул типCertificate
изcert
объект。同часфункция了一个error
,Удобен для отладки и трассировки.
由В我正существоватьиспользоватьTLS
Конфигурация,дляsrv
Служитьобъект Делать预Конфигурация,мне не нужно даватьsrv.ListenAndServeTLS
функция调использовать提供certFile
иkeyFile
。бегать Служить,он будет работать как раньше,Но разница в том, что,Я абстрагировал всю конфигурацию Служить от вызывающего объекта.,Поэтому, даже если эти конфигурации будут обновлены,Он также будет загружаться динамически,Без перезапуска Служить.
$ curl https://localhost:8443/ --cacert rootCA.crt --key client.key --cert client.crt
Running HTTPS Server!!
хорошо,Эта статья о том, как абстрагироватьсяTLS
Служить Конфигурация,Поделюсь статьей, как загрузить сертификат изменения без перезапуска Служить,спасибо за чтение,我特别将可использовать Вtls
加密из Метод отпечатка пальца Говоря о первом абзаце,и положитьJA3
Метод отпечатка пальцасуществоватьчетвертый этаж Служить传输协议中из使использовать,и浏览устройствоtoken
验签属В应использовать层(Семиуровневая сетевая передача Служить)协议中使использоватьиз身份验证机制Делать了区分,Вам будет удобно иметь более глубокое понимание во время будущего использования.
Сравнение четырехуровневого протокола передачи услуг (модель TCP/IP) и семиуровневого протокола передачи услуг (модель OSI) выглядит следующим образом:
Модель OSI | Модель TCP/IP |
---|---|
Прикладной уровень (7) | Прикладной уровень (4) |
Уровень представления (6) | |
Сеансовый уровень (5) | |
Транспортный уровень (4) | Транспортный уровень (3) |
Сетевой уровень (3) | Интернет-слой (2) |
Уровень канала передачи данных (2) | Уровень сетевого интерфейса (1) |
Физический уровень(1) |
Среди них Модель TCP/IP объединяет исходный «сеансовый уровень, уровень представления и уровень приложения» в один уровень приложения.,而将原本из“сетевой уровень、канальный уровень、Соответственно существуют «физический уровень» и интернет-слой.、Слой сетевого интерфейса в двух уровнях.
Ниже приведен четырехуровневый протокол передачи Служить (Модель TCP/IP) и семиуровневый транспортный протокол Служить (Модель OSI)каждый этаж Распространенные сценарии Сравнительная таблица использования:
Модель OSI | Модель TCP/IP | Распространенные сценарии использования |
---|---|---|
Прикладной уровень (7) | Прикладной уровень (4) | HTTP, FTP, SMTP и другие приложения |
Уровень представления (6) | Сжатие и шифрование данных | |
Сеансовый уровень (5) | Удаленный доступ и RPC | |
Транспортный уровень (4) | Транспортный уровень (3) | Протоколы TCP и UDP |
Сетевой уровень (3) | Интернет-слой (2) | IP, ICMP, ARP и т. д. |
Уровень канала передачи данных (2) | Уровень сетевого интерфейса (1) | Ethernet, Wi-Fi, банкомат и т. д. |
Физический уровень(1) | Среды передачи и физическое оборудование |
существовать Модель В OSI каждый уровень имеет свои функции и характеристики. Прикладной уровень отвечает за определение правил взаимодействия между приложениями; уровень представления используется для кодирования и декодирования данных приложения; сеансовый уровень устанавливает сеансовые соединения между приложениями на разных хостах; транспортный уровень обеспечивает сквозную надежную передачу данных; Сетевой уровень отвечает за передачу пакетов данных от хоста-источника к хосту-получателю; уровень канала передачи данных управляет передачей кадров данных между узлами сети; передачи и физическое оборудование。
существовать Модель В TCP/IP прикладной уровень включает в себя Модель OSIиз应использовать层、уровень представленияивстреча话层из功能;传输层提供端到端из可靠数据传输Служить;Уровень Интернета отвечает за транспортировку пакетов данных от хоста-источника к хосту назначения.;网络接口层管理网络节点之间из数据帧传输。
Короче говоря, существуют сетевые коммуникации, независимо от того, используют ли они Модель OSI все еще Модель TCP/IP,Каждый слой имеет свои функции и особенности.,Способны сотрудничать друг с другом для выполнения задач передачи данных и сетевой связи.
Я считаю, что эти две диаграммы могут дать вам более глубокое понимание передачи услуг. Спасибо за чтение.