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
BASH
* 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)
CODE
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
BASH
서버의 TLS 설정에 따라서 낮은 TLS 버전은 허용 안 될수 있습니다.
* 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):
CODE
사용할 일이 적겠지만 다음 옵션으로 SSL 을 사용하도록 지정할 수도 있습니다.
- -2, --sslv2 Use SSLv2 (SSL)
- -3, --sslv3 Use SSLv3 (SSL)
$ curl --sslv3 https://www.example.come
BASH