PEP 493 – Python 2.7용 HTTPS 검증 마이그레이션 도구
- Author:
- Alyssa Coghlan <ncoghlan at gmail.com>, Robert Kuska <rkuska at redhat.com>, Marc-André Lemburg <mal at lemburg.com>
- BDFL-Delegate:
- Barry Warsaw
- Status:
- Final
- Type:
- Standards Track
- Created:
- 10-May-2015
- Python-Version:
- 2.7.12
- Post-History:
- 06-Jul-2015, 11-Nov-2015, 24-Nov-2015, 24-Feb-2016
- Resolution:
- Python-Dev message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
PEP 476은 클라이언트 모듈에서 Python의 HTTPS 인증서 기본 처리 방식을 웹 브라우저의 인증서 처리 방식에 맞추도록 업데이트했으며, 수신한 인증서가 클라이언트가 접속하려던 서버에 속하는지 검증하도록 했습니다. Python 2.7 장기 유지 보수 계열도 이 변경의 적용 범위에 포함되는 것으로 판단되었으며, Python 2.7.9 유지 보수 릴리스에서 새로운 동작이 도입되었습니다.
이로 인해 영향을 받는 Python 2.7 유지 보수 릴리스의 도입에 상당한 장벽이 생겼으므로, 이 PEP에서는 시스템 관리자와 기타 사용자가 HTTPS 클라이언트 모듈에서 서버 인증서를 검증할지 여부와 더 새로운 Python 2.7 유지 보수 릴리스로 업데이트할지 여부를 보다 쉽게 분리할 수 있도록 Python 2.7 전용 추가 기능을 제안합니다.
근거
PEP 476은 HTTPS URL의 의미와 관련하여 웹 브라우저가 확립한 기대에 맞도록 Python의 기본 동작을 변경했습니다. Python 2.7.9 및 3.4.3부터 표준 라이브러리의 HTTPS 클라이언트는 기본적으로 서버 인증서를 검증합니다.
그러나 자체 서명 인증서에 의존하는 사설 인트라넷을 운영하는 인프라 관리자에게 이 변경이 실제로 문제를 일으키거나, 새로운 기본 인증서 검증 설정으로 인해 다른 문제가 발생하는 경우도 있습니다.
웹 브라우저는 이러한 상황을 관리하기 위해 사용자에게 “클릭하여 통과” 경고를 표시하며, 이를 통해 사용자는 서버의 인증서를 브라우저 인증서 저장소에 추가할 수 있습니다. curl 및 wget과 같은 네트워크 클라이언트 도구는 인증서 검사를 완전히 끄는 옵션을 제공합니다(각각 curl --insecure 및 wget --no-check-certificate를 사용합니다).
기술 스택의 다른 계층에서, SELinux 및 AppArmor와 같은 Linux 보안 모듈은 배포판 공급업체가 기본적으로 활성화하지만, 이를 끄는 비교적 간단한 방법을 제공합니다.
현재로서는 전체 프로세스에 대해 Python의 기본 인증서 검사를 비활성화할 수 있는 이처럼 편리한 방법이 없습니다.
PEP 476은 기존 동작을 복원하도록 ssl 모듈을 몽키 패치하여 프로세스 전체에서 이전 설정으로 되돌리는 방법을 다룸으로써 이 문제를 해결하려고 시도했습니다. 안타깝게도 시스템 관리자가 표준 운영 환경 정의에서 이 기능을 기본적으로 비활성화할 수 있도록 제안된 sitecustomize.py 기반 기법은 적어도 일부 경우에 충분하지 않은 것으로 판명되었습니다. 이 PEP가 처음 작성되게 된 구체적인 사례는 Linux 배포판 제작자가 업스트림 CPython 2.7 릴리스를 직접 사용하여 제공되는 표준 방식보다 사용자에게 더 원활한 마이그레이션 경로를 제공하려는 경우입니다. 그러나 임베디드 Python 런타임과 기타 사용자 수준의 Python 설치를 업데이트할 때 발생할 수 있는 다른 문제도 지적되었습니다.
상호 호환되지 않는 수많은 마이그레이션 기법이 난립하도록 두는 대신, 이 PEP에서는 HTTPS 클라이언트 모듈에서 인증서 검증을 건너뛰던 과거의 동작으로 프로세스를 더 쉽게 되돌릴 수 있도록 Python 2.7.12에 추가 기능을 도입할 것을 제안합니다. 또한 Python 2.7.9 이전 버전에 이러한 기능을 백포트하는 재배포자에게 추가 권고 사항을 제공합니다.
대안
명확한 업스트림 지침과 권고가 없는 상황에서는 상업적 재배포자가 고객의 이익을 위해 자체적으로 설계 결정을 내리게 됩니다. 이용 가능한 주요 접근 방식은 다음과 같습니다.
- 새로운 Python 2.7.x 릴리스를 기준으로 계속 리베이스하면서, 표준 라이브러리 HTTPS 클라이언트에서 검증되지 않은 호스트 이름을 검증되는 호스트 이름으로 마이그레이션할 때 PEP 476에 정의된 방법 외에 추가 지원을 제공하지 않습니다.
- Python 2에서 Python 3으로 업그레이드할 때 HTTPS 연결의 기본 처리 방식 변경 사항을 이용할 수 있도록 제한합니다.
- Linux 배포판 공급업체의 경우, 새로운 운영 체제 버전으로 업그레이드할 때 HTTPS 연결의 기본 처리 방식 변경 사항을 이용할 수 있도록 제한합니다.
- PEP의 공식적인 상태와 관계없이 이 PEP에 설명된 백포트 제안 중 하나 또는 둘 다를 구현합니다.
범위의 제한
이러한 변경은 Python 2.7의 맥락에서 새로운 기본 인증서 처리 동작으로의 전환을 관리하는 데 도움을 주기 위한 도구로만 제안됩니다. 애플리케이션 자체를 업데이트할 수 없어 이 문제의 영향을 받는 클라이언트 애플리케이션의 대부분은 Python 2 애플리케이션일 것으로 예상되므로, 이러한 변경은 Python 3의 새로운 기능으로 제안되는 것이 아닙니다.
향후 Python 3 버전에서 보안 프로토콜의 기본 인증서 처리를 프로토콜별로 구성할 수 있도록 하는 것이 바람직할 가능성이 높지만, 이 문제는 이 PEP의 범위를 벗어납니다.
기능 감지를 위한 요구 사항
이 PEP의 제안은 이전 Python 버전으로의 백포트를 용이하게 하는 것을 목표로 하므로, Python 버전 번호를 이를 감지하는 신뢰할 수 있는 수단으로 사용할 수 없습니다. 대신 다음 기법을 사용하여 해당 기능의 존재 여부를 확인할 수 있도록 설계되었습니다.:
python -c "import ssl; ssl.<_relevant_attribute>"
관련 기능을 사용할 수 없는 경우 AttributeError와 함께(따라서 0이 아닌 반환 코드로) 실패합니다.
이 PEP에서 정의하는 기능 탐지 속성은 다음과 같습니다:
ssl._https_verify_certificates: 런타임 구성 APIssl._https_verify_envvar: 환경 기반 구성ssl._cert_verification_config: 파일 기반 구성 (PEP 476 선택적 활성화)
마커 속성 앞에 밑줄을 붙이는 것은 이러한 기능의 구현 종속적이고 보안에 민감한 특성을 나타내기 위한 것입니다.
기능: 구성 API
이 변경 사항은 CPython 2.7.12 및 이후 CPython 2.7.x 릴리스에 포함할 것을 제안합니다. 여기에는 표준 라이브러리 클라이언트 라이브러리에서 HTTPS 인증서를 기본적으로 처리하는 방법을 지정하기 위한 새로운 ssl._https_verify_certificates()가 포함됩니다.
이 변경 사항을 Python 3으로 포워드 포트하는 것은 제안하지 않으므로, 인증서 검증 건너뛰기를 지원해야 하는 Python 3 애플리케이션은 여전히 자체적으로 적합한 보안 컨텍스트를 정의해야 합니다.
기능 탐지
이 기능과 관련하여 ssl 모듈에 있는 마커 속성은 ssl._https_verify_certificates 함수 자체입니다.
사양
ssl._https_verify_certificates 함수는 다음과 같이 작동합니다.:
def _https_verify_certificates(enable=True):
"""Verify server HTTPS certificates by default?"""
global _create_default_https_context
if enable:
_create_default_https_context = create_default_context
else:
_create_default_https_context = _create_unverified_context
인자 없이 호출되거나 enable이 참 값으로 설정되어 호출되면 표준 라이브러리 클라이언트 모듈은 이후 HTTPS 인증서를 기본적으로 검증하고, 그렇지 않으면 검증을 건너뜁니다.
enable이 거짓 값으로 설정되어 호출되면 표준 라이브러리 클라이언트 모듈은 이후 HTTPS 인증서 검증을 기본적으로 건너뜁니다.
보안 고려 사항
이 기능을 포함하면 보안에 민감한 애플리케이션이 다음의 하위 호환 가능한 코드 조각을 코드에 포함할 수 있습니다.:
if hasattr(ssl, "_https_verify_certificates"):
ssl._https_verify_certificates()
일부 개발자는 ssl._https_verify_certificates(enable=False)를 사용하여 인증서 검사를 선택적으로 해제할 수도 있습니다. 영향을 받는 내부 API를 몽키 패치하는 것이 이미 가능했으므로, 이는 중대한 새로운 보안 문제를 일으키지 않습니다.
기능: 환경 기반 구성
이 변경 사항은 CPython 2.7.12 및 이후 CPython 2.7.x 릴리스에 포함할 것을 제안합니다. 여기에는 애플리케이션 소스 코드를 수정하지 않고 기본 검증을 비활성화하도록 '0'으로 설정할 수 있는 새로운 PYTHONHTTPSVERIFY 환경 변수가 포함됩니다(바이트코드만 포함된 애플리케이션 배포의 경우처럼 애플리케이션 소스 코드를 아예 사용할 수 없을 수도 있습니다).
이 변경 사항을 Python 3으로 포워드 포트하는 것은 제안하지 않으므로, 인증서 검증 건너뛰기를 지원해야 하는 Python 3 애플리케이션은 여전히 자체적으로 적합한 보안 컨텍스트를 정의해야 합니다.
기능 탐지
이 기능과 관련하여 ssl 모듈에 있는 마커 속성은 다음과 같습니다.
- 기본 동작에 영향을 주는 환경 변수의 이름을 제공하는
ssl._https_verify_envvar속성입니다.
이는 기능의 존재 여부를 간단히 탐지할 수 있게 할 뿐만 아니라, 관련 환경 변수 이름을 프로그래밍 방식으로 확인할 수도 있게 합니다.
사양
항상 ssl.create_default_context 사용을 기본값으로 삼는 대신, ssl 모듈은 다음과 같이 수정됩니다.
- Python 프로세스에 모듈이 처음 임포트될 때
PYTHONHTTPSVERIFY환경 변수를 읽습니다. - 이 환경 변수가 존재하고
'0'으로 설정되어 있으면ssl._create_default_https_context함수를ssl._create_unverified_context의 별칭으로 설정합니다. - 그렇지 않으면 평소처럼
ssl._create_default_https_context함수를ssl.create_default_context의 별칭으로 설정합니다.
예제 구현
_https_verify_envvar = 'PYTHONHTTPSVERIFY'
def _get_https_context_factory():
if not sys.flags.ignore_environment:
config_setting = os.environ.get(_https_verify_envvar)
if config_setting == '0':
return _create_unverified_context
return create_default_context
_create_default_https_context = _get_https_context_factory()
보안 고려 사항
Python 3.4.3 이상 및 Python 2.7.9->2.7.11의 동작과 비교하면, 이 접근 방식은 기본 보안 설정에 대한 새로운 다운그레이드 공격을 도입하며, 충분히 집요한 공격자가 Python을 CPython 2.7.8 및 이전 릴리스에서 사용된 기본 동작으로 되돌릴 가능성이 있습니다.
사용 가능한 공격 표면이 이렇게 약간 증가하는 것이 다음과 같은 핵심 이유입니다:
- 보안에 민감한 애플리케이션은 여전히 자체 SSL 컨텍스트를 정의해야 합니다.
- 이 PEP에서 설명하는 마이그레이션 기능을 Python 3에 추가하지 않습니다.
그러나 이러한 공격을 수행하려면 Python 프로세스의 실행 환경을 ssl 모듈을 가져오기 전에 수정할 수 있는 능력이 필요하다는 점도 염두에 둘 필요가 있습니다. /tmp와 같이 파일 시스템의 어느 부분에든 쓸 수 있는 능력과 결합하면, 그러한 액세스 권한을 가진 공격자는 이미 기본 OpenSSL 구현, 동적 라이브러리 로더 및 기타 보안에 민감할 수 있는 구성 요소의 동작을 수정할 수 있습니다.
Python 가상 환경과의 상호 작용
기본 설정은 프로세스 환경에서 직접 읽으므로, 인터프리터가 활성화된 Python 가상 환경 내부에서 실행되는지 여부와 관계없이 동일하게 작동합니다.
참조 구현
위의 두 기능을 구현하는 Python 2.7용 패치가 관련 트래커 이슈에 첨부되어 있습니다.
이 PEP를 이전 Python 버전으로 백포팅하기
이 PEP가 승인되면 상용 Python 재배포자는 이 PEP에서 정의한 프로세스별 구성 메커니즘을 Python 2.7.9보다 오래된 기본 버전으로 백포팅할 수 있으며, 전체 Python 설치의 기본 동작에 대한 PEP 476의 변경 사항은 함께 백포팅하지 않을 수 있습니다.
이러한 백포트는 PYTHONHTTPSVERIFY가 전혀 설정되지 않았을 때의 기본 동작에서만 이 PEP에서 제안한 메커니즘과 달라지며, 인증서 검증을 건너뛰는 것이 계속 기본값이 됩니다.
이 경우 PYTHONHTTPSVERIFY 환경 변수가 정의되어 있고, '0' 이외의 다른 값으로 설정되어 있으면 HTTPS 인증서 검사를 활성화해야 합니다.
기능 감지
이 상황이 적용됨을 나타내는 특정 특성은 없습니다. 대신 Python 2.7.12보다 명목상 오래된 Python 버전에 ssl._https_verify_certificates 및 ssl._https_verify_envvar 특성이 존재하는 것으로 이를 나타냅니다.
사양
이 백포트를 구현하려면 PEP 466, 476 및 이 PEP의 변경 사항을 백포팅하고, ssl 모듈에서 PYTHONHTTPSVERIFY 환경 변수를 처리하는 방식을 다음과 같이 변경해야 합니다:
- Python 프로세스에 모듈을 처음 가져올 때
PYTHONHTTPSVERIFY환경 변수를 읽으십시오. - 이 환경 변수가 존재하고
'0'이외의 값으로 설정되어 있으면ssl._create_default_https_context함수를ssl.create_default_context의 별칭으로 설정하십시오. - 그렇지 않으면
ssl._create_default_https_context함수를ssl._create_unverified_context의 별칭으로 설정하십시오.
예제 구현
_https_verify_envvar = 'PYTHONHTTPSVERIFY'
def _get_https_context_factory():
if not sys.flags.ignore_environment:
config_setting = os.environ.get(_https_verify_envvar)
if config_setting != '0':
return create_default_context
return _create_unverified_context
_create_default_https_context = _get_https_context_factory()
def _disable_https_default_verification():
"""Skip verification of HTTPS certificates by default"""
global _create_default_https_context
_create_default_https_context = _create_unverified_context
보안 고려 사항
이 변경은 표준 라이브러리 HTTPS 클라이언트에서 현재 인증서 검증을 건너뛰는 것이 기본값인 모든 Python 버전에 대해 엄격한 보안 향상이 됩니다. 고려해야 할 기술적 절충점은 보안과 관련된 사항보다는 주로 추가로 필요한 PEP 466 백포트의 규모와 관련됩니다.
Python 가상 환경과의 상호 작용
기본 설정은 프로세스 환경에서 직접 읽으므로, 인터프리터가 활성화된 Python 가상 환경 내부에서 실행되는지 여부와 관계없이 동일하게 작동합니다.
PEP 476을 이전 Python 버전으로 백포팅하기
위에서 설명한 백포팅 접근 방식은 Python 2.7 설치의 기본 HTTPS 인증서 검증 동작을 수정하지 않습니다. 인증서 검증은 여전히 연결별 또는 프로세스별로 선택하여 활성화해야 합니다.
하위 호환성을 깨뜨리지 않고 전체 설치의 기본 동작을 수정할 수 있도록 Red Hat은 Red Hat Enterprise Linux 7.2 이상에서 시스템 Python 2.7 설치를 위한 다음 구성 메커니즘을 설계했습니다:
- HTTPS 인증서 검증을 활성화할지 여부를 결정하는 일을 해당 기능이 처음 백포트된 운영 체제 버전으로 업그레이드할지 여부를 결정하는 일과 독립적으로 수행할 수 있도록 하는 옵트인 모델입니다
- 시스템 관리자가 시스템 Python 설치에서 직접 실행되는 Python 애플리케이션과 스크립트의 기본 동작을 설정할 수 있는 기능입니다
- 기본적으로 HTTPS 인증서 검증을 건너뛰도록 명시적으로 구성된 기존 설치에 영향을 주지 않고, 재배포자가 향후 어느 시점에 새로운 설치의 기본 동작을 변경하는 것을 고려할 수 있는 기능입니다
이 변경 사항은 Python 2.7의 이전 릴리스로 백포트하는 경우에만 영향을 주므로 업스트림 CPython에 포함하도록 제안된 것이 아니라, 사용자에게 유사한 기능을 제공하기로 선택한 다른 재배포자에게 권장 사항으로 제공됩니다.
이 PEP는 이 특정 변경 사항이 좋은 생각인지 여부에 대해 입장을 취하지 않습니다. 대신 재배포자가 Python 2.7.9보다 오래된 Python 버전에서 기본 동작을 구성 가능하게 하는 경로를 if 선택한다면, 재배포자 전반에서 일관된 접근 방식을 유지하는 것이 사용자에게 유익하다고 제안합니다.
그러나 대부분의 Python 사용자는 Python 2.7.9 이상을 제공한다고 홍보하는 모든 환경이 기본적으로 HTTPS 인증서를 검증할 것이라고 합리적으로 기대하므로, 이러한 접근 방식은 그러한 Python 설치에서 사용해서는 안 됩니다.
기능 감지
이 기능과 관련된 ssl 모듈의 표시 속성은 다음과 같습니다:
_cert_verification_config = '<path to configuration file>'
이렇게 하면 기능의 존재 여부를 간단히 감지할 수 있을 뿐만 아니라, 관련 구성 파일 이름을 프로그래밍 방식으로 확인할 수도 있습니다.
Python 표준 라이브러리에 권장되는 수정 사항
이전 포인트 릴리스로 PEP 476 변경 사항을 백포트하는 권장 방법은 Python 2.7.9+에서 구현된 기본 PEP 476 동작을 기준으로 다음 변경 사항을 구현하는 것입니다:
- Python 프로세스에 모듈을 처음 가져올 때 시스템 전역 구성 파일을 읽도록
ssl모듈을 수정하십시오 - 이 구성 파일이 없을 때 사용할 플랫폼 기본 동작(HTTPS 인증서를 검증하거나 검증하지 않음)을 정의하십시오
- 다음 세 가지 작동 모드 중 선택을 지원하십시오:
- HTTPS 인증서 검증이 활성화되도록 하십시오
- HTTPS 인증서 검증이 비활성화되도록 하십시오
- 이 Python 버전을 제공하는 재배포자에게 결정을 위임하십시오
- 주어진 구성 설정에 따라
ssl._create_default_https_context함수를ssl.create_default_context또는ssl._create_unverified_context의 별칭으로 설정하십시오.
권장 파일 위치
PEP 작성자는 Windows, Mac OS X 또는 *BSD 시스템을 대상으로 장기 지원 릴리스를 제공하는 공급자를 알지 못하므로, 현재 이 접근 방식은 Linux 시스템 Python 설치에 대해서만 구체적으로 정의됩니다.
Linux 시스템에서 권장되는 구성 파일 이름은 /etc/python/cert-verification.cfg입니다.
.cfg파일 이름 확장자는 Python 3 표준 라이브러리의 venv 모듈에서 사용하는 pyvenv.cfg와의 일관성을 위해 권장됩니다.
권장 파일 형식
구성 파일은 [https]라는 이름의 단일 섹션에 필수 설정 verify를 포함하는 ConfigParser ini 스타일 형식을 사용해야 합니다.
제안된 섹션 이름은 영향을 받는 클라이언트 API에 전달되는 “https” URL 스키마에서 가져온 것입니다.
verify에 허용되는 값은 다음과 같습니다:
enable: 기본적으로 HTTPS 인증서 검증이 활성화되도록 합니다disable: 기본적으로 HTTPS 인증서 검증이 비활성화되도록 합니다platform_default: 이 특정 Python 버전을 제공하는 재배포자에게 결정을 위임합니다
[https]섹션이나 verify설정이 없거나 verify설정이 알 수 없는 값으로 설정된 경우, 구성 파일이 없는 것으로 처리해야 합니다.
구현 예시
_cert_verification_config = '/etc/python/cert-verification.cfg'
def _get_https_context_factory():
# Check for a system-wide override of the default behaviour
context_factories = {
'enable': create_default_context,
'disable': _create_unverified_context,
'platform_default': _create_unverified_context, # For now :)
}
import ConfigParser
config = ConfigParser.RawConfigParser()
config.read(_cert_verification_config)
try:
verify_mode = config.get('https', 'verify')
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
verify_mode = 'platform_default'
default_factory = context_factories.get('platform_default')
return context_factories.get(verify_mode, default_factory)
_create_default_https_context = _get_https_context_factory()
보안 고려 사항
이 백포팅 사례를 위한 구체적인 권장 사항은 권한이 있고 보안에 민감한 프로세스에서 작동하도록 설계되었으며, 다음과 같이 잠긴 구성으로 실행되는 경우에도 작동합니다:
- 일반 사용자 디렉터리가 아니라 관리자가 통제하는 잠긴 디렉터리에서 실행합니다(
sys.path[0]기반 권한 상승 공격을 방지합니다) -E스위치를 사용하여 실행합니다(PYTHON*환경 변수 기반 권한 상승 공격을 방지합니다)-s스위치를 사용하여 실행합니다(사용자 사이트 디렉터리 기반 권한 상승 공격을 방지합니다)-S스위치를 사용하여 실행합니다(sitecustomize기반 권한 상승 공격을 방지합니다)
이 접근 방식을 사용할 때 HTTPS 검증이 설치 전반에서 비활성화되는 유일한 이유는 다음과 같아야 합니다:
- 최종 사용자가 업스트림 CPython을 직접 실행하는 대신 재배포자가 제공한 CPython 버전을 실행하고 있기 때문입니다
- 해당 재배포자가 업스트림 프로젝트에서 제공하는 방식보다 기본적으로 HTTPS 인증서를 검증하는 방식으로 더 원활하게 전환할 수 있는 경로를 제공하기로 결정했기 때문입니다
- 재배포자 또는 로컬 인프라 관리자가 2.7.9 이전의 기본 동작을 유지하는 것이 적절하다고 판단했기 때문입니다(적어도 당분간은 그렇습니다)
환경 변수 대신 관리자가 제어하는 구성 파일을 사용하면 -E 스위치로 실행되는 애플리케이션에서도 더 원활한 전환 경로를 제공할 수 있다는 핵심적인 장점이 있습니다.
Python 가상 환경과의 상호 작용
이 설정은 인터프리터 설치 범위로 한정되며, 해당 인터프리터를 사용하는 모든 Python 프로세스에 영향을 줍니다. 인터프리터가 활성화된 Python 가상 환경 내부에서 실행되는지 여부와 관계없이 적용됩니다.
이 권장 사항의 기원
이 권장 사항은 Red Hat Enterprise Linux 7.2에 채택된 백포팅 접근 방식을 기반으로 하며, 이는 이 PEP의 2015년 7월 초안 원본에 게재되었고 이 KnowledgeBase 문서에 자세히 설명되어 있습니다. Python 2.7.5에 이 백포트를 구현한 Red Hat의 패치는 CentOS git 저장소에서 찾을 수 있습니다.
결합된 기능 백포트에 대한 권장 사항
재배포자가 이 PEP의 환경 변수 기반 설정을 구성 파일 기반 PEP 476 백포트도 구현한 수정된 Python 버전으로 백포트하기로 선택한 경우, 환경 변수가 시스템 전역 설정보다 우선해야 합니다. 이를 통해 설치 전역 기본 동작과 무관하게 특정 사용자나 애플리케이션에 대해 설정을 변경할 수 있습니다.
구현 예시
_https_verify_envvar = 'PYTHONHTTPSVERIFY'
_cert_verification_config = '/etc/python/cert-verification.cfg'
def _get_https_context_factory():
# Check for an environmental override of the default behaviour
if not sys.flags.ignore_environment:
config_setting = os.environ.get(_https_verify_envvar)
if config_setting is not None:
if config_setting == '0':
return _create_unverified_context
return create_default_context
# Check for a system-wide override of the default behaviour
context_factories = {
'enable': create_default_context,
'disable': _create_unverified_context,
'platform_default': _create_unverified_context, # For now :)
}
import ConfigParser
config = ConfigParser.RawConfigParser()
config.read(_cert_verification_config)
try:
verify_mode = config.get('https', 'verify')
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
verify_mode = 'platform_default'
default_factory = context_factories.get('platform_default')
return context_factories.get(verify_mode, default_factory)
_create_default_https_context = _get_https_context_factory()
Copyright
This document has been placed into the public domain.