cURL로 SSL 인증서 오류를 무시하는 방법: 단계별 가이드

댓글: 0

cURL을 사용하여 HTTP 요청을 수행하는 동안 SSL 인증서를 확인하는 데 문제가 발생하는 경우가 있습니다. 이는 자체 서명된 서버 인증서를 사용하거나 만료된 경우 발생할 수 있습니다. 이러한 경우 cURL은 가능한 위험으로부터 사용자를 보호하기 위해 기본적으로 연결을 거부합니다. 그러나 이는 API 테스트, 폐쇄된 네트워크에서 작업하거나 로컬 서비스를 사용하는 동안 프로세스를 방해할 수 있습니다. 그렇기 때문에 cURL이 SSL을 무시하는 상황과 이를 구현하는 방법을 알아볼 필요가 있습니다.

이 문서에서는 cURL에서 SSL 인증서를 무시하는 방법, 실행해야 하는 특정 명령어, 보안과 관련된 우려 사항에 대해 자세히 설명합니다.

unnamed.jpg

cURL과 SSL이란 무엇인가요?

cURL(클라이언트 URL)은 다양한 프로토콜을 사용하여 데이터를 전송하기 위한 명령줄과 라이브러리를 제공하는 소프트웨어 프로젝트입니다. 이 도구는 다양한 네트워크 유형에서 작동하기 때문에 다양한 웹 리소스에서 요청, API 테스트 또는 정보 검색을 자동화하는 데 매우 유용합니다.

SSL(보안 소켓 계층)은 인터넷을 통한 데이터 전송을 보호하는 암호화 기술의 한 형태입니다. 이 인증서는 특정 웹사이트가 신뢰할 수 있음을 증명하고 사용자와 서버 간의 보안 연결을 설정하는 문서입니다. 자체 서명되었거나 만료되었거나 유효하지 않은 서버 인증서는 cURL 작동 중 차단으로 이어집니다.

이러한 문제를 피하려면 SSL을 비활성화하는 것이 더 좋으므로 cURL 요청을 수행하면 성공률이 높아집니다. 이 테스트 방법은 매우 유용하지만 보안 측면에서는 위험할 수 있습니다.

cURL, 컬 또는 컬: 차이점은 무엇인가요?

이 도구의 공식 명칭은 cURL이며, 단어의 첫 글자는 소문자이고 나머지는 대문자입니다. 문서, 문서 및 코드에서 여러 가지 다른 양식을 찾을 수 있습니다:

  • curl(모두 소문자) - 대부분의 개발자가 코드와 명령줄에 쓰는 방식입니다.
  • Curl(대문자 C) - 비공식 문서에서 가끔 사용되지만 올바르지 않습니다.

철자에 관계없이 cURL은 항상 cURL입니다. URL 구문으로 데이터를 전송하기 위한 크로스 플랫폼 및 명령줄 도구입니다. 웹 개발, 시스템 관리 및 DevOps에 종사하는 대부분의 사람들이 HTTP 요청, API 테스트 및 서버 자동화 상호 작용을 수행하는 데 사용합니다.

왜 SSL 확인을 비활성화해야 하나요?

일반적으로 데이터 전송 유틸리티는 가짜 사이트와 공격을 차단하기 위해 사용자 화면에 표시되는 인증서의 유효성을 검사합니다. 그러나 cURL이 인증서 확인을 무시하는 시나리오가 있습니다. 이러한 경우가 언제 발생하는지 살펴보겠습니다:

  • 테스트 또는 로컬 서버에서 자체 발급한 인증서를 사용하는 경우. 개발자는 API 또는 애플리케이션을 테스트하는 동안 공식 인증 기관(CA)에서 승인하지 않은 자체 서명 인증서를 만드는 경우가 많습니다.
  • 직원의 회사 내부 서비스 액세스. 조직의 내부 서버에는 일반적으로 신뢰할 수 없는 인증서가 있습니다. 이러한 리소스에 대한 자동화된 액세스가 필수인 경우 인증서 검사를 해제하는 것이 최적의 임시 해결책입니다.
  • 특정 사이트에는 만료되었거나 유효하지 않은 서버 인증서가 있습니다. 이러한 리소스에서 정보를 가져오는 것이 중요한 경우, 사용자에게 특정 인증서 오류가 발생하지 않도록 유효성 검사를 일시적으로 해제할 수 있습니다. 이 경우 cURL은 SSL 오류를 무시하고 모든 것이 정상적으로 작동합니다.
  • 검사를 비활성화하면 네트워크 요청 자동화가 필요한 스크립트에서 장애를 방지하는 데 도움이 됩니다. 스크립트에서 잘못된 인증서가 있는 서버에 지속적으로 요청을 보내는 경우 확인을 비활성화해야 합니다.

확인은 매우 중요한 요소이지만, 이 기능을 완전히 끄면 문제와 위험이 발생할 수 있습니다. 이에 대해서는 다음에 설명하겠습니다.

SSL 비활성화의 보안 위험

cURL이 인증서를 무시한다는 것은 다양한 보안 공격을 통해 연결이 악용될 수 있음을 의미하며, 이는 비밀번호, 토큰 또는 결제 데이터와 같은 민감한 정보가 관련된 경우 특히 중요합니다.

