ssl --- TLS/SSL trình bao bọc cho các đối tượng ổ cắm

Source code: Lib/ssl.py


Mô-đun này cung cấp quyền truy cập vào phương tiện mã hóa và xác thực ngang hàng của Bảo mật lớp vận chuyển (thường được gọi là "Lớp cổng bảo mật") cho các ổ cắm mạng, cả phía máy khách và phía máy chủ. Mô-đun này sử dụng thư viện OpenSSL.

Đây là một optional module. Nếu nó bị thiếu trong bản sao CPython của bạn, hãy tìm tài liệu từ nhà phân phối của bạn (nghĩa là bất kỳ ai đã cung cấp Python cho bạn). Nếu bạn là nhà phân phối, hãy xem Yêu cầu đối với các mô-đun tùy chọn.

Ghi chú

Một số hành vi có thể phụ thuộc vào nền tảng vì lệnh gọi được thực hiện tới API socket của hệ điều hành. Phiên bản OpenSSL đã cài đặt cũng có thể gây ra các thay đổi về hành vi. Ví dụ: TLSv1.3 đi kèm với OpenSSL phiên bản 1.1.1.

Cảnh báo

Không sử dụng mô-đun này mà không đọc Cân nhắc về bảo mật. Làm như vậy có thể dẫn đến cảm giác an toàn sai lầm vì cài đặt mặc định của mô-đun ssl không nhất thiết phải phù hợp với ứng dụng của bạn.

sẵn có: not WASI.

Mô-đun này không hoạt động hoặc không có trên WebAssembly. Xem Nền tảng WebAssugging để biết thêm thông tin.

Phần này ghi lại các đối tượng và chức năng trong mô-đun ssl; Để biết thêm thông tin tổng quát về TLS, SSL và các chứng chỉ, bạn đọc tham khảo tài liệu ở phần “Xem thêm” ở phía dưới.

Mô-đun này cung cấp một lớp, ssl.SSLSocket, bắt nguồn từ loại socket.socket và cung cấp một trình bao bọc giống như ổ cắm cũng mã hóa và giải mã dữ liệu đi qua ổ cắm bằng SSL. Nó hỗ trợ các phương thức bổ sung như getpeercert(), truy xuất chứng chỉ của phía bên kia của kết nối, cipher(), truy xuất mật mã đang được sử dụng cho kết nối an toàn hoặc get_verified_chain(), get_unverified_chain() truy xuất chuỗi chứng chỉ.

Đối với các ứng dụng phức tạp hơn, lớp ssl.SSLContext giúp quản lý cài đặt và chứng chỉ, sau đó có thể được kế thừa bởi các ổ cắm SSL được tạo thông qua phương thức SSLContext.wrap_socket().

Thay đổi trong phiên bản 3.5.3: Đã cập nhật để hỗ trợ liên kết với OpenSSL 1.1.0

Thay đổi trong phiên bản 3.6: OpenSSL 0.9.8, 1.0.0 và 1.0.1 không được dùng nữa và không còn được hỗ trợ. Trong tương lai mô-đun ssl sẽ yêu cầu ít nhất OpenSSL 1.0.2 hoặc 1.1.0.

Thay đổi trong phiên bản 3.10: PEP 644 đã được triển khai. Mô-đun ssl yêu cầu OpenSSL 1.1.1 hoặc mới hơn.

Việc sử dụng các hằng số và hàm không được dùng nữa sẽ dẫn đến cảnh báo không được dùng nữa.

Hàm, hằng và ngoại lệ

Tạo ổ cắm

Các phiên bản của SSLSocket phải được tạo bằng phương thức SSLContext.wrap_socket(). Hàm trợ giúp create_default_context() trả về một bối cảnh mới với các cài đặt mặc định an toàn.

Ví dụ về ổ cắm máy khách với ngữ cảnh mặc định và ngăn xếp kép IPv4/IPv6:

 cắm nhập khẩu
nhập khẩu ssl

tên máy chủ = 'www.python.org'
bối cảnh = ssl.create_default_context()

với socket.create_connection((hostname, 443))  sock:
    với context.wrap_socket(sock, server_hostname=hostname)  ssock:
        in(ssock.version())

Ví dụ về ổ cắm máy khách với ngữ cảnh tùy chỉnh và IPv4

tên máy chủ = 'www.python.org'
# PROTOCOL_TLS_CLIENT yêu cầu chuỗi chứng chỉ và tên máy chủ hợp lệ
bối cảnh = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('path/to/cabundle.pem')

với socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)  sock:
    với context.wrap_socket(sock, server_hostname=hostname)  ssock:
        in(ssock.version())

Ví dụ về ổ cắm máy chủ nghe trên localhost IPv4

bối cảnh = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')

với socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)  sock:
    sock.bind(('127.0.0.1', 8443))
    sock.listen(5)
    với context.wrap_socket(sock, server_side=True)  ssock:
        kết nối, addr = ssock.accept()
        ...

Tạo bối cảnh

Một chức năng tiện lợi giúp tạo các đối tượng SSLContext cho các mục đích chung.

ssl.create_default_context(purpose=Purpose.SERVER_AUTH, *, cafile=None, capath=None, cadata=None)

Trả về một đối tượng SSLContext mới với cài đặt mặc định cho purpose đã cho. Các cài đặt được chọn bởi mô-đun ssl và thường thể hiện mức độ bảo mật cao hơn so với khi gọi trực tiếp hàm tạo SSLContext.

cafile, capath, cadata đại diện cho các chứng chỉ CA tùy chọn đáng tin cậy để xác minh chứng chỉ, như trong SSLContext.load_verify_locations(). Nếu cả ba đều là None, chức năng này có thể chọn tin cậy các chứng chỉ CA mặc định của hệ thống.

Các cài đặt là: PROTOCOL_TLS_CLIENT hoặc PROTOCOL_TLS_SERVER, OP_NO_SSLv2OP_NO_SSLv3 với bộ mật mã mã hóa cao không có RC4 và không có bộ mật mã chưa được xác thực. Chuyển SERVER_AUTH dưới dạng purpose đặt verify_mode thành CERT_REQUIRED và tải chứng chỉ CA (khi có ít nhất một trong số cafile, capath hoặc cadata) hoặc sử dụng SSLContext.load_default_certs() để tải chứng chỉ CA mặc định.

Khi keylog_filename được hỗ trợ và biến môi trường SSLKEYLOGFILE được đặt, create_default_context() sẽ bật ghi nhật ký khóa.

Cài đặt mặc định cho ngữ cảnh này bao gồm VERIFY_X509_PARTIAL_CHAINVERIFY_X509_STRICT. Những điều này làm cho việc triển khai OpenSSL cơ bản hoạt động giống như việc triển khai tuân thủ RFC 5280, đổi lại là có một chút không tương thích với các chứng chỉ X.509 cũ hơn.

Ghi chú

Giao thức, tùy chọn, mật mã và các cài đặt khác có thể thay đổi thành các giá trị hạn chế hơn bất kỳ lúc nào mà không cần ngừng sử dụng trước. Các giá trị thể hiện sự cân bằng hợp lý giữa khả năng tương thích và bảo mật.

Nếu ứng dụng của bạn cần các cài đặt cụ thể, bạn nên tạo SSLContext và tự mình áp dụng các cài đặt đó.

Ghi chú

Nếu bạn nhận thấy rằng khi một số máy khách hoặc máy chủ cũ nhất định cố gắng kết nối với SSLContext được tạo bởi chức năng này thì chúng gặp lỗi cho biết "Bộ giao thức hoặc bộ mật mã không khớp", thì có thể chúng chỉ hỗ trợ SSL3.0 mà chức năng này loại trừ việc sử dụng OP_NO_SSLv3. SSL3.0 được nhiều người coi là completely broken. Nếu bạn vẫn muốn tiếp tục sử dụng chức năng này nhưng vẫn cho phép kết nối SSL 3.0, bạn có thể kích hoạt lại chúng bằng cách sử dụng:

ctx = ssl.create_default_context(Purpose.CLIENT_AUTH)
ctx.options &= ~ssl.OP_NO_SSLv3

Ghi chú

Ngữ cảnh này bật VERIFY_X509_STRICT theo mặc định, có thể từ chối các chứng chỉ trước RFC 5280 hoặc không đúng định dạng mà việc triển khai OpenSSL cơ bản sẽ chấp nhận. Mặc dù việc tắt tính năng này không được khuyến khích nhưng bạn có thể thực hiện việc này bằng cách sử dụng:

ctx = ssl.create_default_context()
ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT

Added in version 3.4.

Thay đổi trong phiên bản 3.4.4: RC4 đã bị loại bỏ khỏi chuỗi mật mã mặc định.

Thay đổi trong phiên bản 3.6: ChaCha20/Poly1305 đã được thêm vào chuỗi mật mã mặc định.

3DES đã bị loại bỏ khỏi chuỗi mật mã mặc định.

Thay đổi trong phiên bản 3.8: Hỗ trợ ghi khóa vào SSLKEYLOGFILE đã được thêm vào.

Thay đổi trong phiên bản 3.10: Ngữ cảnh hiện sử dụng giao thức PROTOCOL_TLS_CLIENT hoặc PROTOCOL_TLS_SERVER thay vì PROTOCOL_TLS chung.

Thay đổi trong phiên bản 3.13: Ngữ cảnh hiện sử dụng VERIFY_X509_PARTIAL_CHAINVERIFY_X509_STRICT trong cờ xác minh mặc định của nó.

Ngoại lệ

exception ssl.SSLError

Được đưa ra để báo hiệu lỗi từ quá trình triển khai SSL cơ bản (hiện được thư viện OpenSSL cung cấp). Điều này biểu thị một số vấn đề trong lớp xác thực và mã hóa cấp cao hơn được áp dụng trên kết nối mạng cơ bản. Lỗi này là một kiểu con của OSError. Mã lỗi và thông báo của phiên bản SSLError được thư viện OpenSSL cung cấp.

Thay đổi trong phiên bản 3.3: SSLError từng là một kiểu con của socket.error.

library

Một chuỗi gợi nhớ chỉ định mô-đun con OpenSSL đã xảy ra lỗi, chẳng hạn như SSL, PEM hoặc X509. Phạm vi giá trị có thể có tùy thuộc vào phiên bản OpenSSL.

Added in version 3.3.

reason

Một chuỗi ghi nhớ chỉ định lý do xảy ra lỗi này, ví dụ: CERTIFICATE_VERIFY_FAILED. Phạm vi giá trị có thể có tùy thuộc vào phiên bản OpenSSL.

Added in version 3.3.

exception ssl.SSLZeroReturnError

Một lớp con của SSLError được nâng lên khi cố đọc hoặc ghi và kết nối SSL đã bị đóng hoàn toàn. Lưu ý rằng điều này không có nghĩa là phương tiện vận chuyển cơ bản (đọc TCP) đã bị đóng.

Added in version 3.3.

exception ssl.SSLWantReadError

Một lớp con của SSLError được non-blocking SSL socket tạo ra khi cố đọc hoặc ghi dữ liệu, nhưng cần nhận nhiều dữ liệu hơn trên quá trình vận chuyển TCP cơ bản trước khi yêu cầu có thể được thực hiện.

Added in version 3.3.

exception ssl.SSLWantWriteError

Một lớp con của SSLError được non-blocking SSL socket tạo ra khi cố gắng đọc hoặc ghi dữ liệu, nhưng cần phải gửi nhiều dữ liệu hơn trên phương tiện truyền tải TCP cơ bản trước khi yêu cầu có thể được thực hiện.

Added in version 3.3.

exception ssl.SSLSyscallError

Một lớp con của SSLError xuất hiện khi gặp lỗi hệ thống khi cố gắng thực hiện một thao tác trên ổ cắm SSL. Thật không may, không có cách nào dễ dàng để kiểm tra số lỗi ban đầu.

Added in version 3.3.

exception ssl.SSLEOFError

Một lớp con của SSLError được nâng lên khi kết nối SSL bị chấm dứt đột ngột. Nói chung, bạn không nên cố gắng sử dụng lại phương tiện vận chuyển cơ bản khi gặp phải lỗi này.

Added in version 3.3.

exception ssl.SSLCertVerificationError

Một lớp con của SSLError được tạo ra khi xác thực chứng chỉ không thành công.

Added in version 3.7.

verify_code

Một số lỗi biểu thị lỗi xác minh.

verify_message

Một chuỗi lỗi xác minh mà con người có thể đọc được.

exception ssl.CertificateError

Bí danh cho SSLCertVerificationError.

Thay đổi trong phiên bản 3.7: Ngoại lệ hiện là bí danh cho SSLCertVerificationError.

Tạo ngẫu nhiên

ssl.RAND_bytes(num, /)

Trả về byte giả ngẫu nhiên mạnh về mặt mật mã num. Tăng SSLError nếu PRNG chưa được tạo đủ dữ liệu hoặc nếu thao tác không được phương thức RAND hiện tại hỗ trợ. RAND_status() có thể được sử dụng để kiểm tra trạng thái của PRNG và RAND_add() có thể được sử dụng để tạo PRNG.

Đối với hầu hết tất cả các ứng dụng, os.urandom() là thích hợp hơn.

Đọc bài viết Wikipedia, Cryptographically secure pseudorandom number generator (CSPRNG), để biết các yêu cầu của một trình tạo mã hóa mạnh.

Added in version 3.3.

ssl.RAND_status()

Trả về True nếu trình tạo số giả ngẫu nhiên SSL đã được tạo với độ ngẫu nhiên 'đủ' và False nếu ngược lại. Bạn có thể sử dụng ssl.RAND_egd()ssl.RAND_add() để tăng tính ngẫu nhiên của trình tạo số giả ngẫu nhiên.

ssl.RAND_add(bytes, entropy, /)

Trộn bytes đã cho vào trình tạo số giả ngẫu nhiên SSL. Tham số entropy (một float) là giới hạn dưới của entropy có trong chuỗi (vì vậy bạn luôn có thể sử dụng 0.0). Xem RFC 1750 để biết thêm thông tin về nguồn entropy.

Thay đổi trong phiên bản 3.5: bytes-like object có thể ghi hiện đã được chấp nhận.

Xử lý chứng chỉ

ssl.cert_time_to_seconds(cert_time)

Trả về thời gian tính bằng giây kể từ kỷ nguyên, với chuỗi cert_time biểu thị ngày "notBefore" hoặc "notAfter" từ chứng chỉ ở định dạng "%b %d %H:%M:%S %Y %Z" strptime (ngôn ngữ C).

Đây là một ví dụ:

>>> nhập ssl
>>> nhập ngày giờ dưới dạng dt
>>> dấu thời gian = ssl.cert_time_to_seconds("Ngày 5 tháng 1 09:34:43 2018 GMT")
>>> dấu thời gian
1515144883
>>> print(dt.datetime.fromtimestamp(dấu thời gian, dt.UTC))
2018-01-05 09:34:43+00:00

Ngày "notBefore" hoặc "notAfter" phải sử dụng GMT (RFC 5280).

