PEP 644 – OpenSSL 1.1.1 이상을 요구합니다
- Author:
- Christian Heimes <christian at python.org>
- Discussions-To:
- Discourse thread
- Status:
- Final
- Type:
- Standards Track
- Created:
- 27-Oct-2020
- Python-Version:
- 3.10
- Post-History:
- 27-Oct-2020, 03-Mar-2021, 17-Mar-2021, 17-Apr-2021
- Resolution:
- Python-Dev message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 CPython의 표준 라이브러리가 OpenSSL 1.1.1 LTS 이상만 지원하도록 제안합니다. 수명이 종료된 OpenSSL 버전, 호환되지 않는 포크 및 기타 TLS 라이브러리에 대한 지원을 중단합니다.
동기
Python은 hashlib, hmac 및 ssl 모듈에서 OpenSSL을 사용합니다. OpenSSL은 암호화 기본 요소의 빠른 구현과 X.509 인증서 처리를 포함하는 완전한 TLS 스택을 제공합니다. ssl 모듈은 urllib와 같은 표준 라이브러리 모듈 및 urllib3와 같은 서드파티 모듈에서 인터넷 프로토콜의 보안 변형을 구현하는 데 사용됩니다. pip는 PyPI에서 패키지를 안전하게 다운로드하기 위해 ssl 모듈을 사용합니다. ssl 모듈의 OpenSSL 바인딩에 있는 버그는 심각한 보안 문제로 이어질 수 있습니다.
시간이 지나면서 OpenSSL의 공개 API는 발전하고 변경되었습니다. 버전 1.0.2에서는 호스트 이름을 검증하고 일치시키기 위한 새로운 API가 도입되었습니다. OpenSSL 1.1.0에서는 내부 구조체를 불투명하게 만들고 구조체 멤버에 직접 접근하는 방식을 대체하는 새로운 API가 도입되었습니다. 버전 3.0.0에서는 암호화 알고리즘을 코어에서 프로바이더로 이동하는 내부 재구성으로 인해 더 많은 API가 사용 중단될 예정입니다. LibreSSL 및 BoringSSL과 같은 포크는 서로 다른 방향으로 분기되었습니다.
현재 Python 버전 3.6부터 3.9까지는 OpenSSL 1.0.2, 1.1.0 및 1.1.1과 호환됩니다. 대부분의 경우 Python은 일부 기능이 누락되고 테스트가 손상된 상태로 LibreSSL >= 2.7.1에서도 작동합니다.
제한된 리소스와 시간으로 인해 여러 버전과 포크를 지원하고 정확성을 테스트 및 검증하는 일이 점점 더 어려워지고 있습니다. 서로 호환되지 않는 여러 API 외에도 빌드 시 플래그, 배포판별 패치 및 로컬 암호화 정책 설정이 조합의 수를 더욱 늘립니다. 반면 Python 핵심 팀에는 TLS 및 OpenSSL 내부 구조에 익숙한 분야 전문가가 몇 명뿐이며, 실제 유지 관리자로 활동하는 사람은 그보다도 적습니다.
OpenSSL 1.1.1을 요구하면 대다수 사용자에게 더 나은 경험을 제공하고 유지 관리 부담을 줄여 새로운 기능을 구현할 리소스를 확보할 수 있습니다. 사용자는 새로운 기능의 존재와 일관된 동작을 신뢰할 수 있게 되며, 궁극적으로 더욱 견고한 경험을 얻을 수 있습니다.
영향
OpenSSL 1.1.1은 거의 모든 지원 플랫폼과 배포판에서 OpenSSL의 기본 변형이자 버전입니다. 또한 업스트림에서 여전히 보안 지원을 받는 유일한 버전입니다 [9]에서.
macOS 및 Windows 사용자는 지원 중단의 영향을 받지 않습니다. python.org 설치 관리자와 Conda와 같은 대체 배포판은 최신 OpenSSL 버전을 함께 제공합니다.
2020년 10월 현재, 그리고 DistroWatch [1]에 따르면 대부분의 최신 BSD 및 Linux 배포판도 OpenSSL 1.1.1을 함께 제공합니다. 일부 장기 지원(LTS) 및 엔터프라이즈 배포판의 이전 릴리스에는 더 오래된 OpenSSL 또는 LibreSSL 버전이 포함되어 있습니다. Python 3.10이 정식으로 제공될 때쯤에는 이러한 배포판 중 여러 개가 수명 종료, 일반 지원 종료에 도달했거나 LibreSSL에서 OpenSSL로 전환했을 것입니다.
다른 소프트웨어도 OpenSSL 1.0.2에 대한 지원을 중단했습니다. 예를 들어 PyCA cryptography 3.2(2020-10-25)는 OpenSSL 1.0.2와의 호환성을 제거했습니다.
OpenSSL 1.0.2 LTS
출시: 2015-02 수명 종료: 2019-12
OpenSSL 1.0.2는 호스트 이름 확인, ALPN 지원 및 타원 곡선을 추가했습니다.
- CentOS 7 (EOL 2024-06)
- Debian 8 Jessie (EOL 2020-07)
- Linux Mint 18.3 (EOL 2021-04)
- RHEL 7 (전체 지원 종료 2019-08, 유지 관리 2 지원 종료 2024-06)
- SUSE Enterprise Linux 12-SP5 (일반 지원 종료 2024-10)
- Ubuntu 16.04 LTS / Xenial (일반 지원 종료 2021-04)
OpenSSL 1.1.0
출시: 2016-08 수명 종료: 2019-09
OpenSSL 1.1.0은 기본적으로 안전하지 않은 암호를 제거하거나 비활성화했으며 ChaCha20-Poly1305, BLAKE2(기본 기능), X25519 및 CT 지원을 추가했습니다. 구조체 대부분을 불투명하게 만들었으며 새로운 API를 도입했습니다. OpenSSL 1.1.0은 1.0.2와 API 호환성이 없습니다.
- Debian 9 Stretch (보안 지원 종료 2020-07, LTS 2022-06까지)
- Ubuntu 18.04 LTS / Bionic (일반 지원 종료 2023-04)
OpenSSL 1.1.1 LTS
출시: 2018-08 수명 종료: 2023-09 (예정)
OpenSSL 1.1.1은 TLS 1.3, SHA-3, X448 및 Ed448을 추가했습니다.
- Alpine (2018년에 OpenSSL로 다시 전환했습니다 [4])
- Arch Linux current
- CentOS 8.0+
- Debian 10 Buster
- Debian 11 Bullseye (출시 예정일 2021-06)
- Fedora 29+
- FreeBSD 11.3+
- Gentoo Linux stable (2021년 1월에 대안으로 제공하던 LibreSSL을 중단했습니다 [10])
- HardenedBSD (2018년에 OpenSSL로 다시 전환했습니다 [3])
- Linux Mint 19.3+
- macOS (python.org 설치 프로그램)
- NetBSD 8.2+
- openSUSE 15.2+
- RHEL 8.0+
- Slackware current
- SUSE Enterprise Linux 15-SP2
- Ubuntu 18.10+
- Ubuntu 20.04 LTS / Focal
- VoidLinux (2021년 3월 OpenSSL로 다시 전환했습니다 [5])
- Windows (python.org 설치 프로그램, Conda)
주요 CI 제공업체는 OpenSSL 1.1.1이 포함된 이미지를 제공합니다.
- AppVeyor (
Ubuntu2004이미지 사용) - CircleCI (최신
cimg/base:stable또는cimg/base:stable-20.04사용) - GitHub Actions (
runs-on: ubuntu-20.04사용) - Giblab CI (Debian Stretch, Ubuntu Focal, CentOS 8, RHEL 8 또는 Fedora 러너 사용)
- Packit
- TravisCI (
dist: focal사용) - Zuul
OpenSSL 3.0.0
릴리스: 해당 없음 (2021년 중후반 예정)
OpenSSL 3.0.0은 현재 개발 중입니다. 주요 변경 사항에는 Apache License 2.0으로의 재라이선스와 암호화 알고리즘 제공자를 위한 새 API가 포함됩니다. 대부분의 변경 사항은 내부 리팩터링이며 공개 API에 영향을 주지 않습니다. [8]
LibreSSL
생성: 2014-04 (OpenSSL 1.0.1g에서 분기됨)
- DragonFly BSD
- Hyperbola GNU/Linux-libre
- OpenBSD
- OpenELEC (개발 중단)
- TrueOS (개발 중단)
FreeBSD 및 OPNsense와 같은 일부 배포판은 OpenSSL 대신 비표준 TLS 라이브러리로 LibreSSL도 제공합니다. Gentoo는 호환성 문제와 부족한 테스트로 인해 2021년 1월에 OpenSSL의 대안으로서 LibreSSL의 지원을 중단했습니다 [10].
OpenBSD ports에는 security/openssl/1.1 포트가 있으며, “[…] is present to provide support for applications which cannot be made compatible with LibReSSL”이라고 문서화되어 있습니다 [7]. OpenBSD는 이 패키지를 사용하여 작동하는 ssl 모듈을 제공할 수 있습니다.
BoringSSL
생성: 2014-06
BoringSSL은 Google이 OpenSSL을 포크하여 만든 버전입니다. 일반적인 용도로 사용할 것을 목적으로 하지 않으므로 Python에서 지원하지 않습니다. API 또는 ABI의 안정성을 보장하지 않습니다. BoringSSL의 벤더링된 사본은 Chrome/Chromium 브라우저, Android 및 Apple 플랫폼에서 사용됩니다 [6].
이점
TLS 1.3
OpenSSL 1.1.1에서 새로운 TLS 1.3 버전에 대한 지원이 도입되었습니다. 최신 TLS 프로토콜 버전은 이전 버전보다 핸드셰이크가 빠르고 더 안전합니다.
스레드 및 포크 안전성
릴리스 1.1.0c부터 OpenSSL은 포크와 스레드에 대해 완전히 안전합니다. 바인딩은 더 이상 멀티스레딩을 지원하기 위한 우회책이나 추가 콜백이 필요하지 않습니다.
SHA-3
1.1.0부터 OpenSSL은 SHA-3 및 SHAKE 구현을 함께 제공합니다. Python의 내장 SHA-3 지원은 참조 구현을 기반으로 합니다. 내부 _sha3 코드는 상당히 크며, 그 결과 생성되는 공유 라이브러리의 크기는 0.5MB에 가깝습니다. Python은 내장 구현을 제거하고 대신 OpenSSL의 libcrypto에 의존할 수 있습니다.
지금까지 LibreSSL 업스트림 개발에서는 SHA-3 지원 추가를 거부했습니다. [2]
호환성
OpenSSL의 다운스트림 패치 및 옵션
OpenSSL은 OPENSSL_NO_* 매크로 형태로 70개가 넘는 구성 및 빌드 시 옵션을 제공합니다. 약 60개의 옵션이 암호화 알고리즘 및 TLS 버전과 같은 기능의 존재 여부에 영향을 줍니다. 일부 배포판은 설정을 변경하기 위해 패치를 적용합니다. 또한 보안 수준, 암호, TLS 버전 범위 및 서명 알고리즘과 같은 설정의 기본값은 OpenSSL 구성 파일에서 설정할 수 있습니다.
Python 핵심 팀에는 가능한 모든 조합을 테스트할 리소스가 부족합니다. 이 PEP에서는 Python이 표준 기능이 활성화된 OpenSSL 빌드만 지원할 것을 제안합니다. 벤더는 OPENSSL_NO_TLS1_1_METHOD와 같은 빌드 시 옵션이나 MinProtocol = TLSv1.2와 같은 OpenSSL 구성 옵션을 사용하여 더 이상 사용되지 않거나 안전하지 않은 알고리즘 및 TLS 버전을 비활성화해야 합니다.
Python은 OpenSSL이 다음 항목을 포함하여 빌드되었다고 가정합니다.
- hashlib의 MD5, SHA-1, SHA-2 계열, SHA-3/SHAKE 계열 및 BLAKE2와 같은 기본 알고리즘
- TLS 1.2 및 TLS 1.3 프로토콜
- TLS 1.2 및 1.3에 사용되는 현재의 키 합의, 서명 및 암호화 알고리즘(ECDH, RSA, ECDSA, Curve25519, AES, Poly1309-ChaCha20, …)
- 스레딩, 파일 I/O, 소켓 I/O 및 오류 메시지
취약한 알고리즘(MD5, SHA-1 서명)과 짧은 키(RSA < 2024비트)는 런타임에서 비활성화될 수 있습니다. FIPS와 같은 암호화 정책에 의해 알고리즘이 비활성화된 경우 알고리즘이 차단될 수도 있습니다. 이 PEP는 새로운 기능과 취약점에 대한 대응책을 마련할 여지를 주기 위해 의도적으로 더 구체적으로 규정하지 않습니다. 일반적인 기준으로 Python은 PyPI에 연결할 수 있어야 하며 테스트 모음이 통과해야 합니다.
LibreSSL 지원
LibreSSL은 OpenSSL의 포크입니다. 이 포크는 heartbleed 취약점에 대응하여 2014년에 OpenBSD 팀 구성원들이 OpenSSL 1.0.1g에서 분기하여 만들었습니다. 시작된 이후 문제가 있거나 안전하지 않은 것으로 간주된 여러 기능이 제거되거나 대체되었고(SSL 2.0, SSL 3.0, 개선된 CPRNG), OpenSSL과 BoringSSL에서 백포트되기도 했습니다.
현재 LibreSSL은 OpenSSL 1.1.1과 완전히 API 호환되지는 않습니다. 최신 릴리스인 LibreSSL 3.3.2에는 기능이 누락되어 있으며 일부 경우에는 다르게 동작합니다. 언급할 만한 누락되었거나 호환되지 않는 기능은 다음과 같습니다
- SHA-3, SHAKE, BLAKE2
SSL_CERT_*환경 변수- 보안 수준 API
- 세션 처리 API
- 키 로깅 API
- 검증된 인증서 체인 API
- OPENSSL_VERSION 매크로
이 PEP는 Python에서 LibreSSL 관련 우회책을 모두 제거할 것을 제안했습니다. 앞으로 Python은 configure 및 컴파일 시 검사로 LibreSSL 지원을 적극적으로 금지하지 않을 것입니다. 그러나 Python은 사소하지 않은 우회책을 추가하거나 테스트를 비활성화하는 패치를 수용하지도 않을 것입니다.
BoringSSL
현재 BoringSSL을 지원할 계획은 없습니다.
기각된 아이디어
지원되는 OpenSSL 버전 공식화
이 PEP는 OpenSSL 버전이 지원되는 조건에 관한 공식적인 규칙과 조건을 제시하지 않습니다.
일반적으로 Python은 널리 사용되고 공식적으로 지원되는 OpenSSL 버전과 호환되는 것을 목표로 합니다. Python의 패치 릴리스는 OpenSSL의 새로운 주 릴리스와 호환되지 않을 수 있습니다. 사용자는 Python의 새로운 주 또는 부 릴리스가 수명이 종료된 OpenSSL 버전에서 작동할 것이라고 기대해서는 안 됩니다. Python 핵심 개발팀은 적절하다고 판단하는 경우 새로운 릴리스에 대한 수정 사항을 백포트하거나 EOL 처리된 릴리스와의 호환성을 확장할 수 있습니다.
OpenSSL [9]의 새로운 ABI 안정성 및 LTS 정책도 도움이 될 것입니다.
OpenSSL 1.1.0 지원 유지
OpenSSL 1.1.0 지원을 유지하자는 의견이 Debian 9 (Stretch)와의 호환성을 위해 제시되었습니다. 해당 제안은 코드 정리와 테스트를 복잡하게 만들 수 있으므로 거부되었습니다. Stretch는 이미 정규 보안 지원이 종료되었으며 장기 지원 종료 시점도 가까워지고 있습니다. Python 3.10 최종 릴리스 시점에는 Debian Buster와 Debian Bullseye를 사용할 수 있게 됩니다.
대신 Python 3.10에는 사용자 지정 OpenSSL 빌드의 사용을 간소화하기 위한 추가 문서와 새로운 configure 옵션 --with-openssl-rpath=auto가 추가됩니다 [11].
하위 호환성
Python 3.10은 OpenSSL 1.0.2 또는 LibreSSL을 사용하는 플랫폼에서 TLS/SSL 및 빠른 해싱을 더 이상 지원하지 않습니다. 이 PEP의 첫 번째 초안은 Linux 배포판이나 CI 제공업체와 같은 공급업체가 계획을 수립할 충분한 시간을 갖도록 3.10 릴리스 주기의 시작 시점에 게시되었습니다.
Python의 Keccak Code Package 내부 사본과 내부 _sha3 모듈은 제거됩니다. 이렇게 하면 소스 코드 크기가 약 280kB, 코드 크기가 대략 0.5MB 줄어듭니다. hashlib은 OpenSSL의 SHA-3 구현에만 의존하게 됩니다. OpenSSL 없이는 SHA-3 및 SHAKE를 더 이상 사용할 수 없습니다.
면책 조항 및 특별 감사
이 PEP의 작성자는 OpenSSL 프로젝트의 기여자이며 OpenSSL을 사용하는 주요 Linux 배포판에 고용되어 있습니다.
Alex Gaynor와 Gregory P.에게 감사드립니다. Smith, Nathaniel J. Smith, Paul Kehrer 및 Seth Larson이 초기 초안을 검토하고 피드백을 제공해 주신 데 감사드립니다.
참고 문헌
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.