Ca chứng chỉ trăn

Thư viện chuẩn Python bao gồm nhiều mô-đun cung cấp chức năng máy khách HTTP, bao gồm httplib, urllib, urllib2

$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
0. Mặc dù các mô-đun này hỗ trợ kết nối HTTPS, nhưng theo truyền thống, chúng không thực hiện xác minh chứng chỉ do máy chủ HTTPS cung cấp và không cung cấp cách nào để dễ dàng kích hoạt xác minh đó. Điều này có thể cho phép kẻ tấn công Man-In-The-Middle [MITM] dễ dàng chiếm quyền điều khiển các kết nối HTTPS từ máy khách Python để nghe lén hoặc sửa đổi dữ liệu được truyền

Việc thiếu xác minh chứng chỉ này đã được biết rõ và thường khắc phục trong các trường hợp sử dụng có liên quan bằng cách triển khai xác minh trong các ứng dụng hoặc bằng cách sử dụng các thư viện máy khách HTTP khác nhau đã thực hiện xác minh chứng chỉ. Các công cụ quản lý gói trong Red Hat Enterprise Linux có thể được sử dụng làm ví dụ. trình quản lý gói Yum được sử dụng trong Red Hat Enterprise Linux 5, 6 và 7 sử dụng mô-đun python-pycurl, một trình bao bọc xung quanh thư viện curl/libcurl, thực hiện xác minh chứng chỉ;

Mặc dù giới hạn này đã được biết rõ nhưng nhiều tác giả ứng dụng không biết về nó hoặc cho rằng tất cả các kiểm tra dự kiến ​​đã được thực hiện. Điều đó dẫn đến các báo cáo về một số lỗi bảo mật theo thời gian và việc gán CVE-2014-9365 do thiếu xác minh chứng chỉ trong các máy khách HTTP của thư viện chuẩn Python

Nghị quyết

Độ phân giải ngược dòng

Các nhà phát triển ngược dòng Python đã quyết định giải quyết vấn đề bằng cách bật xác minh chứng chỉ theo mặc định. Thay đổi được triển khai thông qua Đề xuất cải tiến Python PEP 476 [Bật xác minh chứng chỉ theo mặc định cho máy khách http stdlib] và được áp dụng cho cả nhánh phát triển hiện tại trong phiên bản 3. 4. 3 và nhánh bảo trì kế thừa trong phiên bản 2. 7. 9. Đây là một thay đổi gây tranh cãi cho di sản 2. 7 vì nó được biết là có vấn đề tương thích ngược liên quan đến nó. Các triển khai cố ý hoặc vô ý dựa vào hành vi cũ thiếu bất kỳ xác minh nào sẽ bị hỏng khi sử dụng phiên bản Python cập nhật. Do đó, điều này có thể ngăn người dùng sử dụng các phiên bản Python đã vá lỗi

Trong nỗ lực giải quyết các sự cố tương thích này và để cung cấp quá trình chuyển đổi mượt mà hơn sang các giá trị mặc định mới an toàn hơn, Red Hat đã làm việc với các thành viên cộng đồng Python để xác định các cơ chế cho phép người dùng và quản trị viên kiểm soát xem có nên thực hiện xác minh chứng chỉ hay không mà không yêu cầu sửa đổi các ứng dụng riêng lẻ. Các cơ chế đó được mô tả trong PEP 493 [Công cụ di chuyển xác minh HTTPS cho Python 2. 7]

Red Hat Enterprise Linux 7 Độ phân giải

Phiên bản Python có trong Red Hat Enterprise Linux 7 dựa trên phiên bản ngược dòng 2. 7. 5 và do đó đã không thực hiện xác minh chứng chỉ. Hỗ trợ cho PEP 476 [cùng với PEP 466 bắt buộc [Cải tiến bảo mật mạng cho Python 2. 7. x]] lần đầu tiên được thêm qua RHSA-2015. 2101 được phát hành như một phần của Red Hat Enterprise Linux 7. 2

RHSA-2015. Bản cập nhật 2101 bổ sung hỗ trợ cho PEP 476, tuy nhiên vì lý do tương thích ngược, nó tắt xác minh chứng chỉ theo mặc định. Nó cũng thực hiện hỗ trợ cho tệp cấu hình

