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 모듈을 몽키패치하여 이전 동작을 복원함으로써 프로세스 전체에서 이전 설정으로 되돌리는 방법을 다루어 이 문제를 해결하려고 시도하기는 했습니다. 안타깝게도 시스템 관리자가 표준 운영 환경(Standard Operating Environment) 정의에서 이 기능을 기본적으로 비활성화할 수 있도록 제안된 sitecustomize.py 기반 기법은 적어도 일부 경우에는 불충분하다고 판명되었습니다. 이 PEP를 처음 작성하게 된 구체적인 사례는 Linux 배포자가 업스트림 CPython 2.7 릴리스를 직접 사용할 때 제공되는 표준 경로보다 더 원활한 마이그레이션 경로를 사용자에게 제공하고자 하는 경우이지만, 임베디드 Python 런타임과 기타 사용자 수준 Python 설치를 업데이트할 때의 다른 잠재적 어려움도 지적되었습니다.
서로 호환되지 않는 수많은 마이그레이션 기법이 난립하도록 두기보다, 이 PEP는 HTTPS 클라이언트 모듈에서 인증서 검증을 건너뛰던 과거 동작으로 프로세스를 더 쉽게 되돌릴 수 있도록 Python 2.7.12에 추가할 기능을 제안합니다. 또한 이 기능들을 Python 2.7.9 이전 버전의 Python에 백포트하는 재배포자를 위한 추가 권고 사항도 제공합니다.
대안
업스트림의 명확한 지침과 권고가 없더라도 상용 재배포자는 여전히 고객의 이익을 위해 자체적인 설계 결정을 내릴 것입니다. 사용 가능한 주요 접근 방식은 다음과 같습니다:
- 새 Python 2.7.x 릴리스로 계속 리베이스하되, 표준 라이브러리 HTTPS 클라이언트에서 호스트 이름을 검사하지 않던 방식에서 검사하는 방식으로 마이그레이션하는 데 PEP 476에 정의된 메커니즘 이외의 추가 지원은 제공하지 않는 방식
- HTTPS 연결의 기본 처리 방식 변경을 Python 2에서 Python 3으로 업그레이드할 때에만 사용할 수 있도록 하는 방식
- 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 릴리스에 포함하는 것으로 제안됩니다. 이 변경 사항은 새로운 ssl._https_verify_certificates()로 이루어지며, 이 함수는 표준 라이브러리 클라이언트 라이브러리에서 HTTPS 인증서를 기본적으로 어떻게 처리할지 지정합니다.
이 변경 사항을 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 릴리스에 포함하는 것으로 제안됩니다. 이 변경 사항은 새로운 PYTHONHTTPSVERIFY 환경 변수로 이루어집니다. 이 변수를 '0'으로 설정하면 애플리케이션 소스 코드를 수정하지 않고도 기본 검증을 끌 수 있습니다(애플리케이션을 바이트코드로만 배포하는 경우에는 소스 코드를 구할 수조차 없을 수도 있습니다)
이 변경 사항을 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에 추가하지 않습니다
그러나 이러한 공격을 수행하려면 ssl 모듈을 임포트하기 전에 Python 프로세스의 실행 환경을 수정할 수 있어야 한다는 점도 염두에 둘 필요가 있습니다. 파일 시스템의 임의 위치(예: /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 인증서 검증을 활성화할지에 대한 결정을, 이 기능이 처음 백포트된 운영 체제 버전으로 업그레이드할지에 대한 결정과 별개로 내릴 수 있게 하는 옵트인(opt-in) 모델
- 시스템 관리자가 시스템 Python 설치에서 직접 실행되는 Python 애플리케이션과 스크립트의 기본 동작을 설정할 수 있는 기능
- 기본적으로 HTTPS 인증서 검증을 건너뛰도록 명시적으로 설정된 기존 설치에 영향을 주지 않으면서, 재배포자가 향후 어느 시점에 새 설치의 기본 동작 변경을 검토할 수 있는 기능
이 변경은 Python 2.7의 이전 릴리스에 대한 백포트에만 영향을 주므로 업스트림 CPython에 포함하도록 제안하지 않습니다. 대신 사용자에게 비슷한 기능을 제공하기로 한 다른 재배포자를 위한 권고 사항으로 제시합니다.
이 PEP는 이 변경 자체가 좋은 생각인지 아닌지에 대해서는 입장을 취하지 않습니다. 다만 재배포자가 Python 2.7.9보다 오래된 Python 버전에서 기본 동작을 설정할 수 있게 하는 방향을 택한다면, 재배포자 간에 일관된 접근 방식을 유지하는 것이 사용자에게 유익하다는 점을 제안합니다.
그러나 Python 2.7.9 이상을 제공한다고 알리는 Python 설치에는 이 접근 방식을 사용해서는 안 됩니다(SHOULD NOT). 대부분의 Python 사용자는 그러한 환경이라면 모두 기본적으로 HTTPS 인증서를 검증할 것이라고 합리적으로 기대하기 때문입니다.
기능 감지
이 기능과 관련된 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입니다.
Python 3 표준 라이브러리의 venv 모듈이 사용하는 pyvenv.cfg와 일관되도록 .cfg 파일 확장자를 권장합니다.
권장 파일 형식
설정 파일은 ConfigParser의 ini 스타일 형식을 사용해야 하며, 필수 설정 verify 하나를 포함하는 [https]라는 이름의 섹션 하나로 구성해야 합니다.
제안된 섹션 이름은 영향을 받는 클라이언트 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스위치를 사용하여 실행합니다(사용자 site 디렉터리 기반 권한 상승 공격 방지).-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.