주요 위협:

  • Man In The Middle Attack (MITM) - 사용자와 서버 간의 정보를 가로채 데이터를 변경하거나 대체하는 기법입니다. 검증할 사람이 없는 경우 악의적인 공격을 실행하기가 너무 쉬워지기 때문에 더 큰 위험을 초래할 수 있습니다. 예를 들어, 로그인 페이지를 가짜 페이지로 대체하여 공격자가 쉽게 자격 증명을 수집할 수 있습니다.
  • cURL이 서버 인증서를 확인할 수 없어 무효화됩니다. 따라서 원하는 노드가 연결하려는 노드인지 확인할 방법이 없으며, 액터를 신뢰할 수 있는 리소스로 위장하여 사이트를 대체할 수 있습니다.
  • 테스트 중에 검증이 비활성화되고 해당 코드가 프로덕션 환경으로 전송되면 기밀 정보가 유출되거나 무차별 대입 공격이 발생할 가능성이 높아질 수 있습니다.

SSL 오류를 무시하는 cURL이 필요한 경우 자체 서명 인증서를 보는 것이 가장 중요합니다:

  • 테스트 환경에서만 확인을 우회하고 프로덕션 환경에서는 확인을 피합니다;
  • 암호화되지 않은 연결을 통해 기밀 정보를 전송하지 않습니다;
  • 자체 서명된 인증서를 수동으로 신뢰할 수 있는 인증서에 추가합니다;
  • 구성 오류를 제외한 코드를 모니터링하여 프로덕션 코드에 검증이 남아 있는지 확인합니다.

다음 블록에서는 인증서 확인을 비활성화하기 위해 명령줄에서 수행되는 프로세스를 자세히 분석합니다.

cURL로 SSL 오류를 우회하는 방법

cURL이 SSL을 무시하도록 하려면 인증 확인을 일시 중단하는 특정 매개변수를 포함해야 합니다. 앞서 언급했듯이 이러한 방법은 보안이 적절한 환경 내에서만 사용할 수 있습니다.

잘못된 사이트 인증서 오류를 완화하는 가장 효과적인 방법은 임시 인증 스푸핑을 수동으로 구성하는 것입니다. 다음 매개 변수를 사용하여 이 작업을 수행할 수 있습니다:

  • -k 또는 --insecure—서버의 인증서가 유효하지 않은 것으로 판명된 사이트에 연결할 때 사용합니다;
  • --cacert—를 사용하여 사용자 인증서 파일이 저장되는 위치를 정의합니다.

다음은 인증서 확인을 무시하는 cURL 호출 예제를 만드는 방법입니다:


curl -k https://example.com

이 옵션을 사용하면 만료된 서버 인증서가 있어도 cURL 호출을 통과할 수 있습니다.

데이터를 전송하려는 경우(예: POST 요청):


curl -k -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "param=value" https://example.com/api

최상의 보안을 위해 파일이 있는 디렉터리를 직접 선택합니다.


curl --cacert /path/to/cert.pem https://example.com

스크립트에서 SSL 확인 비활성화하기

요청이 명령줄을 통해 자동화되고 사용자의 존재 여부가 필요하지 않아야 하는 경우 이러한 시나리오에서는 인증서 확인을 비활성화하는 것이 좋습니다.

이것은 Bash에서 cURL이 SSL을 무시하는 방법의 예시입니다:


#!/bin/bash
URL="https://example.com"
DATA=$(curl -k $URL)
echo "Server response: $DATA"

Python에서는 verify를 False로 설정한 요청 모듈을 사용할 수 있습니다:


import requests
url = "https://example.com"
response = requests.get(url, verify=False)
print(response.text)

이 명령을 실행하면 Python에서 안전하지 않은 연결에 대한 경고를 표시합니다. 또한 사이트에 잘못된 서버 인증서가 있는 경우 발생하는 경고를 비활성화하는 코드를 작성해야 합니다:


import requests import urllib3 

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) 

url = "https://example.com"
response = requests.get(url, verify=False)
print(response.text)

이제 cURL을 사용하는 PHP에 대해 알아보겠습니다:


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

아래 표에는 SSL 검사를 무시하는 가장 일반적인 방법과 사용 방법, 발생 가능한 위험이 나열되어 있습니다.

방법 명령/매개변수 사용 시기 위험
SSL 및 호스트 이름 확인을 완전히 비활성화하기 curl -k / --insecure 테스트 API, 로컬 서비스 MITM의 높은 위험
사용자 지정 인증서 사용 curl --cacert /path/to/cert.pem 자체 인증서가 있는 경우 더 안전하지만 설정이 필요합니다
코드에서 SSL만 비활성화하기 CURLOPT_SSL_VERIFYPEER=false 임시 테스트 프로덕션에 남아 있으면 위험

결론

오작동하는 서버 인증서는 cURL로 작동할 때보다 더 많은 문제를 일으킵니다. 인증서는 데이터 전송 중 사용자의 안전을 보장합니다. 따라서 확인을 비활성화하는 것은 cURL 디버깅 오류를 발견했을 때 최후의 수단입니다. 오류의 원인에 따라 문서 업데이트, 신뢰할 수 있는 지역에 추가 또는 올바른 지역으로 교체하는 등 덜 극단적인 다른 접근 방식이 있습니다.

SSL 검사를 하지 않으면 연결이 안전하지 않고 다른 사용자에 의해 쉽게 악용될 수 있습니다. 이 접근 방식은 테스트 중이거나 서비스가 외부에 있는 경우와 같이 통제된 환경에서만 허용됩니다. 일반적인 상황에서는 잘못된 서버 인증서가 제공될 경우 데이터 마스킹 및 기타 보안 허점이 발생할 수 있으므로 이 절을 작업 코드에 설정하지 않는 것이 중요합니다.

댓글:

0 댓글