Thay đổi trong phiên bản 3.5: Giải thích thời gian đầu vào dưới dạng thời gian tính bằng UTC như được chỉ định bởi múi giờ 'GMT' trong chuỗi đầu vào. Múi giờ địa phương đã được sử dụng trước đây. Trả về một số nguyên (không có phân số của giây ở định dạng đầu vào)

ssl.get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None[, timeout])

Đưa ra địa chỉ addr của máy chủ được bảo vệ SSL, dưới dạng cặp (hostname, port-number), tìm nạp chứng chỉ của máy chủ và trả về dưới dạng chuỗi được mã hóa PEM. Nếu ssl_version được chỉ định, hãy sử dụng phiên bản giao thức SSL đó để cố gắng kết nối với máy chủ. Nếu ca_certs được chỉ định, thì đó phải là tệp chứa danh sách chứng chỉ gốc, có cùng định dạng như được sử dụng cho tham số cafile trong SSLContext.load_verify_locations(). Cuộc gọi sẽ cố gắng xác thực chứng chỉ máy chủ dựa trên bộ chứng chỉ gốc đó và sẽ thất bại nếu nỗ lực xác thực không thành công. Thời gian chờ có thể được chỉ định bằng tham số timeout.

Thay đổi trong phiên bản 3.3: Chức năng này hiện tương thích với IPv6.

Thay đổi trong phiên bản 3.5: Zz002zz mặc định được thay đổi từ PROTOCOL_SSLv3 thành PROTOCOL_TLS để tương thích tối đa với các máy chủ hiện đại.

Thay đổi trong phiên bản 3.10: Tham số timeout đã được thêm vào.

ssl.DER_cert_to_PEM_cert(der_cert_bytes)

Được cấp chứng chỉ dưới dạng một khối byte được mã hóa DER, sẽ trả về phiên bản chuỗi được mã hóa PEM của cùng một chứng chỉ.

ssl.PEM_cert_to_DER_cert(pem_cert_string)

Được cấp chứng chỉ dưới dạng chuỗi ASCII PEM, trả về chuỗi byte được mã hóa DER cho cùng chứng chỉ đó.

ssl.get_default_verify_paths()

Trả về một bộ dữ liệu được đặt tên có đường dẫn đến cafile và capath mặc định của OpenSSL. Các đường dẫn giống như được sử dụng bởi SSLContext.set_default_verify_paths(). Giá trị trả về là named tuple DefaultVerifyPaths:

  • cafile - đã giải quyết đường dẫn đến cafile hoặc None nếu tệp không tồn tại,

  • capath - đã giải quyết đường dẫn tới capath hoặc None nếu thư mục không tồn tại,

  • openssl_cafile_env - Khóa môi trường của OpenSSL trỏ đến cafile,

  • openssl_cafile - đường dẫn được mã hóa cứng tới cafile,

  • openssl_capath_env - Khóa môi trường của OpenSSL trỏ tới capath,

  • openssl_capath - đường dẫn được mã hóa cứng đến thư mục capath

Added in version 3.4.

ssl.enum_certificates(store_name)

Truy xuất chứng chỉ từ kho chứng chỉ hệ thống của Windows. store_name có thể là một trong CA, ROOT hoặc MY. Windows cũng có thể cung cấp thêm các cửa hàng chứng nhận.

Hàm trả về danh sách các bộ dữ liệu (cert_bytes, Encoding_type, Trust). Encoding_type chỉ định mã hóa của cert_bytes. Đó là x509_asn cho dữ liệu X.509 ASN.1 hoặc pkcs_7_asn cho dữ liệu PKCS#7 ASN.1. Trust chỉ định mục đích của chứng chỉ dưới dạng tập hợp OIDS hoặc chính xác là True nếu chứng chỉ đáng tin cậy cho mọi mục đích.

Ví dụ:

>>> ssl.enum_certificates("CA")
[(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}),
 (b'data...', 'x509_asn', Đúng)]

sẵn có: Windows.

Added in version 3.4.

ssl.enum_crls(store_name)

Truy xuất CRL từ kho chứng chỉ hệ thống của Windows. store_name có thể là một trong CA, ROOT hoặc MY. Windows cũng có thể cung cấp thêm các cửa hàng chứng nhận.

Hàm trả về danh sách các bộ dữ liệu (cert_bytes, Encoding_type, Trust). Encoding_type chỉ định mã hóa của cert_bytes. Đó là x509_asn cho dữ liệu X.509 ASN.1 hoặc pkcs_7_asn cho dữ liệu PKCS#7 ASN.1.

sẵn có: Windows.

Added in version 3.4.

Hằng số

Tất cả các hằng số hiện là bộ sưu tập enum.IntEnum hoặc enum.IntFlag.

Added in version 3.6.

ssl.CERT_NONE

Giá trị có thể có cho SSLContext.verify_mode. Ngoại trừ PROTOCOL_TLS_CLIENT, đây là chế độ mặc định. Với các ổ cắm phía máy khách, hầu như mọi chứng chỉ đều được chấp nhận. Các lỗi xác thực, chẳng hạn như chứng chỉ không đáng tin cậy hoặc đã hết hạn, sẽ bị bỏ qua và không hủy bỏ quá trình bắt tay TLS/SSL.

Ở chế độ máy chủ, không có chứng chỉ nào được yêu cầu từ máy khách, vì vậy máy khách không gửi bất kỳ chứng chỉ nào để xác thực chứng chỉ ứng dụng khách.

Xem phần thảo luận về Cân nhắc về bảo mật bên dưới.

ssl.CERT_OPTIONAL

Giá trị có thể có cho SSLContext.verify_mode. Ở chế độ máy khách, CERT_OPTIONAL có ý nghĩa tương tự như CERT_REQUIRED. Thay vào đó, nên sử dụng CERT_REQUIRED cho ổ cắm phía máy khách.

Ở chế độ máy chủ, yêu cầu chứng chỉ ứng dụng khách sẽ được gửi đến máy khách. Máy khách có thể bỏ qua yêu cầu hoặc gửi chứng chỉ để thực hiện xác thực chứng chỉ ứng dụng khách TLS. Nếu khách hàng chọn gửi chứng chỉ, nó sẽ được xác minh. Bất kỳ lỗi xác minh nào sẽ ngay lập tức hủy bỏ quá trình bắt tay TLS.

Việc sử dụng cài đặt này yêu cầu phải chuyển một bộ chứng chỉ CA hợp lệ tới SSLContext.load_verify_locations().

ssl.CERT_REQUIRED

Giá trị có thể có cho SSLContext.verify_mode. Ở chế độ này, chứng chỉ được yêu cầu từ phía bên kia của kết nối ổ cắm; SSLError sẽ được nâng lên nếu không có chứng chỉ nào được cung cấp hoặc nếu xác thực của nó không thành công. Chế độ này đủ not để xác minh chứng chỉ ở chế độ máy khách vì nó không khớp với tên máy chủ. check_hostname cũng phải được bật để xác minh tính xác thực của chứng chỉ. PROTOCOL_TLS_CLIENT sử dụng CERT_REQUIRED và bật check_hostname theo mặc định.

Với ổ cắm máy chủ, chế độ này cung cấp xác thực chứng chỉ ứng dụng khách TLS bắt buộc. Yêu cầu chứng chỉ ứng dụng khách được gửi đến ứng dụng khách và ứng dụng khách phải cung cấp chứng chỉ hợp lệ và đáng tin cậy.

Việc sử dụng cài đặt này yêu cầu phải chuyển một bộ chứng chỉ CA hợp lệ tới SSLContext.load_verify_locations().

class ssl.VerifyMode

enum.IntEnum tập hợp các hằng số CERT_*.

Added in version 3.6.

ssl.VERIFY_DEFAULT

Giá trị có thể có cho SSLContext.verify_flags. Trong chế độ này, danh sách thu hồi chứng chỉ (CRL) không được chọn. Theo mặc định, OpenSSL không yêu cầu cũng như không xác minh CRL.

Added in version 3.4.

ssl.VERIFY_CRL_CHECK_LEAF

Giá trị có thể có cho SSLContext.verify_flags. Ở chế độ này, chỉ có chứng chỉ ngang hàng được chọn chứ không có chứng chỉ CA trung gian nào. Chế độ này yêu cầu CRL hợp lệ được ký bởi nhà phát hành chứng chỉ ngang hàng (CA tổ tiên trực tiếp của nó). Nếu không có CRL thích hợp nào được tải với SSLContext.load_verify_locations, việc xác thực sẽ không thành công.

Added in version 3.4.

ssl.VERIFY_CRL_CHECK_CHAIN

Giá trị có thể có cho SSLContext.verify_flags. Ở chế độ này, CRL của tất cả các chứng chỉ trong chuỗi chứng chỉ ngang hàng sẽ được kiểm tra.

Added in version 3.4.

ssl.VERIFY_X509_STRICT

Giá trị có thể có của SSLContext.verify_flags để vô hiệu hóa các giải pháp thay thế cho chứng chỉ X.509 bị hỏng.

Added in version 3.4.

ssl.VERIFY_ALLOW_PROXY_CERTS

Giá trị có thể có của SSLContext.verify_flags để bật xác minh chứng chỉ proxy.

Added in version 3.10.

ssl.VERIFY_X509_TRUSTED_FIRST

Giá trị có thể có cho SSLContext.verify_flags. Nó hướng dẫn OpenSSL ưu tiên các chứng chỉ đáng tin cậy khi xây dựng chuỗi tin cậy để xác thực chứng chỉ. Cờ này được bật theo mặc định.

Added in version 3.4.4.

ssl.VERIFY_X509_PARTIAL_CHAIN

Giá trị có thể có cho SSLContext.verify_flags. Nó hướng dẫn OpenSSL chấp nhận các CA trung gian trong kho tin cậy để được coi là điểm neo tin cậy, giống như cách các chứng chỉ CA gốc tự ký. Điều này giúp có thể tin cậy các chứng chỉ do CA trung gian cấp mà không cần phải tin cậy CA gốc tổ tiên của nó.

Added in version 3.10.

class ssl.VerifyFlags

enum.IntFlag tập hợp các hằng số VERIFY_*.

Added in version 3.6.

ssl.PROTOCOL_TLS

Chọn phiên bản giao thức cao nhất mà cả máy khách và máy chủ đều hỗ trợ. Bất chấp tên gọi, tùy chọn này có thể chọn cả giao thức "SSL" và "TLS".

Added in version 3.6.

Sắp loại bỏ từ phiên bản 3.10: Máy khách và máy chủ TLS yêu cầu các cài đặt mặc định khác nhau để liên lạc an toàn. Hằng số giao thức TLS chung không được dùng nữa mà thay vào đó là PROTOCOL_TLS_CLIENTPROTOCOL_TLS_SERVER.

ssl.PROTOCOL_TLS_CLIENT

Tự động đàm phán phiên bản giao thức cao nhất mà cả máy khách và máy chủ đều hỗ trợ, đồng thời định cấu hình các kết nối phía máy khách theo ngữ cảnh. Giao thức bật CERT_REQUIREDcheck_hostname theo mặc định.

Added in version 3.6.

ssl.PROTOCOL_TLS_SERVER

Tự động đàm phán phiên bản giao thức cao nhất mà cả máy khách và máy chủ đều hỗ trợ, đồng thời định cấu hình các kết nối phía máy chủ ngữ cảnh.

Added in version 3.6.

ssl.PROTOCOL_SSLv23

Bí danh cho PROTOCOL_TLS.

Sắp loại bỏ từ phiên bản 3.6: Thay vào đó hãy sử dụng PROTOCOL_TLS.

ssl.PROTOCOL_SSLv3

Chọn SSL phiên bản 3 làm giao thức mã hóa kênh.

Giao thức này không khả dụng nếu OpenSSL được biên dịch với tùy chọn no-ssl3.

Cảnh báo

SSL phiên bản 3 không an toàn. Việc sử dụng nó rất không được khuyến khích.

Sắp loại bỏ từ phiên bản 3.6: OpenSSL đã không dùng nữa tất cả các giao thức cụ thể của phiên bản. Thay vào đó, hãy sử dụng giao thức mặc định PROTOCOL_TLS_SERVER hoặc PROTOCOL_TLS_CLIENT với SSLContext.minimum_versionSSLContext.maximum_version.

ssl.PROTOCOL_TLSv1

Chọn TLS phiên bản 1.0 làm giao thức mã hóa kênh.

Sắp loại bỏ từ phiên bản 3.6: OpenSSL đã không dùng nữa tất cả các giao thức cụ thể của phiên bản.

ssl.PROTOCOL_TLSv1_1

Chọn TLS phiên bản 1.1 làm giao thức mã hóa kênh. Chỉ khả dụng với phiên bản openssl 1.0.1+.

Added in version 3.4.

Sắp loại bỏ từ phiên bản 3.6: OpenSSL đã không dùng nữa tất cả các giao thức cụ thể của phiên bản.

ssl.PROTOCOL_TLSv1_2

Chọn TLS phiên bản 1.2 làm giao thức mã hóa kênh. Chỉ khả dụng với phiên bản openssl 1.0.1+.

Added in version 3.4.

Sắp loại bỏ từ phiên bản 3.6: OpenSSL đã không dùng nữa tất cả các giao thức cụ thể của phiên bản.

ssl.OP_ALL

Cho phép khắc phục các lỗi khác nhau xuất hiện trong các triển khai SSL khác. Tùy chọn này được đặt theo mặc định. Nó không nhất thiết phải đặt các cờ giống như hằng số SSL_OP_ALL của OpenSSL.

Added in version 3.2.

ssl.OP_NO_SSLv2

Ngăn chặn kết nối SSLv2. Tùy chọn này chỉ áp dụng được khi kết hợp với PROTOCOL_TLS. Nó ngăn cản các đồng nghiệp chọn SSLv2 làm phiên bản giao thức.

Added in version 3.2.

Sắp loại bỏ từ phiên bản 3.6: SSLv2 không được dùng nữa

ssl.OP_NO_SSLv3

Ngăn chặn kết nối SSLv3. Tùy chọn này chỉ áp dụng được khi kết hợp với PROTOCOL_TLS. Nó ngăn cản các đồng nghiệp chọn SSLv3 làm phiên bản giao thức.

Added in version 3.2.

Sắp loại bỏ từ phiên bản 3.6: SSLv3 không được dùng nữa

ssl.OP_NO_TLSv1

Ngăn chặn kết nối TLSv1. Tùy chọn này chỉ áp dụng được khi kết hợp với PROTOCOL_TLS. Nó ngăn các đồng nghiệp chọn TLSv1 làm phiên bản giao thức.

Added in version 3.2.

Sắp loại bỏ từ phiên bản 3.7: Tùy chọn này không được dùng nữa kể từ OpenSSL 1.1.0, thay vào đó hãy sử dụng SSLContext.minimum_versionSSLContext.maximum_version mới.

ssl.OP_NO_TLSv1_1

Ngăn chặn kết nối TLSv1.1. Tùy chọn này chỉ áp dụng được khi kết hợp với PROTOCOL_TLS. Nó ngăn các đồng nghiệp chọn TLSv1.1 làm phiên bản giao thức. Chỉ khả dụng với phiên bản openssl 1.0.1+.

