curl 사용할 SSL/TLS 버전(version) 강제로 지정하기

TLS Version 지정

서버의 SSL/TLS 버전과 인증서등 TLS 구성 환경을 조회해야 할 경우가 있습니다.

이럴 때  --tlsv1.x 옵션으로 curl 에서 사용할 SSL/TLS 의 버전을 지정할 수 있으며 가능한 버전은 다음과 같습니다.

  • -1, --tlsv1     Use => TLSv1 (SSL)
  • --tlsv1.0       Use TLSv1.0 (SSL)
  • --tlsv1.1       Use TLSv1.1 (SSL)
  • --tlsv1.2       Use TLSv1.2 (SSL)
  • --tlsv1.3       Use TLSv1.3 (SSL)

다음 예제는 TLS 1.2 로 연결(--tlsv1.2)하며 서버 응답이 301, 302일 경우 새로운 Location 으로 따라가며(-L)  서버의 응답을 상세하게 표시합니다.

$ curl --tlsv1.2 -I -v -L https://naver.com
 서버 상세 응답 보기...
* Connection #1 to host www.naver.com left intact
* Issue another request to this URL: 'https://www.naver.com/'
*   Trying 125.209.222.142...
* TCP_NODELAY set
* Connected to www.naver.com (125.209.222.142) port 443 (#2)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, [no content] (0):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=KR; ST=Gyeonggi-do; L=Seongnam-si; O=NAVER Corp.; CN=*.www.naver.com
*  start date: May 30 00:00:00 2020 GMT
*  expire date: Jun  8 12:00:00 2022 GMT
*  subjectAltName: host "www.naver.com" matched cert's "www.naver.com"
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)


TLS max Version 지정

상세 정보를 보면 TLS1.2 를 지정했지만 1.3 을 사용하는 것을 알수 있습니다.

이는 TLS protocol negotiation 과정에서 사용 가능한 프로토콜 버전을 교환하고 가능하면 높은 버전을 사용하기 때문입니다.


맞는 방침이지만 테스트를 할 경우 특정한 버전을 지정해야 할 수 있으며 이럴 때는 --tls-max 옵션뒤에 최대 TLS 버전을 지정해 주면 됩니다.

다음 명령은 TLS 최대 버전을 1.2 로 지정하므로 TLS 1.2 로 통신하는 것을 확인할 수 있습니다.

$ curl --tlsv1.2 --tls-max 1.2 -I -v -L https://naver.com

서버의 TLS 설정에 따라서 낮은 TLS 버전은 허용 안 될수 있습니다.

 Click here to expand...
* Connection #1 to host www.naver.com left intact
* Issue another request to this URL: 'https://www.naver.com/'
*   Trying 223.130.195.95...
* TCP_NODELAY set
* Connected to www.naver.com (223.130.195.95) port 443 (#2)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):


사용할 일이 적겠지만 다음 옵션으로 SSL 을 사용하도록 지정할 수도 있습니다.

  • -2, --sslv2         Use SSLv2 (SSL)
  • -3, --sslv3         Use SSLv3 (SSL)
$ curl --sslv3 https://www.example.come

같이 보기

Ref