$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
1 được mô tả trong phần "" của PEP 493. Với sự hỗ trợ này, xác minh chứng chỉ có thể được bật theo mặc định

Hỗ trợ cho PEP 493 trong Red Hat Enterprise Linux 7 đã được mở rộng thêm thông qua RHSA-2016. 2586 được phát hành như một phần của Red Hat Enterprise Linux 7. 3. Bản cập nhật thêm các tính năng sau

  • Cấu hình dựa trên môi trường, như được mô tả trong phần "" của PEP 493. Mô-đun

    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
    2 hiện kiểm tra biến môi trường
    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
    3 - nếu được đặt, giá trị của nó sẽ ghi đè cài đặt từ
    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
    1. Giá trị của
    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
    5 vô hiệu hóa xác minh chứng chỉ và bất kỳ giá trị nào khác cho phép nó. Người dùng cuối có thể sử dụng tính năng này để bật hoặc tắt xác minh cho một chương trình Python cụ thể hoặc một lệnh gọi cụ thể của chương trình Python mà không cần sửa đổi mã nguồn của chương trình

  • API cấu hình, như được mô tả trong phần "" của PEP 493. Hàm

    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
    6 có thể được sử dụng để bật hoặc tắt xác minh chứng chỉ khi chạy. Tác giả chương trình có thể sử dụng API này để đảm bảo chương trình của họ chạy với xác minh được bật hoặc tắt bất kể cài đặt hệ thống mặc định

Xác minh chứng chỉ đã được bật theo mặc định qua RhSA-2017. 1868 được phát hành như một phần của Red Hat Enterprise Linux 7. 4. Các triển khai yêu cầu xác minh chứng chỉ vẫn bị vô hiệu hóa có thể thay đổi mặc định thông qua tệp cấu hình

$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
1. Tham khảo phần "Kiểm soát xác minh chứng chỉ" bên dưới để biết thêm chi tiết

Bộ sưu tập phần mềm Red Hat

Phiên bản Python được sử dụng trong bộ sưu tập

$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
8 dựa trên phiên bản ngược dòng 3. 4. 2. Tuy nhiên, hỗ trợ PEP 476 đã được đưa vào phiên bản này và được đưa vào kể từ lần phát hành đầu tiên qua RHEA-2015. 1058, được phát hành như một phần của Red Hat Software Collections 2. 0, với xác minh chứng chỉ được bật theo mặc định. Nó không bao gồm bất kỳ hỗ trợ nào cho PEP 493 và do đó không thể tắt xác minh theo mặc định thông qua tệp cấu hình
$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
1. Các mẹo khắc phục sự cố được lưu ý bên dưới cũng có thể áp dụng cho phiên bản này

Phiên bản Python có trong bộ sưu tập

$ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
0 ban đầu dựa trên phiên bản ngược dòng 2. 7. 5 trở lên được cập nhật lên phiên bản ngược dòng 2. 7. 8 và do đó không thực hiện xác minh chứng chỉ. Hỗ trợ cho PEP 476 lần đầu tiên được thêm qua RHSA-2016. 1166 được phát hành như một phần của Red Hat Software Collections 2. 2

RHSA-2016. Bản cập nhật 1166 bổ sung hỗ trợ cho PEP 476, tuy nhiên vì lý do tương thích ngược, nó tắt xác minh chứng chỉ theo mặc định. Nó cũng thực hiện hỗ trợ cho tệp cấu hình

$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
1 được mô tả trong phần "" của PEP 493. Bộ sưu tập
$ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
0 lưu trữ tệp cấu hình
$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
1 trong thư mục
$ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
4 thay vì thư mục
$ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
5. Với sự hỗ trợ này, xác minh chứng chỉ có thể được bật theo mặc định

Hỗ trợ cho PEP 493 trong bộ sưu tập

$ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
0 đã được mở rộng thêm thông qua RHSA-2017. 1162 được phát hành như một phần của Red Hat Software Collections 2. 4. Lỗi đó cập nhật Python lên phiên bản 2. 7. 13 và do đó bật xác minh chứng chỉ theo mặc định. Nó cũng thêm hỗ trợ cho các tính năng bổ sung được xác định trong PEP 493. "" và "". Tham khảo phần "Độ phân giải Red Hat Enterprise Linux 7" ở trên để biết thêm chi tiết về các tính năng này

Phiên bản Python được sử dụng trong bộ sưu tập

$ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
7 không triển khai PEP 476 hoặc PEP 493 và hỗ trợ của chúng dự kiến ​​sẽ không được bổ sung trong các bản cập nhật trong tương lai

Kiểm soát và khắc phục sự cố xác minh chứng chỉ

Kiểm soát xác minh chứng chỉ

Các gói Python có hỗ trợ PEP 476 và PEP 493 khi được vận chuyển cùng với các sản phẩm Red Hat cho phép quản trị viên hệ thống đặt bật hoặc tắt xác minh chứng nhận theo mặc định thông qua tệp cấu hình kiểu INI.

$ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
8. Trong tệp cấu hình này, mặc định cho các máy khách HTTP trong thư viện chuẩn Python được đặt bằng cách sử dụng tùy chọn
$ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
9 trong phần
#!/usr/bin/env python

try:   
    import urllib2 #python2
except:
    import urllib.request as urllib2 #python3
import sys

req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
urllib2.urlopen[req]
0. Phần này có thể trông như thế này

[https]
verify=enable

Các giá trị hợp lệ là

#!/usr/bin/env python

try:   
    import urllib2 #python2
except:
    import urllib.request as urllib2 #python3
import sys

req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
urllib2.urlopen[req]
1 [xác minh được bật theo mặc định],
#!/usr/bin/env python

try:   
    import urllib2 #python2
except:
    import urllib.request as urllib2 #python3
import sys

req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
urllib2.urlopen[req]
2 [xác minh bị tắt theo mặc định] và
#!/usr/bin/env python

try:   
    import urllib2 #python2
except:
    import urllib.request as urllib2 #python3
import sys

req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
urllib2.urlopen[req]
3 [sử dụng mã hóa cứng mặc định cụ thể của nền tảng trong mô-đun
$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
2]. Người dùng được khuyến khích thử nghiệm các ứng dụng của họ với
#!/usr/bin/env python

try:   
    import urllib2 #python2
except:
    import urllib.request as urllib2 #python3
import sys

req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
urllib2.urlopen[req]
1 và chỉ sử dụng
#!/usr/bin/env python

try:   
    import urllib2 #python2
except:
    import urllib.request as urllib2 #python3
import sys

req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
urllib2.urlopen[req]
2 nếu việc xác minh gây ra sự cố trong môi trường của họ và chỉ cho đến khi những vấn đề đó có thể được giải quyết [e. g. bằng cách đảm bảo rằng tổ chức phát hành chứng chỉ [CA] được sử dụng bởi hệ thống của họ được định cấu hình là đáng tin cậy hoặc bằng cách sửa đổi các ứng dụng sẽ tiếp tục chạy khi xác minh bị vô hiệu hóa]. Khi giá trị
#!/usr/bin/env python

try:   
    import urllib2 #python2
except:
    import urllib.request as urllib2 #python3
import sys

req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
urllib2.urlopen[req]
3 được sử dụng, mặc định thực tế có thể thay đổi khi các gói Python bổ sung cập nhật với mặc định mã hóa cứng khác được phát hành trong tương lai

Khi sử dụng các phiên bản Python hỗ trợ biến môi trường

$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
3, biến đó có thể được sử dụng để đặt mặc định xác minh cho các lệnh gọi chương trình cụ thể. Các trường hợp sử dụng điển hình bao gồm

  • Nếu mặc định chung được định cấu hình trên hệ thống thông qua

    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
    1 là không thực hiện xác minh chứng chỉ và một số chương trình cần chạy khi bật xác minh [e. g. để kiểm tra xem chương trình có hoạt động chính xác hay không trước khi giá trị mặc định chung được thay đổi thành
    #!/usr/bin/env python
    
    try:   
        import urllib2 #python2
    except:
        import urllib.request as urllib2 #python3
    import sys
    
    req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
    urllib2.urlopen[req]
    
    1], trình thông dịch Python có thể được gọi theo cách sau để kích hoạt xác minh

    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
  • Nếu mặc định chung được định cấu hình trên hệ thống thông qua

    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
    1 là để thực hiện xác minh chứng chỉ và một số chương trình cần chạy khi xác minh bị tắt, trình thông dịch Python có thể được gọi theo cách sau để tắt xác minh

    $ PYTHONHTTPSVERIFY=0 python /path/to/python-program.py
    