Added in version 3.4.

Sắp loại bỏ từ phiên bản 3.7: Tùy chọn này không được dùng nữa kể từ OpenSSL 1.1.0.

ssl.OP_NO_TLSv1_2

Ngăn chặn kết nối TLSv1.2. Tùy chọn này chỉ áp dụng được khi kết hợp với PROTOCOL_TLS. Nó ngăn các đồng nghiệp chọn TLSv1.2 làm phiên bản giao thức. Chỉ khả dụng với phiên bản openssl 1.0.1+.

Added in version 3.4.

Sắp loại bỏ từ phiên bản 3.7: Tùy chọn này không được dùng nữa kể từ OpenSSL 1.1.0.

ssl.OP_NO_TLSv1_3

Ngăn chặn kết nối TLSv1.3. Tùy chọn này chỉ áp dụng được khi kết hợp với PROTOCOL_TLS. Nó ngăn các đồng nghiệp chọn TLSv1.3 làm phiên bản giao thức. TLS 1.3 khả dụng với OpenSSL 1.1.1 trở lên. Khi Python được biên dịch dựa trên phiên bản OpenSSL cũ hơn, cờ mặc định là 0.

Added in version 3.6.3.

Sắp loại bỏ từ phiên bản 3.7: Tùy chọn này không được dùng nữa kể từ OpenSSL 1.1.0. Nó đã được thêm vào 2.7.15 và 3.6.3 để tương thích ngược với OpenSSL 1.0.2.

ssl.OP_NO_RENEGOTIATION

Vô hiệu hóa tất cả thương lượng lại trong TLSv1.2 trở về trước. Không gửi tin nhắn HelloRequest và bỏ qua các yêu cầu đàm phán lại qua ClientHello.

Tùy chọn này chỉ khả dụng với OpenSSL 1.1.0h trở lên.

Added in version 3.7.

ssl.OP_CIPHER_SERVER_PREFERENCE

Sử dụng tùy chọn đặt hàng mật mã của máy chủ thay vì của máy khách. Tùy chọn này không có hiệu lực đối với ổ cắm máy khách và ổ cắm máy chủ SSLv2.

Added in version 3.3.

ssl.OP_SINGLE_DH_USE

Ngăn chặn việc sử dụng lại cùng một khóa DH cho các phiên SSL riêng biệt. Điều này cải thiện tính bí mật về phía trước nhưng đòi hỏi nhiều tài nguyên tính toán hơn. Tùy chọn này chỉ áp dụng cho ổ cắm máy chủ.

Added in version 3.3.

ssl.OP_SINGLE_ECDH_USE

Ngăn chặn việc sử dụng lại cùng một khóa ECDH cho các phiên SSL riêng biệt. Điều này cải thiện tính bí mật về phía trước nhưng đòi hỏi nhiều tài nguyên tính toán hơn. Tùy chọn này chỉ áp dụng cho ổ cắm máy chủ.

Added in version 3.3.

ssl.OP_ENABLE_MIDDLEBOX_COMPAT

Gửi tin nhắn giả Thay đổi thông số mật mã (CCS) trong quá trình bắt tay TLS 1.3 để làm cho kết nối TLS 1.3 trông giống kết nối TLS 1.2 hơn.

Tùy chọn này chỉ khả dụng với OpenSSL 1.1.1 trở lên.

Added in version 3.8.

ssl.OP_NO_COMPRESSION

Tắt tính năng nén trên kênh SSL. Điều này rất hữu ích nếu giao thức ứng dụng hỗ trợ sơ đồ nén riêng của nó.

Added in version 3.3.

class ssl.Options

enum.IntFlag tập hợp các hằng số OP_*.

ssl.OP_NO_TICKET

Ngăn chặn phía khách hàng yêu cầu vé phiên.

Added in version 3.6.

ssl.OP_IGNORE_UNEXPECTED_EOF

Bỏ qua việc tắt kết nối TLS đột ngột.

Tùy chọn này chỉ khả dụng với OpenSSL 3.0.0 trở lên.

Added in version 3.10.

ssl.OP_ENABLE_KTLS

Cho phép sử dụng kernel TLS. Để hưởng lợi từ tính năng này, OpenSSL phải được biên soạn với sự hỗ trợ cho nó, đồng thời các bộ mật mã và tiện ích mở rộng đã thương lượng phải được nó hỗ trợ (danh sách các bộ mã hóa được hỗ trợ có thể khác nhau tùy theo nền tảng và phiên bản kernel).

Lưu ý rằng với kernel TLS được kích hoạt, một số hoạt động mã hóa được kernel thực hiện trực tiếp và không thông qua bất kỳ Nhà cung cấp OpenSSL có sẵn nào. Điều này có thể là điều không mong muốn, chẳng hạn như nếu ứng dụng yêu cầu tất cả các hoạt động mã hóa phải được thực hiện bởi nhà cung cấp FIPS.

Tùy chọn này chỉ khả dụng với OpenSSL 3.0.0 trở lên.

Added in version 3.12.

ssl.OP_LEGACY_SERVER_CONNECT

Chỉ cho phép đàm phán lại không an toàn cũ giữa OpenSSL và các máy chủ chưa được vá lỗi.

Added in version 3.12.

ssl.HAS_ALPN

Thư viện OpenSSL có hỗ trợ tích hợp cho tiện ích mở rộng Application-Layer Protocol Negotiation TLS như được mô tả trong RFC 7301 hay không.

Added in version 3.5.

ssl.HAS_NEVER_CHECK_COMMON_NAME

Thư viện OpenSSL có hỗ trợ tích hợp không kiểm tra tên chung của chủ đề hay không và SSLContext.hostname_checks_common_name có thể ghi được hay không.

Added in version 3.7.

ssl.HAS_ECDH

Thư viện OpenSSL có hỗ trợ tích hợp cho trao đổi khóa Diffie-Hellman dựa trên Đường cong Elliptic hay không. Điều này đúng trừ khi tính năng này bị nhà phân phối vô hiệu hóa rõ ràng.

Added in version 3.3.

ssl.HAS_SNI

Thư viện OpenSSL có hỗ trợ tích hợp cho tiện ích mở rộng Server Name Indication hay không (như được định nghĩa trong RFC 6066).

Added in version 3.2.

ssl.HAS_NPN

Thư viện OpenSSL có hỗ trợ tích hợp cho Next Protocol Negotiation như được mô tả trong Application Layer Protocol Negotiation hay không. Khi đúng, bạn có thể sử dụng phương pháp SSLContext.set_npn_protocols() để quảng cáo giao thức nào bạn muốn hỗ trợ.

Added in version 3.3.

ssl.HAS_SSLv2

Thư viện OpenSSL có hỗ trợ tích hợp cho giao thức SSL 2.0 hay không.

Added in version 3.7.

ssl.HAS_SSLv3

Thư viện OpenSSL có hỗ trợ tích hợp cho giao thức SSL 3.0 hay không.

Added in version 3.7.

ssl.HAS_TLSv1

Thư viện OpenSSL có hỗ trợ tích hợp cho giao thức TLS 1.0 hay không.

Added in version 3.7.

ssl.HAS_TLSv1_1

Thư viện OpenSSL có hỗ trợ tích hợp cho giao thức TLS 1.1 hay không.

Added in version 3.7.

ssl.HAS_TLSv1_2

Thư viện OpenSSL có hỗ trợ tích hợp cho giao thức TLS 1.2 hay không.

Added in version 3.7.

ssl.HAS_TLSv1_3

Thư viện OpenSSL có hỗ trợ tích hợp cho giao thức TLS 1.3 hay không.

Added in version 3.7.

ssl.HAS_PSK

Thư viện OpenSSL có hỗ trợ tích hợp cho TLS-PSK hay không.

Added in version 3.13.

ssl.HAS_PHA

Thư viện OpenSSL có hỗ trợ tích hợp cho TLS-PHA hay không.

Added in version 3.14.

ssl.CHANNEL_BINDING_TYPES

Danh sách các loại liên kết kênh TLS được hỗ trợ. Các chuỗi trong danh sách này có thể được sử dụng làm đối số cho SSLSocket.get_channel_binding().

Added in version 3.3.

ssl.OPENSSL_VERSION

Chuỗi phiên bản của thư viện OpenSSL được trình thông dịch tải:

>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2k ngày 26 tháng 1 năm 2017'

Added in version 3.2.

ssl.OPENSSL_VERSION_INFO

Một bộ gồm năm số nguyên biểu thị thông tin phiên bản về thư viện OpenSSL:

>>> ssl.OPENSSL_VERSION_INFO
(1, 0, 2, 11, 15)

Added in version 3.2.

ssl.OPENSSL_VERSION_NUMBER

Số phiên bản thô của thư viện OpenSSL, dưới dạng một số nguyên duy nhất:

>>> ssl.OPENSSL_VERSION_NUMBER
268443839
>>> hex(ssl.OPENSSL_VERSION_NUMBER)
'0x100020bf'

Added in version 3.2.

ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE
ssl.ALERT_DESCRIPTION_INTERNAL_ERROR
ALERT_DESCRIPTION_*

Mô tả cảnh báo từ RFC 5246 và những người khác. Zz001zz chứa danh sách này và các tham chiếu đến RFC nơi ý nghĩa của chúng được xác định.

Được sử dụng làm giá trị trả về của hàm gọi lại trong SSLContext.set_servername_callback().

Added in version 3.4.

class ssl.AlertDescription

enum.IntEnum tập hợp các hằng số ALERT_DESCRIPTION_*.

Added in version 3.6.

Purpose.SERVER_AUTH

Tùy chọn cho create_default_context()SSLContext.load_default_certs(). Giá trị này cho biết ngữ cảnh có thể được sử dụng để xác thực các máy chủ web (do đó, nó sẽ được sử dụng để tạo các socket phía máy khách).

Added in version 3.4.

Purpose.CLIENT_AUTH

Tùy chọn cho create_default_context()SSLContext.load_default_certs(). Giá trị này cho biết ngữ cảnh có thể được sử dụng để xác thực ứng dụng khách web (do đó, nó sẽ được sử dụng để tạo ổ cắm phía máy chủ).

Added in version 3.4.

class ssl.SSLErrorNumber

enum.IntEnum tập hợp các hằng số SSL_ERROR_*.

Added in version 3.6.

class ssl.TLSVersion

enum.IntEnum tuyển tập các phiên bản SSL và TLS dành cho SSLContext.maximum_versionSSLContext.minimum_version.

Added in version 3.7.

TLSVersion.MINIMUM_SUPPORTED
TLSVersion.MAXIMUM_SUPPORTED

Phiên bản SSL hoặc TLS được hỗ trợ tối thiểu hoặc tối đa. Đây là những hằng số kỳ diệu. Giá trị của chúng không phản ánh phiên bản TLS/SSL thấp nhất và cao nhất hiện có.

TLSVersion.SSLv3
TLSVersion.TLSv1
TLSVersion.TLSv1_1
TLSVersion.TLSv1_2
TLSVersion.TLSv1_3

SSL 3.0 đến TLS 1.3.

Sắp loại bỏ từ phiên bản 3.10: Tất cả các thành viên TLSVersion ngoại trừ TLSVersion.TLSv1_2TLSVersion.TLSv1_3 đều không được dùng nữa.

ổ cắm SSL

class ssl.SSLSocket(socket.socket)

Ổ cắm SSL cung cấp các phương thức sau của Đối tượng ổ cắm:

Tuy nhiên, do giao thức SSL (và TLS) có khung riêng trên TCP, nên ở một số khía cạnh nhất định, tính trừu tượng của ổ cắm SSL có thể khác với đặc điểm kỹ thuật của ổ cắm cấp hệ điều hành thông thường. Xem đặc biệt là notes on non-blocking sockets.

Các phiên bản của SSLSocket phải được tạo bằng phương thức SSLContext.wrap_socket().

Thay đổi trong phiên bản 3.5: Phương thức sendfile() đã được thêm vào.

Thay đổi trong phiên bản 3.5: Zz000zz không đặt lại thời gian chờ của ổ cắm mỗi khi nhận hoặc gửi byte. Thời gian chờ của ổ cắm hiện là tổng thời gian tắt máy tối đa.

Sắp loại bỏ từ phiên bản 3.6: Việc tạo trực tiếp một phiên bản SSLSocket không được dùng nữa, hãy sử dụng SSLContext.wrap_socket() để bọc một ổ cắm.

Thay đổi trong phiên bản 3.7: Các phiên bản SSLSocket phải được tạo bằng wrap_socket(). Trong các phiên bản trước, có thể tạo phiên bản trực tiếp. Điều này chưa bao giờ được ghi lại hoặc được hỗ trợ chính thức.

Thay đổi trong phiên bản 3.10: Python hiện sử dụng SSL_read_exSSL_write_ex nội bộ. Các chức năng hỗ trợ đọc và ghi dữ liệu lớn hơn 2 GB. Việc ghi dữ liệu có độ dài bằng 0 không còn bị lỗi do vi phạm giao thức nữa.

Ổ cắm SSL cũng có các phương thức và thuộc tính bổ sung sau:

SSLSocket.read(len=1024, buffer=None)

Đọc tối đa len byte dữ liệu từ ổ cắm SSL và trả về kết quả dưới dạng phiên bản bytes. Nếu buffer được chỉ định thì thay vào đó hãy đọc vào bộ đệm và trả về số byte đã đọc.

Tăng SSLWantReadError hoặc SSLWantWriteError nếu ổ cắm là non-blocking và quá trình đọc sẽ bị chặn.

Vì có thể đàm phán lại bất cứ lúc nào, lệnh gọi tới read() cũng có thể gây ra thao tác ghi.

Thay đổi trong phiên bản 3.5: Thời gian chờ của ổ cắm không còn được đặt lại mỗi lần nhận hoặc gửi byte. Thời gian chờ của ổ cắm hiện là tổng thời lượng tối đa để đọc lên tới len byte.

Sắp loại bỏ từ phiên bản 3.6: Sử dụng recv() thay vì read().

SSLSocket.write(data)

Viết data vào ổ cắm SSL và trả về số byte đã ghi. Đối số data phải là đối tượng hỗ trợ giao diện bộ đệm.

Tăng SSLWantReadError hoặc SSLWantWriteError nếu ổ cắm là non-blocking và quá trình ghi sẽ bị chặn.

Vì bất kỳ lúc nào cũng có thể đàm phán lại, lệnh gọi tới write() cũng có thể gây ra các hoạt động đọc.

Thay đổi trong phiên bản 3.5: Thời gian chờ của ổ cắm không còn được đặt lại mỗi lần nhận hoặc gửi byte. Thời gian chờ của ổ cắm hiện là tổng thời lượng tối đa để ghi data.

Sắp loại bỏ từ phiên bản 3.6: Sử dụng send() thay vì write().

Ghi chú

Các phương thức read()write() là các phương thức cấp thấp đọc và ghi dữ liệu cấp ứng dụng, không được mã hóa và giải mã/mã hóa nó thành dữ liệu cấp dây được mã hóa. Các phương thức này yêu cầu kết nối SSL đang hoạt động, tức là quá trình bắt tay đã hoàn tất và SSLSocket.unwrap() không được gọi.

