Как добиться эффективного делегирования сертификатов без простоев при использовании golang для развертывания служб https с запуском tls?
Как добиться эффективного делегирования сертификатов без простоев при использовании golang для развертывания служб https с запуском tls?

Как добиться эффективного делегирования сертификатов без простоев при использовании golang для развертывания служб https с запуском tls?

Часть первая

В этой статье в основном рассказывается, как использовать язык 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, особенно в следующих сценариях:

  1. Определить вредоносное ПО: пройти JA3 алгоритмможно идентифицировать JA3 Вредоносное ПО с отпечатками пальцев, тем самым помогая персоналу сетевой безопасности своевременно обнаруживать и предотвращать атаки.
  2. Идентификация трафика: JA3 алгоритм может использоваться для идентификации и классификации трафика, помогая инженерам выполнять мониторинг, анализ и другие операции трафика.
  3. Обнаружение зашифрованного трафика: из-за JA3 алгоритмможно идентифицировать TLS Версия клиента и набор шифров, чтобы их можно было использовать для определения легитимности зашифрованного трафика и соответствия передовым практикам.
  4. Киберразведка: JA3 алгоритм может использоваться для определения типа посещения пользователями веб-сайта, операционной системы клиента, версии браузера и другой информации, помогая сетевым следователям понять технические возможности и поведенческие привычки другой стороны.
  5. Формулирование политики безопасности. Благодаря статистике и анализу данных JA3 вы можете понять использование различных клиентов и соответствующим образом сформулировать соответствующие политики и меры безопасности для повышения безопасности сети.

часть вторая

Как прийтиразвертыватьgolangСлужить,Пусть он поддерживает динамические обновленияTLS certificatesбез простоя?мы знаемTransport Layer Security(TLS)это своего родаSSLv3протокол шифрования,Используется для шифрования и дешифрования трафика между двумя сайтами. Другими словами,TLSубедитесь, что высуществовать Данные, передаваемые между посещаемым сайтом и вами, не обнаруживаются.。Это достигается путем обмена цифровыми сертификатами друг с другом.:Депозитсуществовать ВwebСлужитьустройство上из私有证书,Еще один общедоступный сертификат, обычно распространяемый вместе с веб-браузерами.

существуют Производственная среда,Служить работает безопасно.,Однако срок действия проверки Служить истечет через определенный период. Затем проверьте и повторно создайте ответ Служить.,Никакого простоя не требуется,Вы можете повторно использовать сгенерированный сертификат проверки. Эта статья,Продемонстрируйте этоTLSПроверкасуществовать基ВgolangлингвистическийHTTPSСлужитькак использовать。

Это руководство имеет следующие предварительные требования.

  • Будь правКлиент-СлужитьМодель Иметь базовое понимание
  • Golangбазовые знания
Настроить HTTP-сервер

Прежде чем начать эту статью,Сначала продемонстрируйте простойHTTPСлужить,Просто используйтеhttp.ListenAndServeфункция запускаетHTTPСлужить,повторное использованиеhttp.HandleFuncфункция对В特定endpointЗарегистрируйтеresponse handler

начинать,КонфигурацияHTTPСлужить:

Язык кода:javascript
копировать
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Служитьиз支持。

Язык кода:javascript
копировать
func ListenAndServeTLS(certFile string,keyFile string) error

Из приведенной выше сигнатуры функции видно, что,两者唯一из区别существовать В额外изcertFileиkeyFileпараметр,Соответственно представляютSSL Certificateдокументиз路径иprivate keyдокумент。

генерироватьprivate keyиSSL certificate

以下дагенерироватькореньключевой сертификатиз步骤:

    1. генерироватькореньkey

openssl genrsa -des3 -out rootCA.key 4096

    1. создаватьи对кореньcertificateДелатьсамоподпись (самоподпись)

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt

затем,按下面из方式для每个Служитьгенерироватьcertificate:

    1. создаватьcertificate key openssl genrsa -out localhost.key 2048
    1. создаватьcertificate-signing request(CSR)CSRдасуществовать哪里指定你想генерироватьизcertificateиз详情。кореньkeyиз拥有者将执行request来генерироватьcertificate。当создаватьCSRчас,重要изда指定提供IP地址изCommon Name,Доменное имя или Служить,в противном случаеcertificateНе удалось проверить。
Язык кода:javascript
копировать
openssl req -new -key localhost.key -out localhost.csr
    1. 使использоватьTLS CSRи密钥以及CAкорень密钥генерировать证书
Язык кода:javascript
копировать
openssl x509 -req -in localhost.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out localhost.crt -days 500 -sha256

наконец,遵循同样步骤для每个客户端генерироватьcertificate

Настройте HTTPS-сервер

Поскольку существуетprivate keyиcertificateдокумент,Вы можете изменить предыдущую программу go,这次использоватьListenAndServeTLSзаменять。

Язык кода:javascript
копировать
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),Вы можете увидеть следующий вывод:

Язык кода:javascript
копировать
$ curl https://localhost:8443/ --cacert rootCA.crt --key client.key --cert client.crt 

Running HTTPS Server!!

Вот и все! Это то, что нужно сделать большинству людей, чтобы запустить HTTPS-сервер. Это поведение и функциональность Go по умолчанию для управления связью TLS.

Настройте службу HTTPS для автоматического обновления сертификатов.

当бегать以上изHTTPSСлужить,ты положилcertFileиkeyFileпрошел дальшеListenAndServeTLSфункция,Однако,если потому чтоcertificateИстекшийcertFileиkeyFileизменять,Чтобы изменения вступили в силу, необходимо перезапустить Служить.,Чтобы преодолеть кратковременное прерывание, вызванное этим прерыванием,,可以使использоватьnet/http包изTLSConfig

cryto/tls包изTLSConfigструктуравстреча Конфигурация СлужитьизTLSпараметр,включать Служить Сертификат и т. д.。всеTLSConfigизпараметр都да可选项,同час也要注意给TLSconfigизпараметр Конфигурация选项赋以空структура,就等同В赋个nilстоит это дать。Однако,КонфигурацияGetCertificate字段却да相当有益из。

Язык кода:javascript
копировать
type Config struct{
    GetCertificate func(*ClientHelloInfo) (*Certicate,error)
}

TLSConfigизGetCertificate字段встреча基ВClientHelloInfoсертификат возврата。

мне нужно реализоватьGetCertificate闭包функция,该функция使использоватьtls.LoadX509KeyPair(certFile string, keyFile string) или tls.X509KeyPair(certFile []byte, keyFile []byte)функция来获取证书,Приведите два примера:

Язык кода:javascript
копировать
#Это использование 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структура:

Язык кода:javascript
копировать
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。бегать Служить,он будет работать как раньше,Но разница в том, что,Я абстрагировал всю конфигурацию Служить от вызывающего объекта.,Поэтому, даже если эти конфигурации будут обновлены,Он также будет загружаться динамически,Без перезапуска Служить.

Язык кода:javascript
копировать
$ 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,Каждый слой имеет свои функции и особенности.,Способны сотрудничать друг с другом для выполнения задач передачи данных и сетевой связи.

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

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода