WebSocket через TLS: Golang / Горилла - PullRequest
0 голосов
/ 20 апреля 2020

Я пытался установить соединение WebSocket через TLS (то есть с шифрованием). Я использую Golang с Гориллой. Соединение WebSocket реализуется как исходное соединение HTTP, которое обновляется до соединения по протоколу WebSocket. Код выглядит так:

func wsEndpoint(w http.ResponseWriter, r *http.Request) {
    // upgrade
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        //...
    }

    log.Println("Client Connected")
    err = ws.WriteMessage(1, []byte("Hi Client!"))
    if err != nil {
        //...
    }
    // listen indefinitely for new messages coming 
}

Затем мы настраиваем маршрутизацию:

func main() {
    //...
    setupRoutes()
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Достаточно ли изменить последнюю строку на:

...http.ListenAndServeTLS(...)

другими словами, чтобы использовать TLS для установления sh первого соединения? Достаточно ли этого подхода для защиты всей связи через WebSocket от начала до конца? Должен ли я быть уверен, что вся передача пакетов в течение продолжительности соединения также защищена TLS? Если нет, то как настроить его в Golang / Gorilla Framework?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Используйте http.ListenAndServeTLS для шифрования базовых сетевых подключений, используемых для протокола HTTP и протокола WebSocket.

Этот подход обеспечивает защиту всего обмена данными через базовое сетевое подключение, включая все трафик WebSocket c.

Код сервера Gorilla использует сетевое соединение, предоставляемое сервером net / http. Код сервера Gorilla создает новые сетевые соединения.

http.ListenAndServeTLS - это вспомогательная функция, которая вызывает функции и методы более низкого уровня. Он также работает для непосредственного вызова этих функций и методов более низкого уровня.

0 голосов
/ 20 апреля 2020

Один из подходов к этой проблеме - настроить обратный прокси-сервер, например nginx, с certbot для генерации сертификатов.

Вот как это будет работать

[ Client ] ----------> [ nginx ] --------------> [ golang server ]
            Encrypted             Not encrypted
...