Como usar HTTPS na Amazon com Go?

43 views
Skip to first unread message

Ivan Sansão

unread,
Aug 29, 2019, 9:12:23 AM8/29/19
to Golang Brasil
Fala Galera,

Fiz um backend em Golang e coloquei na Amazon Beanstalk mas ele fica com url HTTP, como faço para usar HTTPS na Amazon?

Será que devo usar HttpListenAndServeTLS ?

Eu deveria pegar o certificado da Amazon?

Everton Marques

unread,
Aug 31, 2019, 3:10:51 PM8/31/19
to Golang Brasil
Se puser um LB na frente, você pode deixar o código Golang com HTTP:

"A maneira mais simples de usar HTTPS com um ambiente Elastic Beanstalk é atribuindo um certificado de servidor ao load balancer do seu ambiente. Quando você configura o load balancer para encerrar o HTTPS, a conexão entre o cliente e o load balancer é segura. As conexões de back-end entre o load balancer e as instâncias do EC2 usam HTTP, portanto nenhuma configuração adicional das instâncias é necessária."

https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/configuring-https.html

Se expuser o backend diretamente, sem LB, aí precisará mudar o código Go para TLS.
E precisará obter o certificado desejado e passar para o código Go, claro.
Vide exemplo abaixo.

Fonte: https://github.com/udhos/gowebhello/blob/master/gowebhello/main.go

func main() {
        // ...
    if err := listenAndServeTLS(httpsAddr, cert, key, nil, keepalive); err != nil {
        log.Fatalf("listenAndServeTLS: %s: %v", httpsAddr, err)
    }
}

func listenAndServeTLS(addr, certFile, keyFile string, handler http.Handler, keepalive bool) error {
    server := &http.Server{Addr: addr, Handler: handler}
    server.SetKeepAlivesEnabled(keepalive)
    return server.ListenAndServeTLS(certFile, keyFile)

Ivan Sansão

unread,
Sep 3, 2019, 11:16:05 AM9/3/19
to Golang Brasil
Everton, Muito obrigado pelo Help.. 

Eu preciso mesmo setar esse KeepAlive?  No meu fonte só uso assim:

log.Fatalln(http.ListenAndServeTLS(":443", "server.crt", "server.key", r))


----- meu fonte -----

package server

import (
"encoding/json"
"log"
"net/http"

)

// Start is the entry point of web services
func Start() {

r := mux.NewRouter()
r.Use(middleware)
r.HandleFunc("/teste", teste).Methods("GET")
r.Use(mux.CORSMethodMiddleware(r))

log.Println("HTTPS Escutando a porta: 443")
log.Fatalln(http.ListenAndServeTLS(":443", "server.crt", "server.key", r))

}

func middleware(next http.Handler) http.Handler {

return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json")

w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Max-Age", "86400")
w.Header().Set("Access-Control-Allow-Methods", "GET, OPTIONS, HEAD, PUT, POST")
w.Header().Set("Access-Control-Allow-Credentials", "true")
w.Header().Set("Access-Control-Expose-Headers", "X-Header, X-Y-Header")

r.Header.Set("Access-Control-Request-Method", "POST, GET")                                                                           // needs to be non-empty
r.Header.Set("Access-Control-Request-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization") // needs to be non-empty
r.Header.Set("Access-Control-Request-Origin", "*")
r.Header.Set("Access-Control-Expose-Headers", "X-Header, X-Y-Header")

next.ServeHTTP(w, r)
})

}

func teste(rw http.ResponseWriter, req *http.Request) {
json.NewEncoder(rw).Encode("Backend 1.21 443 is working....")
}

---------------------------

David Valentim Dias

unread,
Sep 3, 2019, 12:18:13 PM9/3/19
to golang...@googlegroups.com
Tudo bom Ivan?

O keep-alive mantem a conexão por um tempo. Se o usuário navegar para outro handler uma nova conexão não precisa ser criada. Isso economiza recursos, lembrando que o handshake é a parte mais custosa do https.
É bem recomendando usar!

Abraços

--

---
Você recebeu essa mensagem porque está inscrito no grupo "Golang Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para golang-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/golang-brasil/347fe019-7cbb-4652-8315-9f697c8834bb%40googlegroups.com.

Ivan Sansão

unread,
Sep 3, 2019, 4:37:13 PM9/3/19
to Golang Brasil
David, muito obrigado pela dica!!!

Vou usar!!
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para golang...@googlegroups.com.

Ivan Sansão

unread,
Sep 4, 2019, 1:37:26 PM9/4/19
to Golang Brasil
Fala Galera,

Ainda estou com dificuldades

Eu usando assim (abaixo) porém eu tenho que colocar esse "8" na frente senão o beanstalk dá erro e não sobe:

server := &http.Server{Addr: ":8443", Handler: r}
server.SetKeepAlivesEnabled(true)
log.Fatalln(server.ListenAndServeTLS("server.crt", "server.key"))

Então, se eu deixo 443 e configuro HTTPS no "Security groups" da Amazon, não funciona

Tenho que configurar 8443 no "Security groups" aí funciona!

Alguém já passou por isso?


Message has been deleted

Ivan Sansão

unread,
Sep 4, 2019, 5:28:19 PM9/4/19
to Golang Brasil
Pelo que parece o Elastic Beanstalk só aceita porta abaixo de 1024, então por enquanto deixei a porta 8443 mesmo para meu Backend!

Aí pra funcionar também tive que configurar o Security Group colocando lá a porta Custom TPC Porta 8443

Reply all
Reply to author
Forward
0 new messages