Thông thường bạn nên sử dụng các phương thức API của socket như recv()send() thay vì các phương thức này.

SSLSocket.do_handshake(block=False)

Thực hiện bắt tay thiết lập SSL.

Nếu block là đúng và thời gian chờ mà gettimeout() thu được bằng 0 thì ổ cắm được đặt ở chế độ chặn cho đến khi quá trình bắt tay được thực hiện.

Thay đổi trong phiên bản 3.4: Phương thức bắt tay cũng thực hiện match_hostname() khi thuộc tính check_hostname của context của socket là đúng.

Thay đổi trong phiên bản 3.5: Thời gian chờ của ổ cắm không còn được đặt lại mỗi lần nhận hoặc gửi byte. Thời gian chờ của ổ cắm bây giờ là tổng thời lượng tối đa của quá trình bắt tay.

Thay đổi trong phiên bản 3.7: Tên máy chủ hoặc địa chỉ IP được OpenSSL khớp trong quá trình bắt tay. Chức năng match_hostname() không còn được sử dụng. Trong trường hợp OpenSSL từ chối tên máy chủ hoặc địa chỉ IP, quá trình bắt tay sẽ bị hủy bỏ sớm và thông báo cảnh báo TLS sẽ được gửi đến thiết bị ngang hàng.

SSLSocket.getpeercert(binary_form=False)

Nếu không có chứng chỉ cho thiết bị ngang hàng ở đầu bên kia của kết nối, hãy trả về None. Nếu việc bắt tay SSL chưa được thực hiện, hãy raise ValueError.

Nếu tham số binary_formFalse và đã nhận được chứng chỉ từ thiết bị ngang hàng thì phương thức này sẽ trả về một phiên bản dict. Nếu chứng chỉ không được xác thực, lệnh sẽ trống. Nếu chứng chỉ đã được xác thực, nó sẽ trả về một lệnh có nhiều khóa, trong số đó có subject (khóa chính được cấp chứng chỉ) và issuer (khóa chính cấp chứng chỉ). Nếu chứng chỉ chứa phiên bản của tiện ích mở rộng Subject Alternative Name (xem RFC 3280), thì cũng sẽ có khóa subjectAltName trong từ điển.

Các trường subjectissuer là các bộ chứa chuỗi tên phân biệt tương đối (RDN) được cung cấp trong cấu trúc dữ liệu của chứng chỉ cho các trường tương ứng và mỗi RDN là một chuỗi các cặp tên-giá trị. Đây là một ví dụ thực tế:

{'nhà phát hành': ((('countryName', 'IL'),),
            (('tên tổ chức', 'StartCom Ltd.'),),
            (('tên đơn vị tổ chức',
              'Ký chứng chỉ kỹ thuật số an toàn'),
            (('tên chung',
              'CA máy chủ trung gian chính StartCom lớp 2'),)),
 'notAfter': 'Ngày 22 tháng 11 08:15:19 2013 GMT',
 'notBefore': 'Ngày 21 tháng 11 03:09:52 2011 GMT',
 'Số sê-ri': '95F0',
 'chủ đề': ((('mô tả', '571208-SLe257oHY9fVQ07Z'),),
             (('tên quốc gia', 'US'),),
             (('stateOrProvinceName', 'California'),),
             (('localityName', 'San Francisco'),),
             (('tên tổ chức', 'Tổ chức biên giới điện tử, Inc.'),),
             (('commonName', '*.eff.org'),),
             (('địa chỉ email', 'hostmaster@eff.org'),)),
 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),
 'phiên bản': 3}

Nếu tham số binary_formTrue và chứng chỉ đã được cung cấp thì phương thức này trả về dạng được mã hóa DER của toàn bộ chứng chỉ dưới dạng một chuỗi byte hoặc None nếu thiết bị ngang hàng không cung cấp chứng chỉ. Việc thiết bị ngang hàng có cung cấp chứng chỉ hay không phụ thuộc vào vai trò của ổ cắm SSL:

  • đối với ổ cắm SSL của máy khách, máy chủ sẽ luôn cung cấp chứng chỉ, bất kể có cần xác thực hay không;

  • đối với ổ cắm SSL của máy chủ, máy khách sẽ chỉ cung cấp chứng chỉ khi máy chủ yêu cầu; do đó getpeercert() sẽ trả về None nếu bạn sử dụng CERT_NONE (chứ không phải CERT_OPTIONAL hoặc CERT_REQUIRED).

Xem thêm SSLContext.check_hostname.

Thay đổi trong phiên bản 3.2: Từ điển được trả về bao gồm các mục bổ sung như issuernotBefore.

Thay đổi trong phiên bản 3.4: ValueError được nâng lên khi quá trình bắt tay chưa hoàn tất. Từ điển được trả về bao gồm các mục mở rộng X509v3 bổ sung như URI crlDistributionPoints, caIssuersOCSP.

Thay đổi trong phiên bản 3.9: Chuỗi địa chỉ IPv6 không còn có dòng mới ở cuối.

SSLSocket.get_verified_chain()

Trả về chuỗi chứng chỉ đã được xác minh do đầu bên kia của kênh SSL cung cấp dưới dạng danh sách các byte được mã hóa DER. Nếu xác minh chứng chỉ bị vô hiệu hóa, phương thức hoạt động tương tự như get_unverified_chain().

Added in version 3.13.

SSLSocket.get_unverified_chain()

Trả về chuỗi chứng chỉ thô do đầu bên kia của kênh SSL cung cấp dưới dạng danh sách các byte được mã hóa DER.

Added in version 3.13.

SSLSocket.cipher()

Trả về một bộ ba giá trị chứa tên của mật mã đang được sử dụng, phiên bản của giao thức SSL xác định cách sử dụng của nó và số lượng bit bí mật đang được sử dụng. Nếu không có kết nối nào được thiết lập, trả về None.

SSLSocket.shared_ciphers()

Trả về danh sách mật mã có sẵn trong cả máy khách và máy chủ. Mỗi mục của danh sách được trả về là một bộ ba giá trị chứa tên của mật mã, phiên bản của giao thức SSL xác định cách sử dụng của nó và số bit bí mật mà mật mã sử dụng. shared_ciphers() trả về None nếu không có kết nối nào được thiết lập hoặc ổ cắm là ổ cắm máy khách.

Added in version 3.5.

SSLSocket.compression()

Trả về thuật toán nén đang được sử dụng dưới dạng chuỗi hoặc None nếu kết nối không được nén.

Nếu giao thức cấp cao hơn hỗ trợ cơ chế nén riêng của nó, bạn có thể sử dụng OP_NO_COMPRESSION để tắt tính năng nén cấp SSL.

Added in version 3.3.

SSLSocket.get_channel_binding(cb_type='tls-unique')

Nhận dữ liệu liên kết kênh cho kết nối hiện tại, dưới dạng đối tượng byte. Trả về None nếu không được kết nối hoặc quá trình bắt tay chưa hoàn tất.

Tham số cb_type cho phép lựa chọn loại liên kết kênh mong muốn. Các loại liên kết kênh hợp lệ được liệt kê trong danh sách CHANNEL_BINDING_TYPES. Hiện tại chỉ hỗ trợ liên kết kênh 'tls-unique', được xác định bởi RFC 5929. ValueError sẽ được tăng lên nếu yêu cầu loại liên kết kênh không được hỗ trợ.

Added in version 3.3.

SSLSocket.selected_alpn_protocol()

Trả về giao thức đã được chọn trong quá trình bắt tay TLS. Nếu SSLContext.set_alpn_protocols() không được gọi, nếu bên kia không hỗ trợ ALPN, nếu ổ cắm này không hỗ trợ bất kỳ giao thức nào được đề xuất của khách hàng hoặc nếu việc bắt tay chưa xảy ra, None sẽ được trả về.

Added in version 3.5.

SSLSocket.selected_npn_protocol()

Trả về giao thức cấp cao hơn đã được chọn trong quá trình bắt tay TLS/SSL. Nếu SSLContext.set_npn_protocols() không được gọi hoặc nếu bên kia không hỗ trợ NPN hoặc nếu quá trình bắt tay chưa diễn ra thì điều này sẽ trả về None.

Added in version 3.3.

Sắp loại bỏ từ phiên bản 3.10: NPN đã được thay thế bởi ALPN

SSLSocket.unwrap()

Thực hiện bắt tay tắt máy SSL, loại bỏ lớp TLS khỏi ổ cắm bên dưới và trả về đối tượng ổ cắm bên dưới. Điều này có thể được sử dụng để chuyển từ hoạt động được mã hóa qua kết nối sang không được mã hóa. Ổ cắm được trả lại phải luôn được sử dụng để liên lạc thêm với phía bên kia của kết nối, thay vì ổ cắm ban đầu.

SSLSocket.verify_client_post_handshake()

Yêu cầu xác thực sau bắt tay (PHA) từ máy khách TLS 1.3. PHA chỉ có thể được khởi tạo cho kết nối TLS 1.3 từ ổ cắm phía máy chủ, sau lần bắt tay TLS ban đầu và với PHA được bật ở cả hai bên, hãy xem SSLContext.post_handshake_auth.

Phương pháp này không thực hiện trao đổi chứng chỉ ngay lập tức. Phía máy chủ gửi Yêu cầu chứng chỉ trong sự kiện ghi tiếp theo và mong muốn khách hàng phản hồi bằng chứng chỉ trong sự kiện đọc tiếp theo.

Nếu bất kỳ điều kiện tiên quyết nào không được đáp ứng (ví dụ: không phải TLS 1.3, PHA không được bật), SSLError sẽ được nâng lên.

Ghi chú

Chỉ khả dụng khi bật OpenSSL 1.1.1 và TLS 1.3. Nếu không hỗ trợ TLS 1.3, phương thức này sẽ tăng NotImplementedError.

Added in version 3.8.

SSLSocket.version()

Trả về phiên bản giao thức SSL thực tế được kết nối đàm phán dưới dạng chuỗi hoặc None nếu không thiết lập kết nối an toàn. Theo văn bản này, các giá trị trả về có thể bao gồm "SSLv2", "SSLv3", "TLSv1", "TLSv1.1""TLSv1.2". Các phiên bản OpenSSL gần đây có thể xác định nhiều giá trị trả về hơn.

Added in version 3.5.

SSLSocket.pending()

Trả về số byte đã được giải mã có sẵn để đọc, đang chờ kết nối.

SSLSocket.context

Đối tượng SSLContext mà ổ cắm SSL này được gắn vào.

Added in version 3.2.

SSLSocket.server_side

Một boolean là True dành cho ổ cắm phía máy chủ và False dành cho ổ cắm phía máy khách.

Added in version 3.2.

SSLSocket.server_hostname

Tên máy chủ của máy chủ: loại str hoặc None cho ổ cắm phía máy chủ hoặc nếu tên máy chủ không được chỉ định trong hàm tạo.

Added in version 3.2.

Thay đổi trong phiên bản 3.7: Thuộc tính bây giờ luôn là văn bản ASCII. Khi server_hostname là tên miền quốc tế hóa (IDN), thuộc tính này hiện lưu trữ dạng nhãn A ("xn--pythn-mua.org"), thay vì dạng nhãn U ("pythön.org").

SSLSocket.session

SSLSession cho kết nối SSL này. Phiên này khả dụng cho các ổ cắm phía máy khách và máy chủ sau khi quá trình bắt tay TLS được thực hiện. Đối với ổ cắm máy khách, phiên có thể được đặt trước khi do_handshake() được gọi để sử dụng lại phiên.

Added in version 3.6.

SSLSocket.session_reused

Added in version 3.6.

bối cảnh SSL

Added in version 3.2.

Ngữ cảnh SSL chứa nhiều dữ liệu có thời gian tồn tại lâu hơn so với các kết nối SSL đơn lẻ, chẳng hạn như tùy chọn cấu hình SSL, (các) chứng chỉ và (các) khóa riêng. Nó cũng quản lý bộ đệm của các phiên SSL cho ổ cắm phía máy chủ để tăng tốc các kết nối lặp lại từ cùng một máy khách.

class ssl.SSLContext(protocol=None)

Tạo bối cảnh SSL mới. Bạn có thể chuyển protocol, đây phải là một trong các hằng số PROTOCOL_* được xác định trong mô-đun này. Tham số chỉ định phiên bản nào của giao thức SSL sẽ sử dụng. Thông thường, máy chủ chọn một phiên bản giao thức cụ thể và máy khách phải thích ứng với lựa chọn của máy chủ. Hầu hết các phiên bản không tương thích được với các phiên bản khác. Nếu không được chỉ định, mặc định là PROTOCOL_TLS; nó cung cấp khả năng tương thích cao nhất với các phiên bản khác.

Đây là bảng hiển thị phiên bản nào trong máy khách (ở phía dưới) có thể kết nối với phiên bản nào trong máy chủ (dọc phía trên):

client / server

SSLv2

SSLv3

TLS [3]

TLSv1

TLSv1.1

TLSv1.2

SSLv2

vâng

không

không [1]

không

không

không

SSLv3

không

vâng

không [2]

không

không

không

TLS (SSLv23) [3]

không [1]

không [2]

vâng

vâng

vâng

vâng

TLSv1

không

không

vâng

vâng

không

không

TLSv1.1

không

không

vâng

không

vâng

không

TLSv1.2

không

không

vâng

không

không

vâng

Chú thích cuối trang

Xem thêm

create_default_context() cho phép mô-đun ssl chọn cài đặt bảo mật cho một mục đích nhất định.

Thay đổi trong phiên bản 3.6: Bối cảnh được tạo với các giá trị mặc định an toàn. Các tùy chọn OP_NO_COMPRESSION, OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE, OP_NO_SSLv2OP_NO_SSLv3 (ngoại trừ PROTOCOL_SSLv3) được đặt theo mặc định. Danh sách bộ mật mã ban đầu chỉ chứa mật mã HIGH, không có mật mã NULL và không có mật mã MD5.

Sắp loại bỏ từ phiên bản 3.10: SSLContext không có đối số giao thức sẽ không được dùng nữa. Lớp ngữ cảnh sẽ yêu cầu giao thức PROTOCOL_TLS_CLIENT hoặc PROTOCOL_TLS_SERVER trong tương lai.

Thay đổi trong phiên bản 3.10: Bộ mật mã mặc định hiện chỉ bao gồm các mật mã AES và ChaCha20 an toàn với tính bảo mật chuyển tiếp và mức bảo mật 2. Các khóa RSA và DH có ít hơn 2048 bit và các khóa ECC có ít hơn 224 bit đều bị cấm. PROTOCOL_TLS, PROTOCOL_TLS_CLIENTPROTOCOL_TLS_SERVER sử dụng TLS 1.2 làm phiên bản TLS tối thiểu.

Ghi chú

SSLContext chỉ hỗ trợ đột biến giới hạn khi nó đã được kết nối sử dụng. Được phép thêm chứng chỉ mới vào kho lưu trữ tin cậy nội bộ nhưng việc thay đổi mật mã, cài đặt xác minh hoặc chứng chỉ mTLS có thể dẫn đến hành vi đáng ngạc nhiên.

