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에서 설정 후 사용해주면 됩니다.

tr := &http.Transport{
        TLSClientConfig: &tls.Config{
            Renegotiation:      tls.RenegotiateOnceAsClient,
            InsecureSkipVerify: true},
    }

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

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

Reference

  • https://stackoverflow.com/questions/57420833/tls-no-renegotiation-error-on-http-request
  • https://devcentral.f5.com/s/articles/ssl-profiles-part-6-ssl-renegotiation