1. 기본 설정은 다음과 같으며 http://localhost:8080/test 요청과 응답 결과이다.
(* 루트 권한이 없는 상태에서 설정하는 방법을 베이스로 합니다.)
2. 에코에서 제공하는 autoSSL 사용하기 (실패)
ssl 인증과 같은 과정을 거치지 않고 에코에서 제공하는 단순한 방법을 활용해서 작성하고자 했다.
func main() {
e := echo.New()
e.GET("/test", func(c echo.Context) error {
return c.JSON(200, struct {
Name string `json:"name"`
Message string `json:"message"`
}{"testing", "From Server !"})
})
go func() {
log.Error(e.StartAutoTLS(":8081"))
}()
log.Error(e.Start(":8080"))
}
기존 8080 은 http 요청으로 띄우고 https는 8081로 띄우고 싶었다. 기존 http 요청으로 사용하던 api들이 있을 수 있다는 생각에 위와 같이 작성
포스트맨 응답
Error: write EPROTO 4818108888:error:10000438:SSL routines:OPENSSL_internal:TLSV1_ALERT_INTERNAL_ERROR:../../../../src/third_party/boringssl/src/ssl/tls_record.cc:594:SSL alert number 80
1. 인증서와 키 파일이 올바른지 확인하기: 인증서와 키 파일이 올바르게 생성되었고, 파일 경로와 이름이 올바르게 지정되었는지 확인하세요. 또한, 인증서가 CA에 의해 서명되었다면, 모든 중간 인증서가 올바르게 체인에 포함되어 있는지 확인해야 합니다.
2. SSL/TLS 설정이 올바른지 확인하기: 서버와 클라이언트가 모두 지원하는 SSL/TLS 버전을 사용하고 있는지 확인해야 합니다. 예를 들어, 클라이언트가 TLSv1.2만 지원하는데 서버가 TLSv1.3만 지원한다면, 이러한 종류의 오류가 발생할 수 있습니다.
3. 클라이언트의 이슈가 아닌지 확인하기: 오류가 서버의 문제가 아니라 클라이언트의 문제일 수도 있습니다. 다른 클라이언트에서 같은 요청을 시도해 보고, 같은 문제가 발생하는지 확인하세요.
4. 로깅을 통해 추가적인 정보 수집: Go의 http 패키지는 기본적으로 SSL/TLS 에러에 대한 많은 정보를 제공하지 않습니다. 따라서 net/http 패키지의 httptrace 패키지를 사용하여 추가적인 디버깅 정보를 수집하거나, OpenSSL의 s_client 도구를 사용하여 SSL/TLS 핸드셰이크를 수동으로 시도해 볼 수 있습니다.
검색 결과 위와 같은 방식의 검증이 필요한 것으로 보인다. AutoSSL 함수 호출을 열어보면 letsentcrypt.org로부터 인증서를 자동으로 받아와 세팅을 해준다.
우리의 리눅스 서버에 해당 주소의 권한이 없어서 인증서 발급이 명확하게 되지 않아 실패한 것으로 보인다.
root 권한이 없기 때문에 이 방법은 패스하도록 한다.
3. cusotm SSL 설정
ssl을 돈 주고 사기 싫으니깐 개인적으로 생성한다.
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
X.509 인증서를 발급을 openssl에 요청하는 커맨드이다. key.pem 키 파일로 , cert.pem 은 인증서 파일로 365일의 유효기간을 가지고 있으며, 개인키는 암호화되지 않음을 의미한다.
명령어를 입력하면 위와 같은 커맨드 내용이 보인다. Common name에 실제 도메인을 적어주면 된다.
위와 같은 명령어를 실행하면 key.pem, cert.pem 파일을 각각 준다
scp -P "key 파일경로" "cert 파일경로" 유저@도메인:/옮기고자 하는 디렉토리
코드 전문
func main() {
e := echo.New()
e.GET("/test", func(c echo.Context) error {
return c.JSON(200, struct {
Name string `json:"name"`
Message string `json:"message"`
}{"testing", "From Server !"})
})
go func() {
s := http.Server{
Addr: ":9087",
Handler: e,
TLSConfig: &tls.Config{
NextProtos: []string{acme.ALPNProto},
},
}
log.Error(s.ListenAndServeTLS("cert.pem 파일경로", "key.pem 파일경로"))
}()
log.Error(e.Start(":9086"))
}
Server를 직접 구조체를 만드는 데 핸들러에 echo 프레임 워크를 주입해서 만들어 주면 된다.
빌드해주고 서버로 날려주자
env GOOS=linux GOARCH=amd64 go build -o guiwoo_test
위에 보이는 것처럼 두 개의 요청 모두 성공한다.
4. 미들웨어로 열어놓고 리다이렉트 하기
func main() {
e := echo.New()
e.GET("/test", func(c echo.Context) error {
return c.JSON(200, struct {
Name string `json:"name"`
Message string `json:"message"`
}{"testing", "From Server !"})
})
e.Pre(func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
if c.Request().TLS != nil {
redirectURL := "http://" + "localhost:9086" + c.Request().URL.String()
return c.Redirect(http.StatusMovedPermanently, redirectURL)
}
return next(c)
}
})
go func() {
s := http.Server{
Addr: ":9087",
Handler: e,
TLSConfig: &tls.Config{
NextProtos: []string{acme.ALPNProto},
},
}
log.Error(s.ListenAndServeTLS("/Users/guiwoopark/Documents/cert.pem", "/Users/guiwoopark/Documents/key.pem"))
}()
log.Error(e.Start(":9086"))
}
9087 https로 요청온 request를 낚아서 HTTP 포트로 리다이렉트 하는 방법이다.
nginx 도 이런 비슷한 방식을 사용하니 nginx 방법도 고려해 보자.
'Go > ehco' 카테고리의 다른 글
SSE 적용하기 (0) | 2024.05.19 |
---|---|
리버스 프록시(echo,reverse proxy) (0) | 2023.08.08 |