Khắc phục sự cố xác minh chứng chỉ

Khi Python được định cấu hình để thực hiện xác minh chứng chỉ cho các kết nối máy khách HTTPS, một số kết nối có thể không thành công do xác minh không thành công. Chương trình ngắn sau đây có thể được sử dụng để minh họa các lỗi phổ biến nhất có thể gặp phải

#!/usr/bin/env python

try:   
    import urllib2 #python2
except:
    import urllib.request as urllib2 #python3
import sys

req = urllib2.Request[sys.argv[1], headers={'User-Agent':'Mozilla/5.0'}]
urllib2.urlopen[req]

Lỗi phổ biến nhất xảy ra khi kết nối với máy chủ HTTPS xuất trình chứng chỉ do CA không xác định cấp

$ python urllib2-test.py //cdn.redhat.com
...
urllib2.URLError: 

Theo mặc định, mô-đun Python

$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
2 sử dụng gói chứng chỉ CA hệ thống -
$ python urllib2-test.py //cdn.redhat.com
...
urllib2.URLError: 
3 - được vận chuyển như một phần của gói
$ python urllib2-test.py //cdn.redhat.com
...
urllib2.URLError: 
4. Bên trong mạng nội bộ của công ty, các máy chủ thường sử dụng chứng chỉ do CA công ty nội bộ cấp thay vì CA Internet công cộng. Mọi chương trình bị ảnh hưởng phải được định cấu hình để sử dụng chứng chỉ CA nội bộ để có thể xác minh thành công chứng chỉ của các máy chủ đó. Có thể sử dụng các phương pháp không yêu cầu bất kỳ sửa đổi chương trình nào sau đây để làm cho chúng tin cậy các chứng chỉ từ CA công ty

  • Thêm chứng chỉ của CA vào gói chứng chỉ hệ thống. Tham khảo trang hướng dẫn sử dụng

    $ python urllib2-test.py //cdn.redhat.com
    ...
    urllib2.URLError: 
    
    5 để biết thêm thông tin về cách thêm chứng chỉ mới vào gói. Lưu ý rằng sau khi nó được thêm vào, các chương trình khác sử dụng gói chứng chỉ hệ thống cũng sẽ tin cậy bất kỳ chứng chỉ nào do CA đó cấp. Do đó, điều này chỉ nên được thực hiện đối với CA đáng tin cậy

  • Sử dụng môi trường của chương trình để chỉ định các chứng chỉ CA đáng tin cậy bổ sung cho một lệnh gọi chương trình cụ thể. Biến môi trường

    $ python urllib2-test.py //cdn.redhat.com
    ...
    urllib2.URLError: 
    
    6 và
    $ python urllib2-test.py //cdn.redhat.com
    ...
    urllib2.URLError: 
    
    7 có thể được sử dụng để chỉ định chứng chỉ hoặc chứng chỉ CA đáng tin cậy bổ sung. Ví dụ: lưu chứng chỉ CA [ở định dạng PEM hoặc DER] vào một tệp và đặt đường dẫn của nó làm giá trị cho
    $ python urllib2-test.py //cdn.redhat.com
    ...
    urllib2.URLError: 
    
    6

    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    

Một vấn đề khác có thể gặp phải là khi máy chủ HTTPS mục tiêu có chứng chỉ do một trong các CA đáng tin cậy cấp, nhưng nó lại được cấp cho một tên máy chủ khác. Một lỗi như lỗi này được báo cáo trong trường hợp như vậy

$ python urllib2-test.py //ev-www.redhat.com.edgekey.net
...
ssl.CertificateError: hostname 'ev-www.redhat.com.edgekey.net' doesn't match either of 'www.redhat.com', 'redhat.com'

Một trong những tên máy chủ được ghi trong chứng chỉ máy chủ nên được sử dụng khi kết nối với máy chủ đó. Nếu cả hai tên được liệt kê đều không thể sử dụng được, thì máy chủ phải được tạo chứng chỉ thích hợp hoặc cần tắt xác minh chứng chỉ trong các máy khách kết nối với nó

Sửa đổi chương trình Python để kiểm soát xác minh chứng chỉ

Văn bản trên mô tả các phương pháp kiểm soát xác minh chứng chỉ mà không sửa đổi chương trình Python - sử dụng tệp cấu hình

$ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
1 và các biến môi trường. Các chương trình Python cũng có thể được sửa đổi để áp dụng cài đặt riêng của chúng để xác minh chứng chỉ bất kể mặc định của hệ thống

  • Các chương trình trực tiếp sử dụng

    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    0 có thể chỉ định tệp có chứng chỉ CA đáng tin cậy bằng cách sử dụng tham số
    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    1. Đây là một giải pháp thay thế cho việc sử dụng biến môi trường
    $ python urllib2-test.py //cdn.redhat.com
    ...
    urllib2.URLError: 
    
    6 và
    $ python urllib2-test.py //cdn.redhat.com
    ...
    urllib2.URLError: 
    
    7. Xem chi tiết

  • Thay thế cho việc sử dụng trực tiếp

    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    0, các chương trình có thể tạo
    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    6 để lưu trữ cấu hình và dữ liệu cần thiết cho các kết nối TLS/SSL và sử dụng phương pháp
    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    7 của nó.
    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    6 có thể được định cấu hình với vị trí của chứng chỉ CA đáng tin cậy [tương tự như
    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    0 được mô tả ở trên], nhưng cũng có thể được định cấu hình để tắt kiểm tra tên máy chủ lưu trữ của máy chủ. Xem chi tiết

  • Các mô-đun máy khách HTTP/HTTPS bên trong thư viện chuẩn Python hiện chấp nhận

    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    6 để cho phép tùy chỉnh cài đặt mặc định của chúng cho các kết nối TLS/SSL, bao gồm xác minh chứng chỉ. Xem tài liệu mô-đun httpliburllib2 để biết chi tiết

  • Hàm

    $ python urllib2-test.py //ev-www.redhat.com.edgekey.net
    ...
    ssl.CertificateError: hostname 'ev-www.redhat.com.edgekey.net' doesn't match either of 'www.redhat.com', 'redhat.com'
    
    4 có thể được sử dụng để tạo một
    $ SSL_CERT_FILE=/etc/rhsm/ca/redhat-uep.pem python urllib2-test.py //cdn.redhat.com/
    
    6 chưa được xác minh - ngữ cảnh vô hiệu hóa tất cả xác minh chứng chỉ. Ngữ cảnh như vậy có thể được chuyển đến các mô-đun httplib hoặc urllib2 để tắt xác minh cho các kết nối riêng lẻ hoặc đặt làm ngữ cảnh mặc định cho tất cả các kết nối HTTPS tiếp theo. Xem phần "" của PEP 476 để biết chi tiết và mã ví dụ

  • Khi sử dụng phiên bản Python triển khai "API cấu hình" được xác định trong PEP 493, hàm

    $ PYTHONHTTPSVERIFY=1 python /path/to/python-program.py
    
    6 có thể được sử dụng để kiểm soát xem ngữ cảnh đã xác minh hay chưa xác minh được sử dụng theo mặc định cho tất cả các kết nối HTTPS tiếp theo

    Python ca là gì

    Chứng chỉ CA . Trước phiên bản 2. 16, Các yêu cầu bao gồm một tập hợp các CA gốc mà nó tin cậy, có nguồn gốc từ cửa hàng tin cậy Mozilla. allows for users to update their trusted certificates without changing the version of Requests. Before version 2.16, Requests bundled a set of root CAs that it trusted, sourced from the Mozilla trust store.

    Làm cách nào để nhận chứng chỉ SSL bằng Python?

    Tạo chứng chỉ SSL tự ký bằng Python . Tạo khóa RSA riêng tư. Tạo yêu cầu ký chứng chỉ [CSR] bằng khóa riêng. Ký yêu cầu CSR để tạo chứng chỉ.

    Python xử lý chứng chỉ SSL như thế nào?

    Yêu cầu xác minh chứng chỉ SSL cho các yêu cầu HTTPS, giống như trình duyệt web . Chứng chỉ SSL là các tệp dữ liệu nhỏ liên kết kỹ thuật số khóa mật mã với thông tin chi tiết của tổ chức. Thông thường, một trang web có chứng chỉ SSL được gọi là trang web an toàn.

    3 loại chứng chỉ là gì?

    Có ba loại xác thực chứng chỉ SSL được công nhận. .
    Xác thực mở rộng [EV]
    Xác thực tổ chức [OV]
    Xác thực tên miền [DV]

Chủ Đề