Ghi chú

SSLContext được thiết kế để chia sẻ và sử dụng bởi nhiều kết nối. Vì vậy, nó an toàn cho luồng miễn là nó không được cấu hình lại sau khi được kết nối sử dụng.

Các đối tượng SSLContext có các phương thức và thuộc tính sau:

SSLContext.cert_store_stats()

Nhận số liệu thống kê về số lượng chứng chỉ X.509 đã tải, số lượng chứng chỉ X.509 được gắn cờ là chứng chỉ CA và danh sách thu hồi chứng chỉ dưới dạng từ điển.

Ví dụ về ngữ cảnh có một chứng chỉ CA và một chứng chỉ khác

>>> bối cảnh.cert_store_stats()
{'crl': 0, 'x509_ca': 1, 'x509': 2}

Added in version 3.4.

SSLContext.load_cert_chain(certfile, keyfile=None, password=None)

Tải khóa riêng và chứng chỉ tương ứng. Chuỗi certfile phải là đường dẫn đến một tệp duy nhất ở định dạng PEM chứa chứng chỉ cũng như bất kỳ số lượng chứng chỉ CA nào cần thiết để thiết lập tính xác thực của chứng chỉ. Chuỗi keyfile, nếu có, phải trỏ đến tệp chứa khóa riêng. Nếu không, khóa riêng cũng sẽ được lấy từ certfile. Xem phần thảo luận về Chứng chỉ để biết thêm thông tin về cách lưu trữ chứng chỉ trong certfile.

Đối số password có thể là một hàm được gọi để lấy mật khẩu giải mã khóa riêng. Nó sẽ chỉ được gọi nếu khóa riêng được mã hóa và cần có mật khẩu. Nó sẽ được gọi mà không có đối số và nó sẽ trả về một chuỗi, byte hoặc bytearray. Nếu giá trị trả về là một chuỗi thì nó sẽ được mã hóa thành UTF-8 trước khi sử dụng nó để giải mã khóa. Ngoài ra, một giá trị chuỗi, byte hoặc bytearray có thể được cung cấp trực tiếp dưới dạng đối số password. Nó sẽ bị bỏ qua nếu khóa riêng không được mã hóa và không cần mật khẩu.

Nếu đối số password không được chỉ định và cần phải có mật khẩu, cơ chế nhắc mật khẩu tích hợp của OpenSSL sẽ được sử dụng để nhắc người dùng nhập mật khẩu một cách tương tác.

Một SSLError được đưa ra nếu khóa riêng không khớp với chứng chỉ.

Thay đổi trong phiên bản 3.3: Đối số tùy chọn mới password.

SSLContext.load_default_certs(purpose=Purpose.SERVER_AUTH)

Tải một bộ chứng chỉ "cơ quan chứng nhận" (CA) mặc định từ các vị trí mặc định. Trên Windows, nó tải chứng chỉ CA từ kho lưu trữ hệ thống CAROOT. Trên tất cả các hệ thống, nó gọi SSLContext.set_default_verify_paths(). Trong tương lai, phương thức này cũng có thể tải chứng chỉ CA từ các vị trí khác.

Cờ purpose chỉ định loại chứng chỉ CA nào được tải. Cài đặt mặc định Purpose.SERVER_AUTH tải chứng chỉ, được gắn cờ và tin cậy để xác thực máy chủ web TLS (ổ cắm phía máy khách). Purpose.CLIENT_AUTH tải chứng chỉ CA để xác minh chứng chỉ ứng dụng khách ở phía máy chủ.

Added in version 3.4.

SSLContext.load_verify_locations(cafile=None, capath=None, cadata=None)

Tải một bộ chứng chỉ "cơ quan chứng nhận" (CA) được sử dụng để xác thực chứng chỉ của các đồng nghiệp khác khi verify_mode không phải là CERT_NONE. Ít nhất một trong số cafile hoặc capath phải được chỉ định.

Phương pháp này cũng có thể tải danh sách thu hồi chứng chỉ (CRL) ở định dạng PEM hoặc DER. Để sử dụng CRL, SSLContext.verify_flags phải được cấu hình đúng cách.

Chuỗi cafile, nếu có, là đường dẫn đến tệp chứng chỉ CA được nối ở định dạng PEM. Xem phần thảo luận về Chứng chỉ để biết thêm thông tin về cách sắp xếp các chứng chỉ trong tệp này.

Chuỗi capath, nếu có, là đường dẫn đến thư mục chứa một số chứng chỉ CA ở định dạng PEM, theo sau OpenSSL specific layout.

Đối tượng cadata, nếu có, là một chuỗi ASCII gồm một hoặc nhiều chứng chỉ được mã hóa PEM hoặc bytes-like object gồm các chứng chỉ được mã hóa DER. Giống như với capath, các dòng bổ sung xung quanh chứng chỉ được mã hóa PEM bị bỏ qua nhưng phải có ít nhất một chứng chỉ.

Thay đổi trong phiên bản 3.4: Đối số tùy chọn mới cadata

SSLContext.get_ca_certs(binary_form=False)

Nhận danh sách các chứng chỉ "cơ quan chứng nhận" (CA) đã tải. Nếu tham số binary_formFalse thì mỗi mục trong danh sách là một lệnh giống như đầu ra của SSLSocket.getpeercert(). Nếu không, phương thức sẽ trả về danh sách các chứng chỉ được mã hóa DER. Danh sách trả về không chứa chứng chỉ từ capath trừ khi chứng chỉ được yêu cầu và tải bởi kết nối SSL.

Ghi chú

Chứng chỉ trong thư mục capath không được tải trừ khi chúng được sử dụng ít nhất một lần.

Added in version 3.4.

SSLContext.get_ciphers()

Nhận danh sách các mật mã được kích hoạt. Danh sách được sắp xếp theo thứ tự ưu tiên của mật mã. Xem SSLContext.set_ciphers().

Ví dụ:

>>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
>>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA')
>>> ctx.get_ciphers()
[{'aad': Đúng,
  'alg_bits': 256,
  'auth': 'auth-rsa',
  'mô tả': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA '
                 'Enc=AESGCM(256) Mac=AEAD',
  'tiêu hóa': Không,
  'id': 50380848,
  'kea': 'kx-ecdhe',
  'tên': 'ECDHE-RSA-AES256-GCM-SHA384',
  'giao thức': 'TLSv1.2',
  'sức mạnh_bit': 256,
  'đối xứng': 'aes-256-gcm'},
 {'aad': Đúng,
  'alg_bits': 128,
  'auth': 'auth-rsa',
  'mô tả': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA '
                 'Enc=AESGCM(128) Mac=AEAD',
  'tiêu hóa': Không,
  'id': 50380847,
  'kea': 'kx-ecdhe',
  'tên': 'ECDHE-RSA-AES128-GCM-SHA256',
  'giao thức': 'TLSv1.2',
  'sức mạnh_bits': 128,
  'đối xứng': 'aes-128-gcm'}]

Added in version 3.6.

SSLContext.set_default_verify_paths()

Tải một bộ chứng chỉ "cơ quan chứng nhận" (CA) mặc định từ đường dẫn hệ thống tệp được xác định khi xây dựng thư viện OpenSSL. Thật không may, không có cách nào dễ dàng để biết liệu phương pháp này có thành công hay không: không có lỗi nào được trả về nếu không tìm thấy chứng chỉ nào. Tuy nhiên, khi thư viện OpenSSL được cung cấp như một phần của hệ điều hành, nó có thể được cấu hình đúng cách.

SSLContext.set_ciphers(ciphers, /)

Đặt mật mã có sẵn cho các ổ cắm được tạo bằng ngữ cảnh này. Nó phải là một chuỗi trong OpenSSL cipher list format. Nếu không thể chọn mật mã nào (vì tùy chọn thời gian biên dịch hoặc cấu hình khác cấm sử dụng tất cả các mật mã được chỉ định), SSLError sẽ được nâng lên.

Ghi chú

khi được kết nối, phương thức SSLSocket.cipher() của ổ cắm SSL sẽ cung cấp mật mã hiện được chọn.

Không thể tắt bộ mật mã TLS 1.3 bằng set_ciphers().

SSLContext.set_alpn_protocols(alpn_protocols)

Chỉ định giao thức nào ổ cắm sẽ quảng cáo trong quá trình bắt tay SSL/TLS. Nó phải là danh sách các chuỗi ASCII, như ['http/1.1', 'spdy/2'], được sắp xếp theo sở thích. Việc lựa chọn giao thức sẽ diễn ra trong quá trình bắt tay và sẽ diễn ra theo RFC 7301. Sau khi bắt tay thành công, phương thức SSLSocket.selected_alpn_protocol() sẽ trả về giao thức đã thỏa thuận.

Phương pháp này sẽ tăng NotImplementedError nếu HAS_ALPNFalse.

Added in version 3.5.

SSLContext.set_npn_protocols(npn_protocols)

Chỉ định giao thức nào ổ cắm sẽ quảng cáo trong quá trình bắt tay SSL/TLS. Nó phải là một danh sách các chuỗi, như ['http/1.1', 'spdy/2'], được sắp xếp theo sở thích. Việc lựa chọn giao thức sẽ diễn ra trong quá trình bắt tay và sẽ diễn ra theo Application Layer Protocol Negotiation. Sau khi bắt tay thành công, phương thức SSLSocket.selected_npn_protocol() sẽ trả về giao thức đã thỏa thuận.

Phương pháp này sẽ tăng NotImplementedError nếu HAS_NPNFalse.

Added in version 3.3.

Sắp loại bỏ từ phiên bản 3.10: NPN đã được thay thế bởi ALPN

SSLContext.sni_callback

Đăng ký một chức năng gọi lại sẽ được gọi sau khi máy chủ SSL/TLS nhận được tin nhắn bắt tay TLS Client Hello khi máy khách TLS chỉ định một chỉ báo tên máy chủ. Cơ chế chỉ báo tên máy chủ được chỉ định trong RFC 6066 phần 3 - Chỉ báo tên máy chủ.

Chỉ có thể đặt một lệnh gọi lại cho mỗi SSLContext. Nếu sni_callback được đặt thành None thì tính năng gọi lại sẽ bị tắt. Gọi hàm này lần sau sẽ vô hiệu hóa lệnh gọi lại đã đăng ký trước đó.

Hàm gọi lại sẽ được gọi với ba đối số; đầu tiên là ssl.SSLSocket, thứ hai là một chuỗi đại diện cho tên máy chủ mà máy khách đang có ý định giao tiếp (hoặc None nếu TLS Client Hello không chứa tên máy chủ) và đối số thứ ba là SSLContext ban đầu. Đối số tên máy chủ là văn bản. Đối với tên miền được quốc tế hóa, tên máy chủ là nhãn A IDN ("xn--pythn-mua.org").

Cách sử dụng điển hình của lệnh gọi lại này là thay đổi thuộc tính SSLSocket.context của ssl.SSLSocket thành một đối tượng mới thuộc loại SSLContext đại diện cho chuỗi chứng chỉ khớp với tên máy chủ.

Do giai đoạn đàm phán ban đầu của kết nối TLS nên chỉ có thể sử dụng được một số phương thức và thuộc tính hạn chế như SSLSocket.selected_alpn_protocol()SSLSocket.context. Các phương thức SSLSocket.getpeercert(), SSLSocket.get_verified_chain(), SSLSocket.get_unverified_chain() SSLSocket.cipher()SSLSocket.compression() yêu cầu kết nối TLS đã vượt quá TLS Client Hello và do đó sẽ không trả về các giá trị có ý nghĩa cũng như không thể gọi chúng một cách an toàn.

Hàm sni_callback phải trả về None để cho phép quá trình đàm phán TLS tiếp tục. Nếu cần phải có lỗi TLS thì có thể trả về ALERT_DESCRIPTION_* không đổi. Các giá trị trả về khác sẽ dẫn đến lỗi nghiêm trọng TLS với ALERT_DESCRIPTION_INTERNAL_ERROR.

Nếu một ngoại lệ được đưa ra từ chức năng sni_callback thì kết nối TLS sẽ chấm dứt với thông báo cảnh báo TLS nghiêm trọng ALERT_DESCRIPTION_HANDSHAKE_FAILURE.

Phương pháp này sẽ tăng NotImplementedError nếu thư viện OpenSSL có OPENSSL_NO_TLSEXT được xác định khi nó được xây dựng.

Added in version 3.7.

SSLContext.set_servername_callback(server_name_callback)

Đây là API kế thừa được giữ lại để tương thích ngược. Khi có thể, bạn nên sử dụng sni_callback để thay thế. server_name_callback đã cho tương tự như sni_callback, ngoại trừ khi tên máy chủ của máy chủ là tên miền quốc tế được mã hóa IDN, server_name_callback sẽ nhận được nhãn chữ U được giải mã ("pythön.org").

Nếu có lỗi giải mã trên tên máy chủ, kết nối TLS sẽ chấm dứt kèm theo thông báo cảnh báo TLS gây tử vong ALERT_DESCRIPTION_INTERNAL_ERROR cho máy khách.

Added in version 3.4.

SSLContext.load_dh_params(dhfile, /)

Tải các tham số tạo khóa cho trao đổi khóa Diffie-Hellman (DH). Việc sử dụng trao đổi khóa DH cải thiện tính bảo mật về phía trước với chi phí tài nguyên tính toán (cả trên máy chủ và máy khách). Tham số dhfile phải là đường dẫn đến tệp chứa tham số DH ở định dạng PEM.

Cài đặt này không áp dụng cho ổ cắm máy khách. Bạn cũng có thể sử dụng tùy chọn OP_SINGLE_DH_USE để cải thiện hơn nữa tính bảo mật.

Added in version 3.3.

SSLContext.set_ecdh_curve(curve_name, /)

Đặt tên đường cong cho trao đổi khóa Diffie-Hellman (ECDH) dựa trên đường cong Elliptic. ECDH nhanh hơn đáng kể so với DH thông thường trong khi vẫn được cho là an toàn. Tham số curve_name phải là một chuỗi mô tả đường cong elip phổ biến, ví dụ: prime256v1 cho đường cong được hỗ trợ rộng rãi.

Cài đặt này không áp dụng cho ổ cắm máy khách. Bạn cũng có thể sử dụng tùy chọn OP_SINGLE_ECDH_USE để cải thiện hơn nữa tính bảo mật.

Phương pháp này không khả dụng nếu HAS_ECDHFalse.

Added in version 3.3.

Xem thêm

SSL/TLS & Perfect Forward Secrecy

Vincent Bernat.

SSLContext.wrap_socket(sock, server_side=False, do_handshake_on_connect=True, suppress_ragged_eofs=True, server_hostname=None, session=None)

Gói một ổ cắm Python sock hiện có và trả về một phiên bản của SSLContext.sslsocket_class (SSLSocket mặc định). Ổ cắm SSL được trả về được gắn với ngữ cảnh, cài đặt và chứng chỉ của nó. sock phải là ổ cắm SOCK_STREAM; các loại ổ cắm khác không được hỗ trợ.

