Người bảo trì của PyPI Donald Stufft gần đây đã thông báo rằng python. org và các trang web có liên quan sẽ bắt đầu vô hiệu hóa các phiên bản TLS cũ 1. 0 và 1. 1. Thay đổi này được áp đặt cho chúng tôi bởi mạng phân phối nội dung của chúng tôi, Fastly, để đáp ứng với thay đổi do Hội đồng tiêu chuẩn bảo mật ngành thẻ thanh toán áp đặt cho họ. Để tiếp tục phục vụ các trang web nhận thanh toán bằng thẻ tín dụng, Fastly bắt buộc phải vô hiệu hóa các phiên bản TLS cũ, không an toàn. Vì các máy chủ của PSF, bao gồm cả PyPI, sử dụng Fastly, các phiên bản cũ của TLS cũng sẽ bị vô hiệu hóa.
Được viết nhanh vào tháng 10 năm 2015,
Đã xảy ra sự cố bảo mật hệ thống và nghiêm trọng với các phiên bản TLS trước đó và phiên bản tiền nhiệm của nó, SSL, bao gồm POODLE, Heartbleed và LOGJAM. Những điều này có nguy cơ phá vỡ niềm tin vào các phương thức giao tiếp an toàn cơ bản, khiến cả bạn và khách hàng của bạn gặp phải các vi phạm bảo mật. Các hành động của Hội đồng PCI DSS nhằm duy trì mức tối thiểu cao là một bước hướng tới đảm bảo tính bảo mật của tất cả các giao dịch kinh doanh trực tuyến.Có hai thời hạn để nâng cấp Python của bạn lên phiên bản có TLS mới nhất. Lần đầu tiên đến sớm, vào ngày 30 tháng 4 năm 2017, khi trăn. các trang web org không có Chứng chỉ xác thực mở rộng sẽ ngừng hỗ trợ TLS 1. 0 và 1. 1. Các trang web này bao gồm.
- testpypi. con trăn. tổ chức
- kiểm tra. pypi. tổ chức
- các tập tin. pythonhosted. tổ chức
Warehouse, sản phẩm kế thừa trong tương lai của PyPI, cũng sẽ bị ảnh hưởng bởi thời hạn cuối tháng 4, vì Warehouse phục vụ các tệp từ các tệp. pythonhosted. tổ chức.
Hạn chót quan trọng hơn là ngày 30 tháng 6 năm 2018. Vào ngày đó, tất cả những con trăn còn lại. org, bao gồm cả PyPI, sẽ không còn hỗ trợ TSL 1. 0 và 1. 1. Các phiên bản Python cũ hơn không triển khai TLSv1. 2 sẽ bị cấm truy cập PyPI.
Xem bên dưới để biết hướng dẫn kiểm tra phiên bản TLS của thông dịch viên của bạn. 1
Stufft viết: "Tôi sẽ xem xét khả năng tổ chức một số 'thời gian tạm dừng' của TLSv1 theo lịch trình. 0 và TLSv1. 1 trước ngày giới hạn để thử và giúp mọi người tìm những địa điểm cần cập nhật. Mọi sự cố mất điện theo lịch trình sẽ được đăng lên trạng thái. con trăn. org trước khi xảy ra. "
Người dùng Mac cần đặc biệt chú ý. Cho đến nay, hệ thống Python đi kèm với MacOS vẫn chưa hỗ trợ TLSv1. 2 trong mọi phiên bản MacOS; . 2 May mắn thay, thật dễ dàng để cài đặt Python hiện đại cùng với hệ thống MacOS Python. Tải xuống Python 3. 6 từ trăn. org hoặc cho Python 2. 7 với TLS mới nhất, hãy sử dụng Homebrew. Cả hai phương pháp cài đặt Python sẽ tiếp tục hoạt động sau tháng 6 năm 2018.
1. Để kiểm tra phiên bản TLS của trình thông dịch Python của bạn, hãy cài đặt gói "yêu cầu" và chạy lệnh. Ví dụ: đối với Python 2.
python2 -m pip install --upgrade requests
python2 -c "nhập yêu cầu; in[yêu cầu. nhận ['https. //www. chao ôi. com/a/kiểm tra', xác minh=Sai]. json[]['tls_version']]"
Hoặc Python 3.
python3 -m pip install --upgrade requests
python3 -c "nhập yêu cầu; in[yêu cầu. nhận ['https. //www. chao ôi. com/a/kiểm tra', xác minh=Sai]. json[]['tls_version']]"
Nếu bạn thấy "TLS 1. 2", TLS của thông dịch viên của bạn đã được cập nhật. Nếu bạn thấy "TLS 1. 0" hoặc lỗi như "phiên bản giao thức cảnh báo tlsv1", thì bạn phải nâng cấp. ↩
2. Lý do triển khai TLS của Python bị tụt lại phía sau trên macOS là Python tiếp tục sử dụng OpenSSL, mà Apple đã ngừng cập nhật trên macOS. Trong năm tới, nhóm Cơ quan đóng gói Python sẽ điều tra việc chuyển pip sang thư viện "SecureTransport" của riêng Apple như một giải pháp thay thế cho OpenSSL, điều này sẽ cho phép các trình thông dịch Python cũ chỉ sử dụng TLS hiện đại với pip. "Đây là một nỗ lực không hề nhỏ," Stufft viết, "Tôi không chắc nó sẽ hoàn thành. "
Về lâu dài, bản thân trình thông dịch Python sẽ dễ dàng theo kịp các phiên bản TLS, nếu nó không sử dụng OpenSSL trên các nền tảng như macOS và Windows nơi OpenSSL không được cung cấp cùng với HĐH. Cory Benfield và Christian Heimes đề xuất thiết kế lại các giao diện TLS của thư viện tiêu chuẩn để giúp trao đổi OpenSSL dễ dàng hơn với các triển khai TLS dựa trên nền tảng. ↩
Ngày nay, chúng ta làm hầu như mọi thứ trực tuyến. đặt chuyến bay, thanh toán hàng hóa, chuyển tiền ngân hàng, nhắn tin cho bạn bè, lưu trữ tài liệu, v.v. Nhiều việc chúng tôi yêu cầu cung cấp thông tin nhạy cảm như chi tiết thẻ tín dụng và thông tin ngân hàng của chúng tôi. Nếu một trang web sử dụng mạng không an toàn, tin tặc độc hại có thể dễ dàng đánh cắp thông tin người dùng. Đây là lý do tại sao mã hóa rất quan trọng
Giao thức bảo mật tầng vận chuyển [TLS] là biện pháp bảo vệ tối ưu thông tin người dùng trên các trang web và ứng dụng web. TLS sử dụng thuật toán mật mã khó bẻ khóa để đảm bảo rằng không ai khác ngoài máy chủ web và máy khách web có thể đọc hoặc sửa đổi dữ liệu được truyền
Trong bài viết này, chúng ta sẽ khám phá TLS và cách sử dụng Python để kiểm tra tính hợp lệ của chứng chỉ TLS của trang web. Sau đó, chúng tôi sẽ hướng dẫn các bước để thêm TLS vào ứng dụng Python của bạn trên Linux
Hiểu TLS/SSLGiao thức TLS, giao thức kế thừa của giao thức lớp cổng bảo mật [SSL], bảo vệ dữ liệu bằng mã hóa. Khi người dùng gửi thông tin của họ đến một trang web, TLS sẽ mã hóa thông tin đó trước khi gửi. Sau đó, chỉ máy chủ có cùng khóa công khai với máy khách mới có thể mở thư. Quy tắc này cũng được áp dụng khi máy chủ gửi thông tin lại cho máy khách. Chỉ máy khách có khóa tương ứng mới có thể đọc dữ liệu
Để trang web sử dụng giao thức TLS, bạn phải cài đặt chứng chỉ TLS/SSL hợp lệ [thường được gọi là chứng chỉ SSL]. Khi bạn cài đặt chứng chỉ, nó sẽ nâng cấp trang web từ HTTP lên HTTPS, một giao thức truyền an toàn hơn. Chứng chỉ là một tệp dữ liệu chứa danh tính của trang web và khóa chung để mở thông báo tải trọng
Chứng chỉ SSL phải hợp lệ để hoạt động. Điều này có nghĩa là không chỉ cơ quan cấp chứng chỉ đáng tin cậy [CA] phải ký tên mà chứng chỉ còn phải đang hoạt động. Mọi chứng chỉ đều có ngày cấp và ngày hết hạn. Chứng chỉ không còn hiệu lực sau ngày hết hạn
Các trang web không có chứng chỉ SSL hợp lệ có ít chỉ số hiển thị. Thứ nhất, URL trong thanh địa chỉ sử dụng tiền tố
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
2 thay vì import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
3. Ngoài ra, không có biểu tượng khóa — biểu tượng mà trình duyệt sử dụng để biểu thị một trang web an toàn — bên cạnh URL. Hãy thận trọng với những gì bạn chia sẻ nếu bạn nhận thấy một trong hai dấu hiệu nàyBây giờ chúng ta đã khám phá TLS-over-SSL [TLS/SSL], hãy xem cách triển khai nó bằng Python
Làm việc với TLS/SSL trong PythonKhi xây dựng máy chủ web bằng Python, điều quan trọng là phải biết cách thêm TLS/SSL vào ứng dụng của chúng ta. Trước khi tìm hiểu cách thực hiện, hãy xem cách sử dụng Python để xác minh tính hợp lệ của chứng chỉ SSL của trang web
Kiểm tra xem một trang web có chứng chỉ SSL hợp lệ hay không
Nếu chúng tôi muốn kiểm tra tính hợp lệ của chứng chỉ SSL của trang web, chúng tôi có thể dễ dàng làm như vậy bằng cách chạy tập lệnh Python như thế này
import requests
response=requests.get['//twitter.com/']
print[response]
Đoạn mã trên nhập mô-đun Python
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
4 và sử dụng nó để thực hiện yêu cầu import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
5 tới trang web Twitter. [Để chạy tập lệnh, bạn phải cài đặt mô-đun import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
4 trong Python bằng pip]. Chúng tôi có thể thay thế URL của Twitter bằng URL của trang web có chứng chỉ SSL mà chúng tôi muốn xác minh. Biến import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
7 lưu trữ giá trị nhận được mà mã in ở dòng cuối cùngKhi chúng tôi thực thi mã, chúng tôi nhận được thông báo
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
8, nghĩa là trang Twitter đang sử dụng chứng chỉ SSL hợp lệ [như mong đợi]Bây giờ, chúng tôi thực hiện một yêu cầu
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
5 đến một trang web khác. Lần này chúng tôi sử dụng một trang web mà chúng tôi biết là thiếu chứng chỉ SSL hợp lệimport requests
response=requests.get['//www.expired.badssl.com/']
print[response]
Lần này, chúng tôi nhận được lỗi cho biết quá trình xác minh chứng chỉ không thành công
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
0Thư viện SSL Python
Chúng tôi sử dụng thư viện SSL Python để cung cấp mã hóa TLS trong giao tiếp dựa trên ổ cắm giữa máy khách và máy chủ Python. Nó sử dụng mật mã và thông báo để bảo mật dữ liệu và phát hiện các nỗ lực thay đổi trong mạng. Chứng chỉ kỹ thuật số cung cấp xác thực
Thư viện SSL hỗ trợ Windows, macOS và các hệ thống UNIX hiện đại khác. Nó cũng yêu cầu OpenSSL để hoạt động.
Đến cuối bài viết này, chúng tôi sẽ sử dụng thư viện Python SSL để bao bọc ổ cắm dựa trên kết nối của chúng tôi bằng chứng chỉ SSL mà chúng tôi tạo trong phần sau
Tạo chứng chỉ SSL tự ký bằng Python
Bây giờ chúng ta đã biết cách xác minh tính hợp lệ của TLS/SSL trên một trang web, hãy xem cách chúng ta có thể sử dụng nó trên máy chủ web Python
Chúng tôi có thể nhanh chóng tạo và sử dụng chứng chỉ tự ký miễn phí để phát triển cục bộ. Tuy nhiên, nếu chúng tôi dự định triển khai trang web hoặc ứng dụng trên internet, chúng tôi phải mua chứng chỉ SSL từ nhà đăng ký tên miền đáng tin cậy [như GoDaddy và NameCheap].
Quá trình tự tạo chứng chỉ SSL cho ứng dụng Python cục bộ của chúng tôi có ba bước
- Tạo khóa RSA riêng
- 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ỉ
Sau khi tạo chứng chỉ SSL, chúng tôi sẽ sử dụng nó trong ứng dụng Python khi thực hiện các yêu cầu API
Một lần nữa, luôn chỉ mua chứng chỉ SSL từ cơ quan cấp chứng chỉ được ủy quyền. Nhiều công ty đăng ký miền bao gồm chứng chỉ SSL miễn phí khi bạn mua miền từ họ.
Hãy bắt đầu
Điều kiện tiên quyết. Cài đặt OpenSSL trên Linux
Đối với người dùng Linux, rất có thể OpenSSL đã có trên máy của bạn. Tuy nhiên, nếu bạn chưa có nó, thì bạn có thể cài đặt nó bằng trình quản lý gói của mình. Lệnh sau cài đặt OpenSSL trong các bản phân phối dựa trên Debian và Ubuntu
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
1Nếu bạn không chắc mình đã cài đặt OpenSSL trên máy chưa, bạn có thể kiểm tra bằng cách chạy lệnh sau
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
2Nếu bạn có nó, bạn sẽ nhận được số phiên bản. Nhưng nếu sau khi chạy lệnh trên mà gặp lỗi unrecognized command thì bạn phải cài đặt
Tạo khóa riêng
Chúng tôi có thể tạo khóa riêng có hoặc không có cụm mật khẩu bảo vệ. Để thêm cụm mật khẩu, chúng tôi chỉ cần sử dụng mật mã trong lệnh, chẳng hạn như
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
00Cả hai tùy chọn bên dưới đều dùng để tạo khóa riêng RSA 2048 bit, nhưng tùy chọn đầu tiên tạo khóa mà không cần cụm mật khẩu
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
4Tạo CSR bằng khóa
Trong bước này, chúng tôi sử dụng khóa riêng được tạo ở bước trước để tạo CSR. Để làm điều này, hãy chạy lệnh sau
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
5Bạn phải điền thêm một số thông tin về chứng chỉ trong dòng lệnh. Cung cấp nó và nhấn Enter khi hoàn tất
Ký chứng chỉ bằng khóa
Bước cuối cùng là ký yêu cầu tạo chứng chỉ. Chạy lệnh sau
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
6Tại đây, chúng tôi đang ký yêu cầu chứng chỉ bằng cùng một khóa được sử dụng để tạo yêu cầu đó. Quy trình này giải thích tại sao nó được gọi là chứng chỉ “tự ký”
Bạn có thể xem chi tiết chứng chỉ bằng cách chạy lệnh sau
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
7Chạy máy chủ Python HTTPS với TLS/SSL
Bây giờ chúng tôi đã tạo thành công chứng chỉ tự ký, chúng tôi sử dụng nó để tạo máy chủ HTTPS sử dụng mã hóa TLS trong suốt quá trình giao tiếp với máy khách.
Chương trình Python bên dưới khởi động máy chủ HTTPS trên máy chủ cục bộ của bạn tại cổng 443
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
8Trong đoạn mã trên, chúng tôi đã nhập
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
01 và import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
02. Sau đó, chúng tôi đã gọi phương thức import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
03 trên import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
04, chuyển vào địa chỉ và số cổng của máy chủ. Tiếp theo, chúng tôi bọc ổ cắm bằng SSL bằng cách chỉ định đường dẫn đến chứng chỉ của chúng tôi trong phương thức import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
05. Cuối cùng, chúng tôi đã chạy máy chủ ở cuối tệpĐể kết nối máy khách, bạn có thể sử dụng mô-đun yêu cầu Python để thực hiện yêu cầu GET tới địa chỉ máy chủ
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
0Lưu ý rằng đoạn mã trên phải được thêm vào một tệp khác với mã máy chủ. Chạy cái này sẽ kết nối máy khách với máy chủ và trả về thông báo
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
06import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
1Tóm tắtTrong bài viết này, chúng ta đã tìm hiểu về TLS/SSL và tầm quan trọng của việc có chứng chỉ kỹ thuật số hợp lệ trên các trang web của chúng ta. Chúng tôi cũng đã xem cách xác minh SSL trên một trang web bằng cách sử dụng phương pháp
import requests
response=requests.get['//www.expired.badssl.com/']
print[response]
07Sau đó, chúng tôi đã giới thiệu thư viện SSL Python và hướng dẫn quy trình tạo và sử dụng máy chủ web được bảo mật TLS/SSL trong Python. Chúng tôi đã tạo chứng chỉ tự ký bằng OpenSSL và thêm chứng chỉ vào kết nối ổ cắm HTTP của mình trước khi chạy máy chủ
Khi khối lượng giao dịch trực tuyến tiếp tục tăng, tội phạm mạng sẽ tiếp tục phát triển về quy mô và độ phức tạp. Sử dụng chứng chỉ SSL trên trang web của chúng tôi không chỉ ngăn chặn hầu hết các nỗ lực tấn công trang web của bạn mà còn giúp trang web trở nên đáng tin cậy hơn đối với khách truy cập. Hãy xem bài viết này để tìm hiểu thêm về lý do tại sao bạn nên sử dụng HTTPS
Thảo luận về blog này trên Discord
Tham gia Cộng đồng DevSecOps trên Discord để thảo luận về chủ đề này và hơn thế nữa với các học viên tập trung vào bảo mật khác