Go net/http에서 tls: no renegotiation error 해결하기

에러의 내용을 요약하면 아래와 같습니다. renegoriation 미설정으로 인한 발생이네요.

local error: tls: no renegotiation

dalfox 릴리즈 후 처음으로 이슈올라온 내용입니다. 다른 언어에서는 기본적으로 설정되어 있어서, 크게 신경쓰지 않았었는데, go의 경우 기본으로 포함되지 않기 때문에(샘플이나 튜토리얼등에서의 언급이..) 자주 실수할 수 있는 부분으로 보입니다.

What is SSL renegoriation?

기존 보안 세션 내에서 새 핸드쉐이크 협상을 시작하는 것을 재협상이라고 부릅니다. SSL 사용 중 클라이언트 인증이나, 암호화 관련 정보(알고리즘/키 등등)의 변경이 있는 경우 새로 세션을 맺어야하는데 이 때 renegoriation, 즉 재협상을 사용해야합니다.

그래서 기존의 SSL 세션을 이용해서 renegoriation message(암호화 키 + @ 정보) 를 전달하고 이를 기반으로 서버와 클라이언트가 새로 SSL 세션을 맺을 수 있습니다. 이 과정을 SSL renegoriation 이라고 부르고, 클라이언트/서버 모두 이 과정을 시작할 수 있기 때문에 보통 SSL Clinet들은 기본적으로 내장한 상태로 동작하는 경우가 많습니다.

How to fix?

문제점부터 짚어보면, golang에선 기본적으로 내장된 코드도 아니고, 예시코드에도 나와있지 않아서 충분히 개발자가 실수할 수 있는 부분입니다. 단순하게 http client가 SSL renegoriation을 지원해줄 수 있도록 tls config에서 설정 후 사용해주면 됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
tr := &http.Transport{
        TLSClientConfig: &tls.Config{
            Renegotiation:      tls.RenegotiateOnceAsClient,
            InsecureSkipVerify: true},
    }

client := &http.Client{
        Timeout:   timeout,
        Transport: tr,
    }

저의 경우에도 비슷한 형태로 해결했습니다.

Reference

Licensed under CC BY-NC-SA 4.0
Last updated on Apr 26, 2022 00:20 +0900