Tham số server_side là một boolean xác định xem hành vi phía máy chủ hay phía máy khách được mong muốn từ ổ cắm này.

Đối với các ổ cắm phía máy khách, việc xây dựng ngữ cảnh rất lười biếng; nếu ổ cắm bên dưới chưa được kết nối, việc xây dựng ngữ cảnh sẽ được thực hiện sau khi connect() được gọi trên ổ cắm. Đối với các ổ cắm phía máy chủ, nếu ổ cắm không có thiết bị ngang hàng từ xa thì nó được coi là một ổ cắm nghe và việc gói SSL phía máy chủ được thực hiện tự động trên các kết nối máy khách được chấp nhận thông qua phương thức accept(). Phương pháp này có thể tăng SSLError.

Trên các kết nối máy khách, tham số tùy chọn server_hostname chỉ định tên máy chủ của dịch vụ mà chúng tôi đang kết nối. Điều này cho phép một máy chủ lưu trữ nhiều dịch vụ dựa trên SSL với các chứng chỉ riêng biệt, khá giống với các máy chủ ảo HTTP. Việc chỉ định server_hostname sẽ tăng ValueError nếu server_side là đúng.

Tham số do_handshake_on_connect chỉ định có thực hiện bắt tay SSL một cách tự động sau khi thực hiện socket.connect() hay chương trình ứng dụng sẽ gọi nó một cách rõ ràng bằng cách gọi phương thức SSLSocket.do_handshake(). Việc gọi SSLSocket.do_handshake() một cách rõ ràng sẽ cung cấp cho chương trình quyền kiểm soát hành vi chặn của I/O socket liên quan đến quá trình bắt tay.

Tham số suppress_ragged_eofs chỉ định cách phương thức SSLSocket.recv() sẽ báo hiệu EOF không mong muốn từ đầu bên kia của kết nối. Nếu được chỉ định là True (mặc định), nó sẽ trả về một EOF bình thường (một đối tượng byte trống) để phản hồi các lỗi EOF không mong muốn phát sinh từ ổ cắm bên dưới; nếu False, nó sẽ đưa ra các ngoại lệ ngược lại cho người gọi.

session, xem session.

Để bọc một SSLSocket trong một SSLSocket khác, hãy sử dụng SSLContext.wrap_bio().

Thay đổi trong phiên bản 3.5: Luôn cho phép chuyển server_hostname, ngay cả khi OpenSSL không có SNI.

Thay đổi trong phiên bản 3.6: đối số session đã được thêm vào.

Thay đổi trong phiên bản 3.7: Phương thức này trả về một phiên bản của SSLContext.sslsocket_class thay vì SSLSocket được mã hóa cứng.

SSLContext.sslsocket_class

Kiểu trả về của SSLContext.wrap_socket(), mặc định là SSLSocket. Thuộc tính này có thể được gán cho các phiên bản của SSLContext để trả về một lớp con tùy chỉnh của SSLSocket.

Added in version 3.7.

SSLContext.wrap_bio(incoming, outgoing, server_side=False, server_hostname=None, session=None)

Bao bọc các đối tượng BIO incomingoutgoing và trả về một phiên bản của SSLContext.sslobject_class (SSLObject mặc định). Các quy trình SSL sẽ đọc dữ liệu đầu vào từ BIO đến và ghi dữ liệu vào BIO đi.

Các thông số server_side, server_hostnamesession đều có ý nghĩa tương tự như trong SSLContext.wrap_socket().

Thay đổi trong phiên bản 3.6: đối số session đã được thêm vào.

Thay đổi trong phiên bản 3.7: Phương thức này trả về một phiên bản của SSLContext.sslobject_class thay vì SSLObject được mã hóa cứng.

SSLContext.sslobject_class

Kiểu trả về của SSLContext.wrap_bio(), mặc định là SSLObject. Thuộc tính có thể được ghi đè trên phiên bản của lớp để trả về lớp con tùy chỉnh của SSLObject.

Added in version 3.7.

SSLContext.session_stats()

Nhận số liệu thống kê về các phiên SSL được tạo hoặc quản lý bởi bối cảnh này. Một từ điển được trả về sẽ ánh xạ tên của từng piece of information tới các giá trị số của chúng. Ví dụ: đây là tổng số lần truy cập và bỏ lỡ trong bộ đệm phiên kể từ khi ngữ cảnh được tạo:

>>> số liệu thống  = bối cảnh.session_stats()
>>> số liệu thống ['hit'], số liệu thống ['misses']
(0, 0)
SSLContext.check_hostname

Có khớp với tên máy chủ của chứng chỉ ngang hàng trong SSLSocket.do_handshake() hay không. verify_mode của ngữ cảnh phải được đặt thành CERT_OPTIONAL hoặc CERT_REQUIRED và bạn phải chuyển server_hostname đến wrap_socket() để khớp với tên máy chủ. Việc bật kiểm tra tên máy chủ sẽ tự động đặt verify_mode từ CERT_NONE thành CERT_REQUIRED. Nó không thể được đặt lại về CERT_NONE miễn là việc kiểm tra tên máy chủ được bật. Giao thức PROTOCOL_TLS_CLIENT cho phép kiểm tra tên máy chủ theo mặc định. Với các giao thức khác, việc kiểm tra tên máy chủ phải được bật rõ ràng.

Ví dụ:

 cắm nhập khẩu, ssl

bối cảnh = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
bối cảnh.verify_mode = ssl.CERT_REQUIRED
bối cảnh.check_hostname = Đúng
bối cảnh.load_default_certs()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')
ssl_sock.connect(('www.verisign.com', 443))

Added in version 3.4.

Thay đổi trong phiên bản 3.7: verify_mode hiện được tự động đổi thành CERT_REQUIRED khi bật tính năng kiểm tra tên máy chủ và verify_modeCERT_NONE. Trước đây thao tác tương tự có thể đã thất bại với ValueError.

SSLContext.keylog_filename

Ghi khóa TLS vào tệp keylog bất cứ khi nào tài liệu khóa được tạo hoặc nhận. Tệp keylog được thiết kế chỉ nhằm mục đích gỡ lỗi. Định dạng tệp được chỉ định bởi NSS và được nhiều nhà phân tích lưu lượng truy cập như Wireshark sử dụng. Tệp nhật ký được mở ở chế độ chỉ nối thêm. Việc ghi được đồng bộ hóa giữa các luồng, nhưng không được đồng bộ hóa giữa các tiến trình.

Added in version 3.8.

SSLContext.maximum_version

Thành viên enum TLSVersion đại diện cho phiên bản TLS được hỗ trợ cao nhất. Giá trị mặc định là TLSVersion.MAXIMUM_SUPPORTED. Thuộc tính này chỉ đọc cho các giao thức khác ngoài PROTOCOL_TLS, PROTOCOL_TLS_CLIENTPROTOCOL_TLS_SERVER.

Các thuộc tính maximum_version, minimum_versionSSLContext.options đều ảnh hưởng đến các phiên bản SSL và TLS của ngữ cảnh được hỗ trợ. Việc triển khai không ngăn chặn sự kết hợp không hợp lệ. Ví dụ: bối cảnh có OP_NO_TLSv1_2 trong optionsmaximum_version được đặt thành TLSVersion.TLSv1_2 sẽ không thể thiết lập kết nối TLS 1.2.

Added in version 3.7.

SSLContext.minimum_version

Giống như SSLContext.maximum_version ngoại trừ nó là phiên bản được hỗ trợ thấp nhất hoặc TLSVersion.MINIMUM_SUPPORTED.

Added in version 3.7.

SSLContext.num_tickets

Kiểm soát số lượng vé phiên TLS 1.3 của bối cảnh PROTOCOL_TLS_SERVER. Cài đặt này không ảnh hưởng đến kết nối TLS 1.0 đến 1.2.

Added in version 3.8.

SSLContext.options

Một số nguyên biểu thị tập hợp các tùy chọn SSL được bật trong ngữ cảnh này. Giá trị mặc định là OP_ALL, nhưng bạn có thể chỉ định các tùy chọn khác như OP_NO_SSLv2 bằng cách OR chúng lại với nhau.

Thay đổi trong phiên bản 3.6: SSLContext.options trả về cờ Options:

>>> ssl.create_default_context().options
<Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>

Sắp loại bỏ từ phiên bản 3.7: Tất cả các tùy chọn OP_NO_SSL*OP_NO_TLS* đều không được dùng nữa kể từ Python 3.7. Thay vào đó hãy sử dụng SSLContext.minimum_versionSSLContext.maximum_version.

SSLContext.post_handshake_auth

Bật xác thực ứng dụng khách sau bắt tay TLS 1.3. Xác thực sau bắt tay bị tắt theo mặc định và máy chủ chỉ có thể yêu cầu chứng chỉ ứng dụng khách TLS trong quá trình bắt tay ban đầu. Khi được bật, máy chủ có thể yêu cầu chứng chỉ ứng dụng khách TLS bất kỳ lúc nào sau khi bắt tay.

Khi được bật trên ổ cắm phía máy khách, máy khách sẽ báo hiệu cho máy chủ rằng nó hỗ trợ xác thực sau bắt tay.

Khi được bật trên ổ cắm phía máy chủ, SSLContext.verify_mode cũng phải được đặt thành CERT_OPTIONAL hoặc CERT_REQUIRED. Việc trao đổi chứng chỉ ứng dụng khách thực tế bị trì hoãn cho đến khi SSLSocket.verify_client_post_handshake() được gọi và một số thao tác I/O được thực hiện.

Added in version 3.8.

SSLContext.protocol

Phiên bản giao thức được chọn khi xây dựng bối cảnh. Thuộc tính này là chỉ đọc.

SSLContext.hostname_checks_common_name

Liệu check_hostname có quay lại xác minh tên chung của chủ đề của chứng chỉ trong trường hợp không có phần mở rộng tên thay thế chủ đề hay không (mặc định: true).

Added in version 3.7.

Thay đổi trong phiên bản 3.10: Cờ không có hiệu lực với OpenSSL trước phiên bản 1.1.1l. Python 3.8.9, 3.9.3 và 3.10 bao gồm các giải pháp thay thế cho các phiên bản trước.

SSLContext.security_level

Một số nguyên đại diện cho security level cho ngữ cảnh. Thuộc tính này là chỉ đọc.

Added in version 3.10.

SSLContext.verify_flags

Cờ cho hoạt động xác minh chứng chỉ. Bạn có thể đặt các cờ như VERIFY_CRL_CHECK_LEAF bằng cách OR chúng lại với nhau. Theo mặc định, OpenSSL không yêu cầu cũng như không xác minh danh sách thu hồi chứng chỉ (CRL).

Added in version 3.4.

Thay đổi trong phiên bản 3.6: SSLContext.verify_flags trả về cờ VerifyFlags:

>>> ssl.create_default_context().verify_flags
<VerifyFlags.VERIFY_X509_TRUSTED_FIRST: 32768>
SSLContext.verify_mode

Có nên thử xác minh chứng chỉ của các đồng nghiệp khác hay không và cách xử lý nếu xác minh không thành công. Thuộc tính này phải là một trong CERT_NONE, CERT_OPTIONAL hoặc CERT_REQUIRED.

Thay đổi trong phiên bản 3.6: SSLContext.verify_mode trả về VerifyMode enum:

>>> ssl.create_default_context().verify_mode
<VerifyMode.CERT_REQUIRED: 2>
SSLContext.set_psk_client_callback(callback)

Bật xác thực TLS-PSK (khóa chia sẻ trước) trên kết nối phía máy khách.

Nói chung, xác thực dựa trên chứng chỉ nên được ưu tiên hơn phương pháp này.

Tham số callback là một đối tượng có thể gọi được với chữ ký: def callback(hint: str | None) -> tuple[str | None, bytes]. Tham số hint là gợi ý nhận dạng tùy chọn được gửi bởi máy chủ. Giá trị trả về là một bộ dữ liệu có dạng (client-identity, psk). Nhận dạng khách hàng là một chuỗi tùy chọn có thể được máy chủ sử dụng để chọn PSK tương ứng cho khách hàng. Chuỗi phải nhỏ hơn hoặc bằng octet 256 khi được mã hóa UTF-8. PSK là bytes-like object đại diện cho khóa chia sẻ trước. Trả về PSK có độ dài bằng 0 để từ chối kết nối.

Việc đặt callback thành None sẽ xóa mọi lệnh gọi lại hiện có.

Ghi chú

Khi sử dụng TLS 1.3:

  • tham số hint luôn là None.

  • danh tính khách hàng phải là một chuỗi không trống.

Ví dụ sử dụng:

bối cảnh = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = Sai
bối cảnh.verify_mode = ssl.CERT_NONE
bối cảnh.maximum_version = ssl.TLSVersion.TLSv1_2
bối cảnh.set_ciphers('PSK')

# A lambda đơn giản:
psk = bytes.fromhex('c0ffee')
context.set_psk_client_callback(gợi ý lambda: (Không , psk))

bảng # A sử dụng gợi ý từ máy chủ:
psk_table = { 'ServerId_1': bytes.fromhex('c0ffee'),
              'ServerId_2': bytes.fromhex('mặt tiền')
}
gọi lại def (gợi ý):
    trả về 'ClientId_1', psk_table.get(hint, b'')
context.set_psk_client_callback(gọi lại)

Phương pháp này sẽ tăng NotImplementedError nếu HAS_PSKFalse.

Added in version 3.13.

SSLContext.set_psk_server_callback(callback, identity_hint=None)

Bật xác thực TLS-PSK (khóa chia sẻ trước) trên kết nối phía máy chủ.

Nói chung, xác thực dựa trên chứng chỉ nên được ưu tiên hơn phương pháp này.

Tham số callback là một đối tượng có thể gọi được với chữ ký: def callback(identity: str | None) -> bytes. Tham số identity là thông tin nhận dạng tùy chọn do khách hàng gửi, có thể được sử dụng để chọn PSK tương ứng. Giá trị trả về là bytes-like object đại diện cho khóa chia sẻ trước. Trả về PSK có độ dài bằng 0 để từ chối kết nối.

Việc đặt callback thành None sẽ xóa mọi lệnh gọi lại hiện có.

Tham số identity_hint là chuỗi gợi ý nhận dạng tùy chọn được gửi tới máy khách. Chuỗi phải nhỏ hơn hoặc bằng octet 256 khi được mã hóa UTF-8.

Ghi chú

Khi sử dụng TLS 1.3, tham số identity_hint không được gửi tới máy khách.

Ví dụ sử dụng:

bối cảnh = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
bối cảnh.maximum_version = ssl.TLSVersion.TLSv1_2
bối cảnh.set_ciphers('PSK')

# A lambda đơn giản:
psk = bytes.fromhex('c0ffee')
context.set_psk_server_callback(danh tính lambda: psk)

bảng # A sử dụng danh tính của khách hàng:
psk_table = { 'ClientId_1': bytes.fromhex('c0ffee'),
              'ClientId_2': bytes.fromhex('mặt tiền')
}
gọi lại def (danh tính):
    trả về psk_table.get(danh tính, b'')
context.set_psk_server_callback(gọi lại, 'ServerId_1')

Phương pháp này sẽ tăng NotImplementedError nếu HAS_PSKFalse.

Added in version 3.13.

Chứng chỉ

Chứng chỉ nói chung là một phần của hệ thống khóa chung/khóa riêng. Trong hệ thống này, mỗi principal, (có thể là một máy, một người hoặc một tổ chức) được gán một khóa mã hóa hai phần duy nhất. Một phần của khóa được công khai và được gọi là public key; phần còn lại được giữ bí mật và được gọi là private key. Hai phần có liên quan với nhau, trong đó nếu bạn mã hóa tin nhắn bằng một trong các phần, bạn có thể giải mã nó bằng phần kia và only với phần còn lại.

Chứng chỉ chứa thông tin về hai hiệu trưởng. Nó chứa tên của subject và khóa chung của chủ thể. Nó cũng chứa tuyên bố của hiệu trưởng thứ hai, issuer, rằng chủ thể là người mà họ tuyên bố là ai và đây thực sự là khóa chung của chủ thể. Tuyên bố của tổ chức phát hành được ký bằng khóa riêng của tổ chức phát hành mà chỉ có tổ chức phát hành mới biết. Tuy nhiên, bất kỳ ai cũng có thể xác minh tuyên bố của nhà phát hành bằng cách tìm khóa chung của nhà phát hành, giải mã tuyên bố đó và so sánh nó với thông tin khác trong chứng chỉ. Chứng chỉ cũng chứa thông tin về khoảng thời gian mà nó có hiệu lực. Điều này được thể hiện dưới dạng hai trường, được gọi là "notBefore" và "notAfter".

Trong việc sử dụng chứng chỉ Python, máy khách hoặc máy chủ có thể sử dụng chứng chỉ để chứng minh họ là ai. Phía bên kia của kết nối mạng cũng có thể được yêu cầu tạo chứng chỉ và chứng chỉ đó có thể được xác thực theo sự hài lòng của máy khách hoặc máy chủ yêu cầu xác thực đó. Nỗ lực kết nối có thể được đặt để đưa ra một ngoại lệ nếu xác thực không thành công. Việc xác thực được thực hiện tự động bằng khung OpenSSL cơ bản; ứng dụng không cần phải quan tâm đến cơ chế của nó. Tuy nhiên, ứng dụng thường cần cung cấp bộ chứng chỉ để cho phép quá trình này diễn ra.

Python sử dụng các tệp để chứa chứng chỉ. Chúng phải được định dạng là "PEM" (xem RFC 1422), là dạng được mã hóa cơ sở 64 được bao bọc bởi một dòng tiêu đề và một dòng chân trang:

-----BEGIN CERTIFICATE------
... (chứng chỉ  hóa base64 PEM) ...
-----END CERTIFICATE------

Chuỗi chứng chỉ

Các tệp Python chứa chứng chỉ có thể chứa một chuỗi chứng chỉ, đôi khi được gọi là certificate chain. Chuỗi này phải bắt đầu bằng chứng chỉ cụ thể cho người đứng đầu "là" máy khách hoặc máy chủ, sau đó là chứng chỉ cho người phát hành chứng chỉ đó, sau đó là chứng chỉ cho người phát hành chứng chỉ that, v.v. tiếp tục chuỗi cho đến khi bạn nhận được chứng chỉ là self-signed, tức là chứng chỉ có cùng chủ đề và tổ chức phát hành, đôi khi được gọi là root certificate. Các chứng chỉ chỉ nên được nối với nhau trong tệp chứng chỉ. Ví dụ: giả sử chúng tôi có chuỗi ba chứng chỉ, từ chứng chỉ máy chủ của chúng tôi đến chứng chỉ của cơ quan chứng nhận đã ký chứng chỉ máy chủ của chúng tôi, đến chứng chỉ gốc của cơ quan cấp chứng chỉ của cơ quan chứng nhận:

-----BEGIN CERTIFICATE------
... (chứng chỉ cho máy chủ của bạn)...
-----END CERTIFICATE------
-----BEGIN CERTIFICATE------
... (chứng chỉ cho CA)...
-----END CERTIFICATE------
-----BEGIN CERTIFICATE------
... (chứng chỉ gốc dành cho tổ chức phát hành CA)...
-----END CERTIFICATE------

Chứng chỉ CA

Nếu bạn định yêu cầu xác thực mặt kia của chứng chỉ kết nối, bạn cần cung cấp tệp "Chứng chỉ CA", chứa đầy chuỗi chứng chỉ cho từng nhà phát hành mà bạn sẵn sàng tin tưởng. Một lần nữa, tập tin này chỉ chứa các chuỗi này được nối với nhau. Để xác thực, Python sẽ sử dụng chuỗi đầu tiên nó tìm thấy trong tệp khớp. Tệp chứng chỉ của nền tảng có thể được sử dụng bằng cách gọi SSLContext.load_default_certs(), việc này được thực hiện tự động với create_default_context().

Khóa và chứng chỉ kết hợp

Thông thường, khóa riêng được lưu trữ trong cùng tệp với chứng chỉ; trong trường hợp này, chỉ cần chuyển tham số certfile tới SSLContext.load_cert_chain(). Nếu khóa riêng được lưu trữ cùng với chứng chỉ thì nó sẽ xuất hiện trước chứng chỉ đầu tiên trong chuỗi chứng chỉ:

-----BEGIN RSA PRIVATE KEY----
... (khóa riêng trong  hóa base64) ...
-----END RSA PRIVATE KEY------
-----BEGIN CERTIFICATE------
... (chứng chỉ  hóa base64 PEM) ...
-----END CERTIFICATE------

Chứng chỉ tự ký

Nếu định tạo một máy chủ cung cấp dịch vụ kết nối được mã hóa SSL, bạn sẽ cần phải có chứng chỉ cho dịch vụ đó. Có nhiều cách để có được chứng chỉ phù hợp, chẳng hạn như mua chứng chỉ từ cơ quan chứng nhận. Một cách phổ biến khác là tạo chứng chỉ tự ký. Cách đơn giản nhất để thực hiện việc này là sử dụng gói OpenSSL, sử dụng nội dung như sau:

% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
Tạo khóa riêng RSA 1024 bit
......++++++
............++++++
viết khóa riêng mới vào 'cert.pem'
-----
Bạn sắp được yêu cầu nhập thông tin sẽ được kết hợp
vào yêu cầu chứng chỉ của bạn.
Những  bạn sắp nhập được gọi  Tên phân biệt hoặc DN.
 khá nhiều trường nhưng bạn  thể để trống một số trường
Đối với một số trường sẽ  giá trị mặc định,
Nếu bạn nhập '.', trường này sẽ bị bỏ trống.
-----
Tên quốc gia ( 2 chữ cái) [AU]:US
Tên tiểu bang hoặc tỉnh (tên đầy đủ) [Some-State]:MyState
Tên địa phương ( dụ: thành phố) []:Thành phố nào đó
Tên tổ chức ( dụ: công ty) [Internet Widgits Pty Ltd]:My Organisation, Inc.
Tên đơn vị tổ chức ( dụ: phần) []: Nhóm của tôi
Tên thường gọi ( dụ: tên YOUR) []:myserver.mygroup.my Organisation.com
Địa chỉ Email []:ops@myserver.mygroup.my Organisation.com
%

Nhược điểm của chứng chỉ tự ký là nó là chứng chỉ gốc của riêng nó và sẽ không có ai khác có nó trong bộ nhớ đệm của các chứng chỉ gốc đã biết (và đáng tin cậy).

Ví dụ

Đang thử nghiệm hỗ trợ SSL

Để kiểm tra sự hiện diện của hỗ trợ SSL trong bản cài đặt Python, mã người dùng nên sử dụng thành ngữ sau

thử:
    nhập khẩu ssl
ngoại trừ lỗi nhập khẩu:
    vượt qua
khác:
    ... # do cái gì đó cần sự hỗ trợ của SSL

Hoạt động phía khách hàng

Ví dụ này tạo ngữ cảnh SSL với các cài đặt bảo mật được đề xuất cho ổ cắm máy khách, bao gồm xác minh chứng chỉ tự động:

>>> bối cảnh = ssl.create_default_context()

Nếu bạn muốn tự mình điều chỉnh cài đặt bảo mật, bạn có thể tạo ngữ cảnh từ đầu (nhưng hãy lưu ý rằng bạn có thể không cài đặt đúng):

>>> bối cảnh = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")

(đoạn mã này giả sử hệ điều hành của bạn đặt một nhóm tất cả chứng chỉ CA vào /etc/ssl/certs/ca-bundle.crt; nếu không, bạn sẽ gặp lỗi và phải điều chỉnh vị trí)

Giao thức PROTOCOL_TLS_CLIENT định cấu hình bối cảnh để xác thực chứng chỉ và xác minh tên máy chủ. verify_mode được đặt thành CERT_REQUIREDcheck_hostname được đặt thành True. Tất cả các giao thức khác đều tạo bối cảnh SSL với các giá trị mặc định không an toàn.

Khi bạn sử dụng ngữ cảnh để kết nối với máy chủ, CERT_REQUIREDcheck_hostname sẽ xác thực chứng chỉ máy chủ: nó đảm bảo rằng chứng chỉ máy chủ đã được ký bằng một trong các chứng chỉ CA, kiểm tra tính chính xác của chữ ký và xác minh các thuộc tính khác như tính hợp lệ và danh tính của tên máy chủ:

>>> conn = context.wrap_socket(socket.socket(socket.AF_INET),
... server_hostname="www.python.org")
>>> conn.connect(("www.python.org", 443))

Sau đó bạn có thể lấy chứng chỉ:

>>> cert = conn.getpeercert()

Kiểm tra trực quan cho thấy chứng chỉ xác định dịch vụ mong muốn (nghĩa là máy chủ HTTPS www.python.org):

>>> pprint.pprint(cert)
{'OCSP': ('http://ocsp.digicert.com',),
 'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),
 'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',
                           'http://crl4.digicert.com/sha2-ev-server-g1.crl'),
 'nhà phát hành': ((('countryName', 'US'),),
            (('tên tổ chức', 'DigiCert Inc'),),
            (('tên đơn vị tổ chức', 'www.digicert.com'),),
            (('commonName', 'DigiCert SHA2 CA máy chủ xác thực mở rộng'),)),
 'notAfter': 'Ngày 9 tháng 9 12:00:00 2016 GMT',
 'notBefore': 'Ngày 5 tháng 9 00:00:00 2014 GMT',
 'Số sê-ri': '01BB6F00122B177F36CAB49CEA8B6B26',
 'chủ đề': ((('danh mục kinh doanh', 'Tổ chức tư nhân'),),
             (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),
             (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),
             (('Số sê-ri', '3359300'),),
             (('streetAddress', '16 Allen Rd'),),
             (('Mã bưu chính', '03894-4801'),),
             (('tên quốc gia', 'US'),),
             (('stateOrProvinceName', 'NH'),),
             (('localityName', 'Wolfeboro'),),
             (('tên tổ chức', 'Tổ chức phần mềm Python'),),
             (('commonName', 'www.python.org'),)),
 'subjectAltName': (('DNS', 'www.python.org'),
                    ('DNS', 'python.org'),
                    ('DNS', 'pypi.org'),
                    ('DNS', 'docs.python.org'),
                    ('DNS', 'testpypi.org'),
                    ('DNS', 'bugs.python.org'),
                    ('DNS', 'wiki.python.org'),
                    ('DNS', 'hg.python.org'),
                    ('DNS', 'mail.python.org'),
                    ('DNS', 'packaging.python.org'),
                    ('DNS', 'pythonhosted.org'),
                    ('DNS', 'www.pythonhosted.org'),
                    ('DNS', 'test.pythonhosted.org'),
                    ('DNS', 'us.pycon.org'),
                    ('DNS', 'id.python.org')),
 'phiên bản': 3}

Bây giờ kênh SSL đã được thiết lập và chứng chỉ đã được xác minh, bạn có thể tiến hành trò chuyện với máy chủ:

>>> conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")
>>> pprint.pprint(conn.recv(1024).split(b"\r\n"))
[b'HTTP/1.1 200 OK',
 b'Ngày: Thứ bảy, 18/10/2014 18:27:20 GMT',
 b'Server: nginx',
 b'Content-Type: text/html; bộ ký tự=utf-8',
 b'X-Frame-Options: SAMEORIGIN',
 b'Độ dài nội dung: 45679',
 b'Phạm vi chấp nhận: byte',
 b'Via: 1,1 vecni',
 b'Tuổi: 2188',
 b'X-Served-By: cache-lcy1134-LCY',
 b'X-Cache: HIT',
 b'X-Cache-Số lần truy cập: 11',
 b'Vary: Cookie',
 b'Strict-Transport-Security: max-age=63072000; bao gồm các tên miền phụ',
 b'Kết nối: đóng',
 b'',
 b'']

Xem phần thảo luận về Cân nhắc về bảo mật bên dưới.

Hoạt động phía máy chủ

Để vận hành máy chủ, thông thường bạn cần phải có chứng chỉ máy chủ và khóa riêng, mỗi chứng chỉ trong một tệp. Trước tiên, bạn sẽ tạo ngữ cảnh chứa khóa và chứng chỉ để khách hàng có thể kiểm tra tính xác thực của bạn. Sau đó, bạn sẽ mở một ổ cắm, liên kết nó với một cổng, gọi listen() trên đó và bắt đầu chờ khách hàng kết nối

 cắm nhập khẩu, ssl

bối cảnh = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile")

bindsocket = socket.socket()
bindsocket.bind(('myaddr.example.com', 10023))
bindsocket.listen(5)

Khi máy khách kết nối, bạn sẽ gọi accept() trên ổ cắm để lấy ổ cắm mới từ đầu bên kia và sử dụng phương thức SSLContext.wrap_socket() của ngữ cảnh để tạo ổ cắm SSL phía máy chủ cho kết nối:

trong khi Đúng:
    newsocket, fromaddr = bindsocket.accept()
    connstream = context.wrap_socket(newsocket, server_side=True)
    thử:
        deal_with_client(connstream)
    cuối cùng:
        connstream.shutdown(socket.SHUT_RDWR)
        connstream.close()

Sau đó, bạn sẽ đọc dữ liệu từ connstream và thực hiện điều gì đó với nó cho đến khi bạn hoàn tất với ứng dụng khách (hoặc ứng dụng khách đã hoàn tất với bạn):

def deal_with_client(connstream):
    dữ liệu = connstream.recv(1024)
    Dữ liệu # empty có nghĩa là khách hàng đã kết thúc với chúng tôi
    trong khi dữ liệu:
        nếu không phải do_something(connstream, data):
            # we sẽ cho rằng do_something trả về Sai
            # when chúng ta đã xong việc với khách hàng rồi
            phá vỡ
        dữ liệu = connstream.recv(1024)
    # finished với khách hàng

