Как добиться эффективного делегирования сертификатов без простоев при использовании 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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose