
회사 노트북에서 Python으로 OpenAI API, Slack Webhook, 사내 SaaS API를 호출할 때 SSLCertVerificationError나 ProxyError가 뜬다면 답은 보통 두 가지입니다. 프록시 주소를 명시하고, 회사 루트 인증서를 Python이 신뢰하는 CA 번들에 연결해야 합니다.
프록시 URL과 사내 CA 파일을 준비한 뒤, 먼저 requests 테스트 코드로 HTTPS 통과 여부를 확인해보세요.
특히 Claude Code, Cursor, n8n, 사내 자동화 봇처럼 외부 HTTPS API를 많이 부르는 워크플로에서는 이 설정이 한 번 막히면 모든 테스트가 멈춥니다. 아래 순서대로 확인하면 보안 검증을 끄지 않고도 대부분 해결할 수 있습니다.
IT팀에서 받은 사내 Root CA 인증서 파일과 프록시 URL을 준비한 뒤, 아래 체크리스트대로 10분 안에 requests 호출부터 확인해보세요.
가장 먼저 확인할 3가지
에러 메시지가 길어도 출발점은 단순합니다. 아래 세 항목 중 하나가 비어 있으면 Python HTTPS 요청은 회사망에서 자주 실패합니다.
- 프록시 주소: 예)
http://proxy.company.local:8080 - 사내 루트 인증서: 보통
.crt,.cer,.pem형태 - Python이 보는 인증서 경로:
REQUESTS_CA_BUNDLE또는SSL_CERT_FILE
절대 첫 해결책으로 verify=False를 넣지 마세요. 당장은 통과되지만 중간자 공격 감지를 꺼버리는 방식이라, 사내 코드 리뷰나 보안 점검에서 바로 문제가 됩니다.
1) requests에서 프록시와 인증서 번들을 같이 지정
가장 빠른 검증 코드는 아래처럼 작성합니다. 예시는 Slack API나 OpenAI API 대신 공개 테스트 주소를 썼지만, 실제로는 사내에서 허용된 API 도메인으로 바꿔 테스트하면 됩니다.
import requests
proxies = {
'http': 'http://proxy.company.local:8080',
'https': 'http://proxy.company.local:8080',
}
r = requests.get(
'https://www.python.org',
proxies=proxies,
verify='/path/to/company-root-ca.pem',
timeout=10,
)
print(r.status_code)
여기서 verify에는 서버 인증서가 아니라 회사가 배포한 루트 CA 또는 중간 CA가 포함된 PEM 파일을 넣어야 합니다. 브라우저에서 내보낸 인증서가 DER 형식이면 PEM으로 변환이 필요할 수 있습니다.
2) 매번 코드에 넣기 싫다면 환경 변수로 고정
AI 코딩 에이전트나 배치 스크립트처럼 여러 도구가 같은 Python 환경을 쓰면 코드마다 설정을 넣는 방식은 금방 지저분해집니다. 이때는 셸 환경 변수로 통일하는 편이 낫습니다.
# macOS / Linux
export HTTPS_PROXY='http://proxy.company.local:8080'
export HTTP_PROXY='http://proxy.company.local:8080'
export REQUESTS_CA_BUNDLE='/path/to/company-root-ca.pem'
export SSL_CERT_FILE='/path/to/company-root-ca.pem'
# Windows PowerShell
$env:HTTPS_PROXY='http://proxy.company.local:8080'
$env:HTTP_PROXY='http://proxy.company.local:8080'
$env:REQUESTS_CA_BUNDLE='C:\certs\company-root-ca.pem'
$env:SSL_CERT_FILE='C:\certs\company-root-ca.pem'
이렇게 해두면 requests, 일부 SDK, 내부 자동화 스크립트가 같은 인증서 정책을 따라갑니다. 다만 모든 라이브러리가 동일하게 환경 변수를 읽는 것은 아니므로, 실패하면 해당 SDK 문서를 따로 확인해야 합니다.
직접 막히는 지점: pip, certifi, 사내 인증서
개발 환경을 처음 세팅할 때는 pip install부터 실패하는 경우가 많습니다. 이때는 Python 패키지 설치 도구에도 인증서 위치를 알려줘야 합니다.
pip install requests --proxy http://proxy.company.local:8080 --cert /path/to/company-root-ca.pem
프로젝트마다 반복된다면 pip.ini 또는 pip.conf에 저장할 수 있습니다.
[global]
proxy = http://proxy.company.local:8080
cert = /path/to/company-root-ca.pem
주의할 점은 certifi입니다. requests는 기본적으로 certifi의 CA 번들을 사용합니다. 회사가 HTTPS 트래픽을 검사하는 환경에서는 공인 CA가 아니라 사내 CA로 재서명된 인증서를 받기 때문에 기본 번들만으로는 검증이 실패합니다. 그래서 REQUESTS_CA_BUNDLE로 회사 CA를 명시하거나, 회사 CA를 포함한 통합 PEM을 만들어 지정하는 방식이 안전합니다.
어떤 방식이 맞을까?
| 상황 | 추천 설정 | 장점 | 주의점 |
|---|---|---|---|
| 단일 스크립트 테스트 | requests.get(..., proxies=, verify=) |
원인 분리가 쉽다 | 코드에 환경 정보가 남을 수 있음 |
| Cursor, Claude Code, 자동화 봇이 같은 터미널 사용 | 환경 변수 HTTPS_PROXY, REQUESTS_CA_BUNDLE |
여러 도구에 공통 적용 | 터미널/세션마다 적용 여부 확인 필요 |
| 패키지 설치가 실패 | pip --proxy --cert 또는 pip 설정 파일 |
초기 개발환경 구축에 적합 | 개인 토큰이 설정 파일에 섞이지 않게 관리 |
| Docker 컨테이너 내부에서 실패 | 이미지에 CA 복사 후 OS trust store 갱신 | CI/CD와 재현성 좋음 | 베이스 이미지별 명령이 다름 |
추천 대상별 선택
AI API 호출을 붙이는 개발자라면 환경 변수 방식부터 잡으세요. OpenAI, Anthropic, Perplexity API SDK처럼 내부에서 HTTP 클라이언트를 감싸는 도구는 코드 레벨 설정이 라이브러리마다 달라질 수 있기 때문입니다.
사내 자동화 담당자라면 pip 설정과 실행 환경 변수를 함께 문서화하는 게 좋습니다. n8n 커스텀 노드나 Jenkins, GitHub Actions Enterprise Runner에서 같은 문제가 반복되기 때문입니다.
보안이 엄격한 금융·대기업망이라면 직접 우회하지 말고 IT 보안팀에서 제공한 CA 파일과 프록시 정책을 사용하세요. 인증서 검증 비활성화는 테스트용으로도 로그에 남기지 않는 편이 안전합니다.
가상의 빌드 예시: Slack 알림 봇이 회사망에서 실패할 때
예를 들어 Python 스크립트가 사내 배치 결과를 Slack Webhook으로 보내는 상황을 생각해보겠습니다. 로컬 집 인터넷에서는 성공하지만 회사망에서는 certificate verify failed가 납니다.
이 경우 순서는 이렇습니다. 먼저 IT 포털에서 회사 Root CA를 내려받아 company-root-ca.pem으로 저장합니다. 다음으로 터미널에 HTTPS_PROXY와 REQUESTS_CA_BUNDLE을 지정합니다. 마지막으로 Slack Webhook 호출 코드를 다시 실행합니다. 실제 결과는 회사 프록시 정책, 허용 도메인, 인증 방식에 따라 달라질 수 있습니다.
자주 묻는 질문
Q. verify=False로 해결해도 되나요?
권장하지 않습니다. 임시 원인 확인에는 쓸 수 있지만, 운영 코드나 사내 저장소에 남기면 보안 리스크가 큽니다. 올바른 해결은 회사 CA를 신뢰 저장소나 CA 번들에 추가하는 것입니다.
Q. 프록시가 아이디/비밀번호를 요구하면요?
프록시 URL에 인증 정보를 넣는 방식이 가능하지만, 비밀번호가 히스토리와 로그에 남을 수 있습니다. 가능하면 회사에서 제공하는 SSO, NTLM/Kerberos용 클라이언트, 또는 보안 저장소 연동 방식을 확인하세요.
Q. Docker에서는 왜 호스트에서 되던 요청이 실패하나요?
컨테이너는 별도의 인증서 저장소를 씁니다. 호스트 OS에 CA를 설치해도 컨테이너 안에는 반영되지 않습니다. Dockerfile에서 CA 파일을 복사하고, Debian/Ubuntu 계열이면 update-ca-certificates 같은 명령으로 갱신해야 합니다.
다음 행동
오늘 바로 할 일은 명확합니다. 첫째, 회사 프록시 URL과 Root CA 파일을 확보하세요. 둘째, requests 단일 테스트 코드로 통과 여부를 확인하세요. 셋째, 성공한 설정을 프로젝트 README나 팀 온보딩 문서에 남기세요. 이 세 가지만 해도 AI 코딩 에이전트, API 테스트, 자동화 스크립트가 같은 문제로 멈추는 시간을 크게 줄일 수 있습니다.
관련 링크
- 코딩 에이전트용 프롬프트 작성법, 막히는 요청 줄이기: Claude Code에서 바로 먹히는 요청 구조
- 파이썬 웹 크롤러 직접 만든 개발기: 실전 셋업부터 장애 해결까지
- 관련 태그 더 보기
- 카테고리 더 보기
- 검색 결과 더 보기
- 참고 링크