Và quay lại lắng nghe các kết nối máy khách mới (tất nhiên, một máy chủ thực sự có thể sẽ xử lý từng kết nối máy khách trong một luồng riêng biệt hoặc đặt các ổ cắm vào non-blocking mode và sử dụng vòng lặp sự kiện).

Lưu ý về ổ cắm không chặn

Ổ cắm SSL hoạt động hơi khác so với ổ cắm thông thường ở chế độ không chặn. Do đó, khi làm việc với các ổ cắm không chặn, có một số điều bạn cần lưu ý:

  • Hầu hết các phương thức SSLSocket sẽ tăng SSLWantWriteError hoặc SSLWantReadError thay vì BlockingIOError nếu thao tác I/O bị chặn. SSLWantReadError sẽ được nâng lên nếu cần có thao tác đọc trên ổ cắm bên dưới và SSLWantWriteError cho thao tác ghi trên ổ cắm bên dưới. Lưu ý rằng việc cố gắng write vào ổ cắm SSL trước tiên có thể yêu cầu reading từ ổ cắm bên dưới và việc cố gắng read từ ổ cắm SSL có thể yêu cầu write trước đó vào ổ cắm bên dưới.

    Thay đổi trong phiên bản 3.5: Trong các phiên bản Python trước đó, phương thức SSLSocket.send() trả về 0 thay vì tăng SSLWantWriteError hoặc SSLWantReadError.

  • Việc gọi select() sẽ cho bạn biết rằng ổ cắm cấp hệ điều hành có thể được đọc từ (hoặc ghi vào), nhưng điều đó không ngụ ý rằng có đủ dữ liệu ở lớp SSL phía trên. Ví dụ: chỉ một phần của khung SSL có thể đã đến. Do đó, bạn phải sẵn sàng xử lý các lỗi SSLSocket.recv()SSLSocket.send(), đồng thời thử lại sau một lệnh gọi khác tới select().

  • Ngược lại, vì lớp SSL có khung riêng nên ổ cắm SSL vẫn có thể có sẵn dữ liệu để đọc mà select() không biết về điều đó. Do đó, trước tiên bạn nên gọi SSLSocket.recv() để rút hết mọi dữ liệu có thể có, sau đó chỉ chặn cuộc gọi select() nếu vẫn cần thiết.

    (tất nhiên, các quy định tương tự cũng được áp dụng khi sử dụng các nguyên hàm khác như poll() hoặc các quy định trong mô-đun selectors)

  • Bản thân quá trình bắt tay SSL sẽ không bị chặn: phương thức SSLSocket.do_handshake() phải được thử lại cho đến khi nó trả về thành công. Đây là bản tóm tắt sử dụng select() để chờ ổ cắm sẵn sàng

    trong khi Đúng:
        thử:
            sock.do_handshake()
            phá vỡ
        ngoại trừ ssl.SSLWantReadError:
            select.select([sock], [], [])
        ngoại trừ ssl.SSLWantWriteError:
            select.select([], [sock], [])
    

Xem thêm

Mô-đun asyncio hỗ trợ non-blocking SSL sockets và cung cấp Streams API cấp cao hơn. Nó thăm dò các sự kiện bằng cách sử dụng mô-đun selectors và xử lý các ngoại lệ SSLWantWriteError, SSLWantReadErrorBlockingIOError. Nó cũng chạy bắt tay SSL không đồng bộ.

Hỗ trợ bộ nhớ BIO

Added in version 3.5.

Kể từ khi mô-đun SSL được giới thiệu trong Python 2.6, lớp SSLSocket đã cung cấp hai lĩnh vực chức năng có liên quan nhưng khác biệt:

  • xử lý giao thức SSL

  • Mạng IO

Mạng IO API giống hệt với mạng do socket.socket cung cấp, từ đó SSLSocket cũng kế thừa. Điều này cho phép sử dụng ổ cắm SSL để thay thế cho ổ cắm thông thường, giúp việc thêm hỗ trợ SSL vào ứng dụng hiện có trở nên rất dễ dàng.

Việc kết hợp xử lý giao thức SSL và IO mạng thường hoạt động tốt, nhưng có một số trường hợp thì không. Một ví dụ là các khung IO không đồng bộ muốn sử dụng mô hình ghép kênh IO khác với mô hình "chọn/thăm dò ý kiến ​​​​trên bộ mô tả tệp" (dựa trên mức độ sẵn sàng) được giả định bởi socket.socket và bởi các quy trình IO của ổ cắm OpenSSL nội bộ. Điều này chủ yếu phù hợp với các nền tảng như Windows nơi mô hình này không hiệu quả. Với mục đích này, một biến thể phạm vi thu gọn của SSLSocket được gọi là SSLObject được cung cấp.

class ssl.SSLObject

Một biến thể phạm vi thu gọn của SSLSocket đại diện cho một phiên bản giao thức SSL không chứa bất kỳ phương thức IO mạng nào. Lớp này thường được sử dụng bởi các tác giả khung muốn triển khai IO không đồng bộ cho SSL thông qua bộ đệm.

Lớp này triển khai một giao diện trên đối tượng SSL cấp thấp do OpenSSL triển khai. Đối tượng này ghi lại trạng thái của kết nối SSL nhưng không cung cấp bất kỳ IO mạng nào. IO cần được thực hiện thông qua các đối tượng "BIO" riêng biệt là lớp trừu tượng IO của OpenSSL.

Lớp này không có hàm tạo công khai. Một phiên bản SSLObject phải được tạo bằng phương thức wrap_bio(). Phương thức này sẽ tạo phiên bản SSLObject và liên kết nó với một cặp BIO. incoming BIO được sử dụng để truyền dữ liệu từ Python sang phiên bản giao thức SSL, trong khi outgoing BIO được sử dụng để truyền dữ liệu theo cách ngược lại.

Các phương pháp sau đây có sẵn:

Khi so sánh với SSLSocket, đối tượng này thiếu các tính năng sau:

  • Bất kỳ hình thức IO mạng nào; recv()send() chỉ đọc và ghi vào bộ đệm MemoryBIO cơ bản.

  • Không có máy móc do_handshake_on_connect. Bạn phải luôn gọi do_handshake() theo cách thủ công để bắt đầu bắt tay.

  • Không có cách xử lý suppress_ragged_eofs. Tất cả các điều kiện cuối tệp vi phạm giao thức đều được báo cáo thông qua ngoại lệ SSLEOFError.

  • Cuộc gọi phương thức unwrap() không trả về bất cứ thứ gì, không giống như ổ cắm SSL nơi nó trả về ổ cắm bên dưới.

  • Lệnh gọi lại server_name_callback được chuyển tới SSLContext.set_servername_callback() sẽ nhận được phiên bản SSLObject thay vì phiên bản SSLSocket làm tham số đầu tiên.

Một số lưu ý liên quan đến việc sử dụng SSLObject:

Thay đổi trong phiên bản 3.7: Các phiên bản SSLObject phải được tạo bằng wrap_bio(). Trong các phiên bản trước, có thể tạo phiên bản trực tiếp. Điều này chưa bao giờ được ghi lại hoặc được hỗ trợ chính thức.

SSLObject giao tiếp với thế giới bên ngoài bằng bộ nhớ đệm. Lớp MemoryBIO cung cấp bộ nhớ đệm có thể được sử dụng cho mục đích này. Nó bao bọc một đối tượng BIO bộ nhớ OpenSSL (IO cơ bản):

class ssl.MemoryBIO

Bộ nhớ đệm có thể được sử dụng để truyền dữ liệu giữa Python và phiên bản giao thức SSL.

pending

Trả về số byte hiện có trong bộ nhớ đệm.

eof

Một boolean cho biết liệu bộ nhớ BIO có hiện tại ở vị trí cuối tệp hay không.

read(n=-1, /)

Đọc tới n byte từ bộ nhớ đệm. Nếu n không được chỉ định hoặc âm, tất cả byte sẽ được trả về.

write(buf, /)

Ghi các byte từ buf vào bộ nhớ BIO. Đối số buf phải là đối tượng hỗ trợ giao thức bộ đệm.

Giá trị trả về là số byte được ghi, luôn bằng độ dài của buf.

write_eof()

Viết điểm đánh dấu EOF vào bộ nhớ BIO. Sau khi phương thức này được gọi, việc gọi write() là bất hợp pháp. Thuộc tính eof sẽ trở thành true sau khi tất cả dữ liệu hiện có trong bộ đệm đã được đọc.

phiên SSL

Added in version 3.6.

class ssl.SSLSession

Đối tượng phiên được sử dụng bởi session.

id
time
timeout
ticket_lifetime_hint
has_ticket

Cân nhắc về bảo mật

Mặc định tốt nhất

Đối với client use, nếu bạn không có bất kỳ yêu cầu đặc biệt nào đối với chính sách bảo mật của mình, bạn nên sử dụng chức năng create_default_context() để tạo ngữ cảnh SSL của mình. Nó sẽ tải các chứng chỉ CA đáng tin cậy của hệ thống, cho phép xác thực chứng chỉ và kiểm tra tên máy chủ, đồng thời cố gắng chọn cài đặt mật mã và giao thức an toàn hợp lý.

Ví dụ: đây là cách bạn sử dụng lớp smtplib.SMTP để tạo kết nối an toàn, đáng tin cậy đến máy chủ SMTP:

>>> nhập ssl, smtplib
>>> smtp = smtplib.SMTP("mail.python.org", port=587)
>>> bối cảnh = ssl.create_default_context()
>>> smtp.starttls(context=context)
(220, b'2.0.0 Sẵn sàng khởi động TLS')

Nếu cần có chứng chỉ ứng dụng khách cho kết nối, bạn có thể thêm chứng chỉ đó bằng SSLContext.load_cert_chain().

Ngược lại, nếu bạn tạo ngữ cảnh SSL bằng cách tự gọi hàm tạo SSLContext, nó sẽ không bật xác thực chứng chỉ cũng như kiểm tra tên máy chủ theo mặc định. Nếu bạn làm như vậy, vui lòng đọc các đoạn bên dưới để đạt được mức độ bảo mật tốt.

Cài đặt thủ công

Xác minh chứng chỉ

Khi gọi trực tiếp hàm tạo SSLContext, CERT_NONE là mặc định. Vì nó không xác thực thiết bị ngang hàng khác nên nó có thể không an toàn, đặc biệt là ở chế độ máy khách, nơi mà hầu hết thời gian bạn muốn đảm bảo tính xác thực của máy chủ mà bạn đang nói chuyện. Vì vậy, khi ở chế độ máy khách, chúng tôi khuyên bạn nên sử dụng CERT_REQUIRED. Tuy nhiên, tự nó thôi thì chưa đủ; bạn cũng phải kiểm tra xem chứng chỉ máy chủ, có thể lấy được bằng cách gọi SSLSocket.getpeercert(), có khớp với dịch vụ mong muốn hay không. Đối với nhiều giao thức và ứng dụng, dịch vụ có thể được xác định bằng tên máy chủ. Việc kiểm tra chung này được thực hiện tự động khi SSLContext.check_hostname được bật.

Thay đổi trong phiên bản 3.7: Việc khớp tên máy chủ hiện được thực hiện bởi OpenSSL. Python không còn sử dụng match_hostname() nữa.

Ở chế độ máy chủ, nếu muốn xác thực ứng dụng khách của mình bằng lớp SSL (thay vì sử dụng cơ chế xác thực cấp cao hơn), bạn cũng sẽ phải chỉ định CERT_REQUIRED và kiểm tra chứng chỉ ứng dụng khách theo cách tương tự.

Phiên bản giao thức

SSL phiên bản 2 và 3 được coi là không an toàn và do đó rất nguy hiểm khi sử dụng. Nếu bạn muốn khả năng tương thích tối đa giữa máy khách và máy chủ, bạn nên sử dụng PROTOCOL_TLS_CLIENT hoặc PROTOCOL_TLS_SERVER làm phiên bản giao thức. SSLv2 và SSLv3 bị tắt theo mặc định.

>>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> client_context.minimum_version = ssl.TLSVersion.TLSv1_3
>>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3

Ngữ cảnh SSL được tạo ở trên sẽ chỉ cho phép kết nối TLSv1.3 trở lên (nếu được hệ thống của bạn hỗ trợ) với máy chủ. PROTOCOL_TLS_CLIENT ngụ ý xác thực chứng chỉ và kiểm tra tên máy chủ theo mặc định. Bạn phải tải chứng chỉ vào ngữ cảnh.

Lựa chọn mật mã

Nếu bạn có các yêu cầu bảo mật nâng cao, bạn có thể tinh chỉnh mật mã được kích hoạt khi đàm phán phiên SSL thông qua phương pháp SSLContext.set_ciphers(). Bắt đầu từ Python 3.2.3, mô-đun ssl sẽ vô hiệu hóa một số mật mã yếu nhất định theo mặc định, nhưng bạn có thể muốn hạn chế hơn nữa việc lựa chọn mật mã. Hãy nhớ đọc tài liệu của OpenSSL về cipher list format. Nếu bạn muốn kiểm tra mật mã nào được kích hoạt bởi danh sách mật mã nhất định, hãy sử dụng lệnh SSLContext.get_ciphers() hoặc openssl ciphers trên hệ thống của bạn.

Đa xử lý

Nếu sử dụng mô-đun này như một phần của ứng dụng đa xử lý (ví dụ: sử dụng mô-đun multiprocessing hoặc concurrent.futures), hãy lưu ý rằng trình tạo số ngẫu nhiên bên trong của OpenSSL không xử lý đúng cách các quy trình phân nhánh. Các ứng dụng phải thay đổi trạng thái PRNG của tiến trình gốc nếu chúng sử dụng bất kỳ tính năng SSL nào với os.fork(). Bất kỳ lệnh gọi RAND_add() hoặc RAND_bytes() thành công nào cũng đủ.

TLS 1.3

Added in version 3.7.

Giao thức TLS 1.3 hoạt động hơi khác so với phiên bản TLS/SSL trước đó. Một số tính năng mới của TLS 1.3 vẫn chưa có.

  • TLS 1.3 sử dụng một bộ mật mã riêng biệt. Tất cả các bộ mật mã AES-GCM và ChaCha20 đều được bật theo mặc định. Phương thức SSLContext.set_ciphers() chưa thể bật hoặc tắt bất kỳ mật mã TLS 1.3 nào, nhưng SSLContext.get_ciphers() trả về chúng.

  • Vé phiên không còn được gửi như một phần của quá trình bắt tay ban đầu nữa và được xử lý theo cách khác. SSLSocket.sessionSSLSession không tương thích với TLS 1.3.

  • Chứng chỉ phía máy khách cũng không còn được xác minh trong quá trình bắt tay ban đầu. Máy chủ có thể yêu cầu chứng chỉ bất kỳ lúc nào. Khách hàng xử lý các yêu cầu chứng chỉ trong khi họ gửi hoặc nhận dữ liệu ứng dụng từ máy chủ.

  • Các tính năng của TLS 1.3 như dữ liệu ban đầu, yêu cầu chứng chỉ ứng dụng khách TLS bị trì hoãn, cấu hình thuật toán chữ ký và khóa lại chưa được hỗ trợ.