Chứng chỉ tự ký SSL SSL của Python

Bạn đã bao giờ tự hỏi tại sao bạn có thể gửi thông tin thẻ tín dụng của mình qua Internet chưa? . Làm thế nào bạn có thể chắc chắn rằng ứng dụng web của bạn an toàn?

Bạn có thể ngạc nhiên khi biết rằng bạn không cần phải là một chuyên gia về bảo mật để trả lời những câu hỏi này. Trong hướng dẫn này, bạn sẽ có được kiến ​​thức làm việc về các yếu tố khác nhau kết hợp để giữ cho thông tin liên lạc qua Internet được an toàn. Bạn sẽ thấy các ví dụ cụ thể về cách ứng dụng Python HTTPS bảo mật thông tin

Trong hướng dẫn này, bạn sẽ học cách

  • Giám sát và phân tích lưu lượng mạng
  • Áp dụng mật mã để giữ dữ liệu an toàn
  • Mô tả các khái niệm cốt lõi của Cơ sở hạ tầng khóa công khai (PKI)
  • Tạo cơ quan cấp chứng chỉ của riêng bạn
  • Xây dựng ứng dụng Python HTTPS
  • Xác định các lỗi và cảnh báo HTTPS phổ biến của Python

Tiền thưởng miễn phí. Nhấp vào đây để truy cập vào video hướng dẫn Flask + Python miễn phí chỉ cho bạn cách xây dựng ứng dụng web Flask, từng bước một

HTTP là gì?

Trước khi bạn đi sâu vào HTTPS và việc sử dụng nó trong Python, điều quan trọng là phải hiểu cha mẹ của nó, HTTP. Từ viết tắt này là viết tắt của Giao thức truyền tải siêu văn bản, làm nền tảng cho hầu hết các giao tiếp diễn ra khi bạn lướt các trang web yêu thích của mình. Cụ thể hơn, HTTP là cách tác nhân người dùng, như trình duyệt web của bạn, giao tiếp với máy chủ web, như realpython. com. Đây là sơ đồ đơn giản hóa về giao tiếp HTTP

Chứng chỉ tự ký SSL SSL của Python

Sơ đồ này hiển thị một phiên bản đơn giản hóa cách máy tính của bạn giao tiếp với máy chủ. Đây là sự cố của từng bước

  1. Bạn nói với trình duyệt của bạn để đi tới
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    8
  2. Thiết bị của bạn và máy chủ thiết lập kết nối TCP
  3. Trình duyệt của bạn gửi yêu cầu HTTP đến máy chủ
  4. Máy chủ nhận được yêu cầu HTTP và phân tích nó
  5. Máy chủ phản hồi bằng phản hồi HTTP
  6. Máy tính của bạn nhận, phân tích cú pháp và hiển thị phản hồi

Sự cố này nắm bắt những điều cơ bản về HTTP. Bạn gửi yêu cầu tới máy chủ và máy chủ trả về phản hồi. Mặc dù HTTP không yêu cầu TCP, nhưng nó yêu cầu một giao thức cấp thấp hơn đáng tin cậy. Trên thực tế, đây hầu như luôn là TCP qua IP (mặc dù Google đang cố gắng tạo một sự thay thế). Nếu bạn cần xem lại, hãy xem Lập trình ổ cắm trong Python (Hướng dẫn)

Khi các giao thức hoạt động, HTTP là một trong những giao thức đơn giản hơn. Nó được thiết kế để gửi nội dung qua Internet, như HTML, video, hình ảnh, v.v. Điều này được thực hiện với một yêu cầu và phản hồi HTTP. Yêu cầu HTTP chứa các yếu tố sau

  • Phương thức mô tả hành động mà khách hàng muốn thực hiện. Phương thức cho nội dung tĩnh thường là
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    9, mặc dù có những phương thức khác, như
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    0,
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    1 và
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    2
  • Đường dẫn cho máy chủ biết trang web bạn muốn yêu cầu. Ví dụ: đường dẫn của trang này là
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    3
  • Phiên bản này là một trong một số phiên bản HTTP, như 1. 0, 1. 1 hoặc 2. 0. Phổ biến nhất có lẽ là 1. 1
  • Các tiêu đề giúp mô tả thông tin bổ sung cho máy chủ
  • Phần thân cung cấp cho máy chủ thông tin từ máy khách. Mặc dù trường này không bắt buộc, nhưng một số phương thức thường có phần thân, chẳng hạn như một
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    0

Đây là những công cụ mà trình duyệt của bạn sử dụng để giao tiếp với máy chủ. Máy chủ phản hồi bằng phản hồi HTTP. Phản hồi HTTP chứa các phần tử sau

  • Phiên bản xác định phiên bản HTTP, phiên bản này thường giống với phiên bản của yêu cầu
  • Mã trạng thái cho biết liệu một yêu cầu đã được hoàn thành thành công hay chưa. Có khá nhiều mã trạng thái
  • Thông báo trạng thái cung cấp thông báo mà con người có thể đọc được giúp mô tả mã trạng thái
  • Các tiêu đề cho phép máy chủ phản hồi với siêu dữ liệu bổ sung về yêu cầu. Đây là những khái niệm giống như tiêu đề yêu cầu
  • Cơ thể mang nội dung. Về mặt kỹ thuật, đây là tùy chọn, nhưng thông thường, nó chứa một tài nguyên hữu ích

Đây là những khối xây dựng cho HTTP. Nếu bạn muốn tìm hiểu thêm về HTTP, thì bạn có thể xem trang tổng quan để tìm hiểu sâu hơn về giao thức này

Loại bỏ các quảng cáo

HTTPS là gì?

Giờ thì bạn đã hiểu thêm một chút về HTTP, vậy HTTPS là gì? . HTTPS là viết tắt của Giao thức truyền tải siêu văn bản an toàn. Về cơ bản, HTTPS là giao thức giống như HTTP nhưng có thêm hàm ý rằng các giao tiếp được bảo mật

HTTPS không viết lại bất kỳ nguyên tắc cơ bản nào của HTTP mà nó được xây dựng trên đó. Thay vào đó, HTTPS bao gồm HTTP thông thường được gửi qua kết nối được mã hóa. Thông thường, kết nối được mã hóa này được cung cấp bởi TLS hoặc SSL, là các giao thức mã hóa giúp mã hóa thông tin trước khi gửi qua mạng

Ghi chú. TLS và SSL là các giao thức cực kỳ giống nhau, mặc dù SSL đang trên đà phát triển, với TLS sẽ thay thế nó. Sự khác biệt trong các giao thức này nằm ngoài phạm vi của hướng dẫn này. Đủ để biết rằng TLS là phiên bản SSL mới hơn, tốt hơn

Vì vậy, tại sao tạo ra sự tách biệt này? . Bảo mật thông tin liên lạc là một vấn đề quan trọng và khó khăn, nhưng HTTP chỉ là một trong nhiều giao thức yêu cầu bảo mật. Có vô số ứng dụng khác trên nhiều ứng dụng khác nhau

  • E-mail
  • Tin khẩn
  • VoIP (Thoại qua IP)

Có những người khác, cũng như. Nếu mỗi giao thức này phải tạo cơ chế bảo mật của riêng mình, thì thế giới sẽ kém an toàn hơn và khó hiểu hơn nhiều. TLS, thường được sử dụng bởi các giao thức trên, cung cấp một phương pháp chung để bảo mật thông tin liên lạc

Ghi chú. Sự tách biệt các giao thức này là một chủ đề phổ biến trong mạng, đến nỗi nó có tên. Mô hình OSI đại diện cho các giao tiếp từ phương tiện vật lý cho đến HTML được hiển thị trên trang này

Hầu như tất cả thông tin bạn sẽ học trong hướng dẫn này sẽ được áp dụng cho nhiều thứ hơn là chỉ các ứng dụng Python HTTPS. Bạn sẽ học những kiến ​​thức cơ bản về liên lạc an toàn cùng với cách nó áp dụng cụ thể cho HTTPS

Tại sao HTTPS lại quan trọng?

Liên lạc an toàn là rất quan trọng trong việc cung cấp một môi trường trực tuyến an toàn. Khi nhiều nơi trên thế giới chuyển sang trực tuyến, bao gồm cả ngân hàng và các trang web chăm sóc sức khỏe, việc tạo các ứng dụng Python HTTPS ngày càng trở nên quan trọng hơn đối với các nhà phát triển. Một lần nữa, HTTPS chỉ là HTTP qua TLS hoặc SSL. TLS được thiết kế để cung cấp sự riêng tư khỏi những kẻ nghe trộm. Nó cũng có thể cung cấp xác thực của cả máy khách và máy chủ

Trong phần này, bạn sẽ khám phá sâu các khái niệm này bằng cách thực hiện các thao tác sau

  1. Tạo máy chủ HTTPS Python
  2. Giao tiếp với máy chủ Python HTTPS của bạn
  3. Nắm bắt các thông tin liên lạc này
  4. Phân tích những thông điệp đó

Bắt đầu nào

Tạo một ứng dụng mẫu

Giả sử bạn là thủ lĩnh của một câu lạc bộ Python thú vị có tên là Secret Squirrels. Squirrels, bí mật, yêu cầu một thông điệp bí mật để tham dự các cuộc họp của họ. Là trưởng nhóm, bạn chọn tin nhắn bí mật, thay đổi theo từng cuộc họp. Tuy nhiên, đôi khi, bạn khó gặp được tất cả các thành viên trước cuộc họp để nói với họ thông điệp bí mật. Bạn quyết định thiết lập một máy chủ bí mật nơi các thành viên chỉ có thể xem tin nhắn bí mật cho chính họ

Ghi chú. Mã ví dụ được sử dụng trong hướng dẫn này không được thiết kế để sản xuất. Nó được thiết kế để giúp bạn tìm hiểu kiến ​​thức cơ bản về HTTP và TLS. Vui lòng không sử dụng mã này để sản xuất. Nhiều ví dụ dưới đây có thực tiễn bảo mật khủng khiếp. Trong hướng dẫn này, bạn sẽ tìm hiểu về TLS và một cách mà nó có thể giúp bạn an toàn hơn

Bạn đã làm theo một số hướng dẫn về Real Python và quyết định sử dụng một số phụ thuộc mà bạn biết

  • Flask để xây dựng một ứng dụng web
  • uWSGI làm máy chủ sản xuất
  • yêu cầu thực hiện máy chủ của bạn

Để cài đặt tất cả các phụ thuộc này, bạn có thể sử dụng

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
5

$ pip install flask uwsgi requests

Với các phụ thuộc của bạn đã được cài đặt, bạn bắt đầu viết ứng dụng của mình. Trong một tệp có tên là

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
6, bạn tạo một ứng dụng Flask

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
1

Ứng dụng Flask này sẽ hiển thị thông báo bí mật bất cứ khi nào ai đó truy cập vào đường dẫn

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
7 của máy chủ của bạn. Ngoài ra, bạn triển khai ứng dụng của mình trên máy chủ bí mật và chạy nó

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
3

Lệnh này khởi động máy chủ bằng ứng dụng Flask ở trên. Bạn bắt đầu nó trên một cổng lạ vì bạn không muốn mọi người có thể tìm thấy nó và tự vỗ lưng mình vì đã quá lén lút. Bạn có thể xác nhận rằng nó đang hoạt động bằng cách truy cập vào

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
8 trong trình duyệt của bạn

Vì mọi người trong Secret Squirrels đều biết Python nên bạn quyết định giúp họ. Bạn viết một kịch bản tên là

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
9 sẽ giúp họ nhận được thông điệp bí mật

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()

Mã này sẽ in ra thông báo bí mật miễn là chúng có biến môi trường

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
30 được đặt. Trong trường hợp này,
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
30 là
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
32. Vì vậy, kế hoạch của bạn là cung cấp cho mỗi thành viên câu lạc bộ URL bí mật và yêu cầu họ giữ bí mật và an toàn

Mặc dù điều này có vẻ ổn, nhưng hãy yên tâm là không. Trên thực tế, ngay cả khi bạn đặt tên người dùng và mật khẩu trên trang web này, nó vẫn không an toàn. Nhưng ngay cả khi nhóm của bạn bằng cách nào đó đã quản lý để giữ an toàn cho URL, thư bí mật của bạn vẫn sẽ không an toàn. Để chứng minh tại sao bạn cần biết một chút về giám sát lưu lượng mạng. Để làm điều này, bạn sẽ sử dụng một công cụ có tên là Wireshark

Loại bỏ các quảng cáo

Thiết lập Wireshark

Wireshark là một công cụ được sử dụng rộng rãi để phân tích mạng và giao thức. Điều này có nghĩa là nó có thể giúp bạn xem điều gì đang xảy ra qua các kết nối mạng. Cài đặt và thiết lập Wireshark là tùy chọn cho hướng dẫn này, nhưng vui lòng làm theo nếu bạn muốn. Trang tải xuống có sẵn một số trình cài đặt

  • macOS 10. 12 trở lên
  • Bộ cài Windows 64-bit
  • Bộ cài Windows 32-bit

Nếu bạn đang sử dụng Windows hoặc Mac, thì bạn có thể tải xuống trình cài đặt thích hợp và làm theo lời nhắc. Cuối cùng, bạn sẽ có một Wireshark đang chạy

Nếu bạn đang sử dụng môi trường Linux dựa trên Debian thì việc cài đặt sẽ khó hơn một chút nhưng vẫn có thể thực hiện được. Bạn có thể cài đặt Wireshark bằng các lệnh sau

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark

Bạn sẽ thấy một màn hình giống như thế này

Chứng chỉ tự ký SSL SSL của Python

Khi Wireshark đang chạy, đã đến lúc phân tích một số lưu lượng truy cập

Thấy rằng dữ liệu của bạn không an toàn

Cách máy khách và máy chủ hiện tại của bạn đang chạy không an toàn. HTTP sẽ gửi mọi thứ rõ ràng cho mọi người xem. Điều này có nghĩa là ngay cả khi ai đó không có

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
30 của bạn, họ vẫn có thể thấy mọi thứ bạn làm miễn là họ có thể giám sát lưu lượng truy cập trên bất kỳ thiết bị nào giữa bạn và máy chủ

Điều này sẽ tương đối đáng sợ đối với bạn. Rốt cuộc, bạn không muốn người khác xuất hiện trong các cuộc họp Secret Squirrel của mình. Bạn có thể chứng minh rằng điều này đang xảy ra. Trước tiên, hãy khởi động máy chủ của bạn nếu bạn vẫn chưa chạy nó

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
3

Điều này sẽ khởi động ứng dụng Flask của bạn trên cổng 5683. Tiếp theo, bạn sẽ bắt đầu chụp gói trong Wireshark. Việc chụp gói này sẽ giúp bạn xem tất cả lưu lượng truy cập đến và đi từ máy chủ. Bắt đầu bằng cách chọn Loopback. lo giao diện trên Wireshark

Chứng chỉ tự ký SSL SSL của Python

Bạn có thể thấy rằng Loopback. phần lo được đánh dấu. Điều này hướng dẫn Wireshark giám sát cổng này để biết lưu lượng truy cập. Bạn có thể làm tốt hơn và chỉ định cổng và giao thức nào bạn muốn nắm bắt. Bạn có thể nhập

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
34 vào bộ lọc chụp và
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
35 trong bộ lọc hiển thị

Chứng chỉ tự ký SSL SSL của Python

Hộp màu xanh lá cây cho biết Wireshark hài lòng với bộ lọc bạn đã nhập. Bây giờ bạn có thể bắt đầu chụp bằng cách nhấp vào vây ở trên cùng bên trái

Chứng chỉ tự ký SSL SSL của Python

Nhấp vào nút này sẽ tạo ra một cửa sổ mới trong Wireshark

Chứng chỉ tự ký SSL SSL của Python

Cửa sổ mới này khá đơn giản, nhưng thông báo ở dưới cùng cho biết

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
36, cho biết rằng nó đang hoạt động. Đừng lo lắng rằng không có gì được hiển thị, vì điều đó là bình thường. Để Wireshark báo cáo bất cứ điều gì, phải có một số hoạt động trên máy chủ của bạn. Để lấy một số dữ liệu, hãy thử chạy ứng dụng khách của bạn

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
6

Sau khi thực thi mã

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
9 ở trên, bây giờ bạn sẽ thấy một số mục nhập trong Wireshark. Nếu mọi việc suôn sẻ, thì bạn sẽ thấy hai mục giống như thế này

Chứng chỉ tự ký SSL SSL của Python

Hai mục này đại diện cho hai phần của giao tiếp đã xảy ra. Đầu tiên là yêu cầu của khách hàng đến máy chủ của bạn. Khi bạn nhấp vào mục đầu tiên, bạn sẽ thấy rất nhiều thông tin

Chứng chỉ tự ký SSL SSL của Python

Đó là rất nhiều thông tin. Ở trên cùng, bạn vẫn có yêu cầu và phản hồi HTTP của mình. Khi bạn chọn một trong các mục này, bạn sẽ thấy hàng giữa và hàng dưới cùng có thông tin

Hàng ở giữa cung cấp cho bạn bảng phân tích các giao thức mà Wireshark có thể xác định cho yêu cầu đã chọn. Sự cố này cho phép bạn khám phá những gì thực sự đã xảy ra trong Yêu cầu HTTP của bạn. Dưới đây là tóm tắt nhanh về thông tin mà Wireshark mô tả ở hàng giữa từ trên xuống dưới

  1. lớp vật lý. Hàng này mô tả giao diện vật lý được sử dụng để gửi yêu cầu. Trong trường hợp của bạn, đây có thể là Giao diện ID 0 (lo) cho giao diện loopback của bạn
  2. Thông tin Ethernet. Hàng này hiển thị cho bạn Giao thức lớp 2, bao gồm địa chỉ MAC nguồn và đích
  3. IPv4. Hàng này hiển thị địa chỉ IP nguồn và đích (127. 0. 0. 1)
  4. TCP. Hàng này bao gồm quá trình bắt tay TCP bắt buộc để tạo một đường dẫn dữ liệu đáng tin cậy
  5. HTTP. Hàng này hiển thị thông tin về chính yêu cầu HTTP

Khi bạn mở rộng lớp Giao thức truyền siêu văn bản, bạn có thể thấy tất cả thông tin tạo nên Yêu cầu HTTP

Chứng chỉ tự ký SSL SSL của Python

Hình ảnh này hiển thị cho bạn yêu cầu HTTP của tập lệnh của bạn

  • Phương pháp.
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    9
  • Đường dẫn.
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    7
  • Phiên bản.
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    60
  • tiêu đề.
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    61,
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    62, và những người khác
  • Cơ thể người. Không ai

Hàng cuối cùng bạn sẽ thấy là kết xuất dữ liệu hex. Bạn có thể nhận thấy trong kết xuất hex này rằng bạn thực sự có thể thấy các phần của yêu cầu HTTP của mình. Đó là vì yêu cầu HTTP của bạn đã được gửi công khai. Nhưng còn câu trả lời thì sao?

Chứng chỉ tự ký SSL SSL của Python

Một lần nữa, bạn có ba phần giống nhau. Nếu bạn nhìn kỹ vào kết xuất hex, thì bạn sẽ thấy thông báo bí mật ở dạng văn bản thuần túy. Đây là một vấn đề lớn đối với Secret Squirrels. Điều này có nghĩa là bất kỳ ai có một số bí quyết kỹ thuật đều có thể dễ dàng thấy lưu lượng truy cập này nếu họ quan tâm. Vì vậy, làm thế nào để bạn giải quyết vấn đề này?

Loại bỏ các quảng cáo

Mật mã học giúp như thế nào?

Trong phần này, bạn sẽ tìm hiểu một cách để giữ an toàn cho dữ liệu của mình bằng cách tạo các khóa mật mã của riêng bạn và sử dụng chúng trên cả máy chủ và máy khách của bạn. Mặc dù đây không phải là bước cuối cùng của bạn, nhưng nó sẽ giúp bạn có được nền tảng vững chắc về cách xây dựng các ứng dụng Python HTTPS

Hiểu khái niệm cơ bản về mật mã

Mật mã là một cách để bảo mật thông tin liên lạc khỏi những kẻ nghe trộm hoặc kẻ thù. Một cách khác để nói điều này là bạn đang lấy thông tin bình thường, được gọi là văn bản gốc và chuyển đổi nó thành văn bản được xáo trộn, được gọi là bản mã

Thoạt đầu, mật mã học có thể đáng sợ, nhưng các khái niệm cơ bản thì khá dễ tiếp cận. Trên thực tế, bạn có thể đã thực hành mật mã trước đây. Nếu bạn đã từng có một ngôn ngữ bí mật với bạn bè của mình và sử dụng nó để ghi chú trong lớp, thì bạn đã thực hành mật mã. (Nếu bạn chưa làm điều đó, thì đừng lo lắng—bạn sắp. )

Bằng cách nào đó, bạn cần lấy chuỗi

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
63 và chuyển đổi nó thành một thứ gì đó khó hiểu. Một cách để làm điều này là ánh xạ một số ký tự lên các ký tự khác nhau. Một cách hiệu quả để làm điều này là dịch chuyển các ký tự trở lại một vị trí trong bảng chữ cái. Làm như vậy sẽ trông giống như thế này

Chứng chỉ tự ký SSL SSL của Python

Hình ảnh này cho bạn thấy cách dịch từ bảng chữ cái gốc sang bảng chữ cái mới và ngược lại. Vì vậy, nếu bạn có tin nhắn

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
64, thì bạn thực sự sẽ gửi tin nhắn
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
65. Nếu bạn áp dụng điều này cho
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
63, thì giả sử rằng các khoảng trắng không đổi, bạn sẽ nhận được
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
67. Mặc dù nó không hoàn hảo, nhưng nó có thể giống như một thứ vô nghĩa đối với bất kỳ ai nhìn thấy nó

Xin chúc mừng. Bạn đã tạo ra thứ được biết đến trong mật mã học dưới dạng mật mã, mô tả cách chuyển đổi văn bản gốc thành văn bản mã hóa và ngược lại. Mật mã của bạn, trong trường hợp này, được mô tả bằng tiếng Anh. Loại mật mã đặc biệt này được gọi là mật mã thay thế. Về cơ bản, đây là cùng một loại mật mã được sử dụng trong Enigma Machine, mặc dù là một phiên bản đơn giản hơn nhiều

Bây giờ, nếu bạn muốn gửi một tin nhắn cho những con sóc bí mật, thì trước tiên bạn cần cho chúng biết số lượng chữ cái cần dịch chuyển và sau đó đưa cho chúng tin nhắn được mã hóa. Trong Python, điều này có thể trông giống như sau

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
8

Tại đây, bạn đã tạo một hàm có tên là

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
68, hàm này sẽ lấy văn bản gốc và chuyển đổi nó thành bản mã. Hãy tưởng tượng bạn có một cuốn từ điển
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
69 có tất cả các ký tự được vạch ra. Tương tự, bạn có thể tạo một
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
80

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
2

Chức năng này ngược lại với

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
68. Nó sẽ lấy bản mã và chuyển đổi nó thành bản rõ. Ở dạng mật mã này, bạn có một khóa đặc biệt mà người dùng cần biết để mã hóa và giải mã tin nhắn. Đối với ví dụ trên, khóa đó là
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
82. Nghĩa là, mật mã chỉ ra rằng bạn nên dịch chuyển từng chữ cái trở lại một ký tự. Khóa rất quan trọng để giữ bí mật vì bất kỳ ai có khóa đều có thể dễ dàng giải mã tin nhắn của bạn

Ghi chú. Mặc dù bạn có thể sử dụng điều này để mã hóa nhưng điều này vẫn không an toàn lắm. Mật mã này nhanh chóng bị phá vỡ bằng cách sử dụng phân tích tần số và quá thô sơ đối với Secret Squirrels

Trong kỷ nguyên hiện đại, mật mã tiên tiến hơn rất nhiều. Nó dựa vào lý thuyết toán học phức tạp và khoa học máy tính để được bảo mật. Mặc dù toán học đằng sau các mật mã này nằm ngoài phạm vi của hướng dẫn này, nhưng các khái niệm cơ bản vẫn giống nhau. Bạn có một bản mã mô tả cách lấy bản rõ và chuyển đổi nó thành bản mã

Sự khác biệt thực sự duy nhất giữa mật mã thay thế của bạn và mật mã hiện đại là mật mã hiện đại được chứng minh về mặt toán học là không thực tế để phá vỡ bởi kẻ nghe trộm. Bây giờ, hãy xem cách sử dụng mật mã mới của bạn

Sử dụng mật mã trong các ứng dụng HTTPS Python

Thật may mắn cho bạn, bạn không cần phải là một chuyên gia về toán học hoặc khoa học máy tính để sử dụng mật mã. Python cũng có một mô-đun

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
83 có thể giúp bạn tạo dữ liệu ngẫu nhiên được bảo mật bằng mật mã. Trong hướng dẫn này, bạn sẽ tìm hiểu về một thư viện Python có tên thích hợp là
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
84. Nó có sẵn trên PyPI, vì vậy bạn có thể cài đặt nó bằng pip

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
7

Điều này sẽ cài đặt

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
84 vào môi trường ảo của bạn. Với
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
84 được cài đặt, giờ đây bạn có thể mã hóa và giải mã mọi thứ theo cách an toàn về mặt toán học bằng cách sử dụng phương pháp
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
87

Nhớ lại rằng khóa bí mật trong mật mã của bạn là

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
82. Đồng quan điểm, bạn cần tạo khóa để Fernet hoạt động chính xác

>>>

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
10

Trong mã này, bạn đã nhập

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
87 và tạo khóa. Khóa chỉ là một loạt byte, nhưng điều cực kỳ quan trọng là bạn phải giữ bí mật và an toàn khóa này. Giống như ví dụ thay thế ở trên, bất kỳ ai có khóa này đều có thể dễ dàng giải mã tin nhắn của bạn

Ghi chú. Trong cuộc sống thực, bạn sẽ giữ chìa khóa này rất an toàn. Trong những ví dụ này, thật hữu ích khi xem khóa, nhưng đây là một cách làm không tốt, đặc biệt nếu bạn đăng nó trên một trang web công cộng. Nói cách khác, không sử dụng chính xác khóa mà bạn thấy ở trên cho bất kỳ thứ gì bạn muốn bảo mật

Phím này hoạt động giống như phím trước đó. Bắt buộc phải thực hiện quá trình chuyển đổi sang bản mã và quay lại bản rõ. Bây giờ là lúc cho phần thú vị. Bạn có thể mã hóa một tin nhắn như thế này

>>>

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
11

Trong mã này, bạn đã tạo một đối tượng Fernet có tên là

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
20, sau đó bạn có thể sử dụng đối tượng này để mã hóa tin nhắn của mình. Lưu ý rằng tin nhắn bí mật của bạn
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
63 cần phải là một đối tượng
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
22 để mã hóa nó. Sau khi mã hóa, bạn có thể thấy rằng
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
23 là một dòng byte dài

Nhờ Fernet, bản mã này không thể được thao tác hoặc đọc nếu không có khóa. Loại mã hóa này yêu cầu cả máy chủ và máy khách đều có quyền truy cập vào khóa. Khi cả hai bên yêu cầu cùng một khóa, điều này được gọi là mã hóa đối xứng. Trong phần tiếp theo, bạn sẽ thấy cách sử dụng mã hóa đối xứng này để giữ an toàn cho dữ liệu của bạn

Loại bỏ các quảng cáo

Thấy rằng dữ liệu của bạn an toàn

Bây giờ bạn đã hiểu một số khái niệm cơ bản về mật mã trong Python, bạn có thể áp dụng kiến ​​thức này cho máy chủ của mình. Tạo một tệp mới có tên là

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
24

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
12

Mã này kết hợp mã máy chủ ban đầu của bạn với đối tượng

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
87 mà bạn đã sử dụng trong phần trước. Khóa hiện được đọc dưới dạng đối tượng
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
22 từ môi trường bằng cách sử dụng
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
27. Khi máy chủ không hoạt động, giờ đây bạn có thể tập trung vào máy khách. Dán đoạn mã sau vào
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
28

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
13

Một lần nữa, đây là mã được sửa đổi để kết hợp ứng dụng khách trước đó của bạn với cơ chế mã hóa

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
87.
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
70 làm như sau

  1. Thực hiện yêu cầu đến máy chủ của bạn
  2. Lấy các byte thô từ phản hồi
  3. Cố gắng giải mã các byte thô
  4. In tin nhắn được giải mã

Nếu bạn chạy cả máy chủ và máy khách, thì bạn sẽ thấy rằng bạn đang mã hóa và giải mã thành công tin nhắn bí mật của mình

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
14

Trong cuộc gọi này, bạn khởi động lại máy chủ trên cổng 5683. Lần này, bạn chuyển vào một

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
71 phải là một chuỗi được mã hóa base64 có độ dài tối thiểu là 32. Khi máy chủ của bạn được khởi động lại, bây giờ bạn có thể truy vấn nó

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
15

tuyệt vời. Bạn đã có thể mã hóa và giải mã tin nhắn của mình. Nếu bạn thử chạy cái này với một

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
71 không hợp lệ, thì bạn sẽ gặp lỗi

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
16

Vì vậy, bạn biết mã hóa và giải mã đang hoạt động. Nhưng nó có an toàn không? . Để chứng minh điều này, bạn có thể quay lại Wireshark và bắt đầu chụp mới với các bộ lọc giống như trước đây. Sau khi bạn đã thiết lập chụp, hãy chạy lại mã máy khách

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
15

Bạn đã thực hiện một yêu cầu và phản hồi HTTP thành công khác, và một lần nữa, bạn thấy những thông báo này trong Wireshark. Vì tin nhắn bí mật chỉ được chuyển trong phản hồi, bạn có thể nhấp vào đó để xem dữ liệu

Chứng chỉ tự ký SSL SSL của Python

Ở hàng giữa của bức ảnh này, bạn có thể thấy dữ liệu đã thực sự được chuyển

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
18

Đáng kinh ngạc. Điều này có nghĩa là dữ liệu đã được mã hóa và những kẻ nghe trộm không biết nội dung tin nhắn thực sự là gì. Không chỉ vậy, điều đó còn có nghĩa là họ có thể dành một khoảng thời gian cực kỳ dài để cố gắng bẻ khóa dữ liệu này bằng vũ lực và họ gần như sẽ không bao giờ thành công

Dữ liệu của bạn an toàn. Nhưng đợi một chút—bạn chưa bao giờ phải biết bất cứ điều gì về một khóa khi bạn đang sử dụng các ứng dụng Python HTTPS trước đây. Đó là bởi vì HTTPS không chỉ sử dụng mã hóa đối xứng. Hóa ra, chia sẻ bí mật là một bài toán khó

Để chứng minh khái niệm này, hãy điều hướng đến

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
73 trong trình duyệt của bạn và bạn sẽ thấy văn bản phản hồi được mã hóa. Điều này là do trình duyệt của bạn không biết gì về khóa mật mã bí mật của bạn. Vậy làm thế nào để các ứng dụng Python HTTPS thực sự hoạt động?

Loại bỏ các quảng cáo

Khóa được chia sẻ như thế nào?

Trong phần trước, bạn đã biết cách sử dụng mã hóa đối xứng để giữ an toàn cho dữ liệu của mình khi truyền qua Internet. Tuy nhiên, mặc dù mã hóa đối xứng là an toàn, nhưng đây không phải là kỹ thuật mã hóa duy nhất được các ứng dụng Python HTTPS sử dụng để giữ an toàn cho dữ liệu của bạn. Mã hóa đối xứng giới thiệu một số vấn đề cơ bản không dễ giải quyết

Ghi chú. Hãy nhớ rằng, mã hóa đối xứng yêu cầu bạn phải có khóa chung giữa máy khách và máy chủ. Thật không may, bảo mật chỉ hoạt động mạnh như liên kết yếu nhất của bạn và các liên kết yếu đặc biệt nghiêm trọng trong mã hóa đối xứng. Khi một người thỏa hiệp khóa, thì mọi khóa đều bị xâm phạm. Sẽ an toàn khi cho rằng bất kỳ hệ thống bảo mật nào, đến một lúc nào đó, sẽ bị xâm phạm

Vì vậy, làm thế nào để bạn thay đổi chìa khóa của bạn? . Tuy nhiên, khi bạn có nhiều máy khách và nhiều máy chủ hơn, thì càng cần có nhiều sự phối hợp hơn để thay đổi khóa và giữ bí mật của bạn an toàn một cách hiệu quả

Hơn nữa, bạn phải chọn một bí mật mới mỗi lần. Trong ví dụ trên, bạn đã thấy một khóa được tạo ngẫu nhiên. Bạn gần như không thể cố gắng khiến mọi người nhớ đến chìa khóa đó. Khi số lượng máy khách và máy chủ của bạn tăng lên, bạn có thể sẽ sử dụng các khóa dễ nhớ và dễ đoán hơn

Nếu bạn có thể đối phó với việc thay đổi chìa khóa của mình, thì bạn vẫn còn một vấn đề nữa cần giải quyết. Bạn chia sẻ khóa ban đầu của mình như thế nào? . Bạn có thể đưa bí mật trực tiếp cho từng thành viên và yêu cầu họ giữ bí mật, nhưng hãy nhớ rằng ai đó sẽ là mắt xích yếu nhất

Bây giờ, giả sử bạn thêm một thành viên vào Secret Squirrels từ một địa điểm thực tế khác. Làm thế nào để bạn chia sẻ bí mật với thành viên này? . Thật không may, điều này sẽ đánh bại toàn bộ mục đích mã hóa, vì bất kỳ ai cũng có thể lấy được khóa bí mật

Tất nhiên, bạn có thể cung cấp cho mọi người một khóa chính ban đầu để nhận được thông báo bí mật, nhưng bây giờ bạn gặp phải gấp đôi vấn đề so với trước đây. Nếu đầu bạn đau, thì đừng lo lắng. Bạn không phải là người duy nhất

Điều bạn cần là hai bên chưa bao giờ giao tiếp có một bí mật chung. Nghe có vẻ không thể, phải không? . Họ đã giúp chứng minh rằng mật mã khóa công khai, còn được gọi là mã hóa bất đối xứng, là có thể

Ghi chú. Trong khi Whitfield Diffie và Martin Hellman được biết đến rộng rãi là những người đầu tiên phát hiện ra kế hoạch này, thì vào năm 1997, người ta đã tiết lộ rằng ba người đàn ông làm việc cho GCHQ tên là James H. Ellis, Clifford Cocks và Malcolm J. Williamson trước đây đã chứng minh khả năng này bảy năm trước

Mã hóa bất đối xứng cho phép hai người dùng chưa từng liên lạc trước đây để chia sẻ một bí mật chung. Một trong những cách dễ nhất để hiểu các nguyên tắc cơ bản là sử dụng phép loại suy màu sắc. Hãy tưởng tượng bạn có kịch bản sau

Chứng chỉ tự ký SSL SSL của Python

Trong sơ đồ này, bạn đang cố liên lạc với một con sóc bí mật mà bạn chưa từng gặp trước đây, nhưng một tên gián điệp có thể nhìn thấy mọi thứ bạn gửi. Bạn biết về mã hóa đối xứng và muốn sử dụng nó, nhưng trước tiên bạn cần chia sẻ một bí mật. May mắn thay, cả hai bạn đều có khóa riêng. Thật không may, bạn không thể gửi khóa riêng của mình vì gián điệp sẽ nhìn thấy nó. Vậy bạn làm gì?

Điều đầu tiên bạn cần làm là thỏa thuận với đối tác của mình về một màu, chẳng hạn như màu vàng

Chứng chỉ tự ký SSL SSL của Python

Lưu ý ở đây rằng điệp viên có thể nhìn thấy màu chung, bạn và Sóc bí mật cũng vậy. Màu được chia sẻ được công khai một cách hiệu quả. Bây giờ, cả bạn và Secret Squirrel kết hợp các khóa riêng của bạn với màu được chia sẻ

Chứng chỉ tự ký SSL SSL của Python

Màu của bạn kết hợp để tạo ra màu xanh lá cây, trong khi màu của Secret Squirrel kết hợp để tạo ra màu cam. Cả hai bạn đã hoàn thành với màu được chia sẻ và bây giờ bạn cần chia sẻ các màu kết hợp của mình với nhau

Chứng chỉ tự ký SSL SSL của Python

Bây giờ bạn đã có khóa riêng của mình và màu kết hợp của Secret Squirrel. Tương tự như vậy, Secret Squirrel có khóa riêng của chúng và màu kết hợp của bạn. Bạn và Sóc bí mật kết hợp màu sắc khá nhanh

Tuy nhiên, điệp viên chỉ có những màu kết hợp này. Cố gắng tìm ra màu gốc chính xác của bạn là rất khó, thậm chí với màu được chia sẻ ban đầu. Điệp viên sẽ phải đến cửa hàng và mua rất nhiều nhạc blues khác nhau để thử. Ngay cả khi đó, thật khó để biết liệu họ có nhìn đúng bóng xanh sau khi kết hợp hay không. Nói tóm lại, khóa riêng của bạn vẫn là riêng tư

Nhưng còn bạn và Secret Squirrel thì sao? . Đây là nơi khóa riêng của bạn quay trở lại. Nếu bạn kết hợp khóa riêng của mình với màu kết hợp mà bạn nhận được từ Con sóc bí mật, thì cả hai bạn sẽ có cùng một màu

Chứng chỉ tự ký SSL SSL của Python

Bây giờ, bạn và Sóc bí mật có cùng màu bí mật chung. Bây giờ bạn đã chia sẻ thành công một bí mật an toàn với một người hoàn toàn xa lạ. Điều này chính xác một cách đáng ngạc nhiên đối với cách thức hoạt động của mật mã khóa công khai. Một tên phổ biến khác cho chuỗi sự kiện này là trao đổi khóa Diffie-Hellman. Trao đổi khóa được tạo thành từ các phần sau

  • Khóa riêng là màu riêng của bạn từ các ví dụ
  • Khóa chung là màu kết hợp mà bạn đã chia sẻ

Khóa riêng là thứ bạn luôn giữ kín, trong khi khóa chung có thể được chia sẻ với bất kỳ ai. Các khái niệm này ánh xạ trực tiếp đến thế giới thực của các ứng dụng Python HTTPS. Giờ đây, máy chủ và máy khách có một bí mật chung, bạn có thể sử dụng mã hóa đối xứng cũ của bạn để mã hóa tất cả các thư tiếp theo

Ghi chú. Mật mã khóa công khai cũng dựa vào một số phép toán để trộn màu. Trang Wikipedia về trao đổi khóa Diffie-Hellman có giải thích hay, nhưng giải thích sâu nằm ngoài phạm vi của hướng dẫn này

Khi bạn liên lạc qua một trang web an toàn, chẳng hạn như trang web này, trình duyệt của bạn và máy chủ sẽ thiết lập một liên lạc an toàn bằng cách sử dụng các nguyên tắc tương tự

  1. Trình duyệt của bạn yêu cầu thông tin từ máy chủ
  2. Trình duyệt của bạn và máy chủ trao đổi khóa công khai
  3. Trình duyệt của bạn và máy chủ tạo khóa riêng được chia sẻ
  4. Trình duyệt của bạn và máy chủ mã hóa và giải mã thư bằng khóa dùng chung này thông qua mã hóa đối xứng

May mắn cho bạn, bạn không cần phải thực hiện bất kỳ chi tiết nào trong số này. Có rất nhiều thư viện tích hợp sẵn và của bên thứ ba có thể giúp bạn bảo mật thông tin liên lạc giữa máy khách và máy chủ của mình

Loại bỏ các quảng cáo

HTTPS giống như thế nào trong thế giới thực?

Với tất cả thông tin này về mã hóa, hãy thu nhỏ một chút và nói về cách các ứng dụng Python HTTPS thực sự hoạt động trong thế giới thực. Mã hóa chỉ là một nửa của câu chuyện. Khi truy cập một trang web an toàn, có hai thành phần chính cần thiết

  1. Mã hóa chuyển đổi bản rõ thành bản mã và ngược lại
  2. Xác thực xác minh rằng một người hoặc vật là người mà họ nói họ là

Bạn đã nghe rất nhiều về cách hoạt động của mã hóa, nhưng còn xác thực thì sao? . PKI giới thiệu một khái niệm quan trọng khác vào hệ sinh thái bảo mật, được gọi là chứng chỉ

Chứng chỉ giống như hộ chiếu cho Internet. Giống như hầu hết mọi thứ trong thế giới máy tính, chúng chỉ là những khối dữ liệu trong một tệp. Nói chung, chứng chỉ bao gồm các thông tin sau

  • Cấp cho. xác định người sở hữu chứng chỉ
  • phát hành bởi. xác định ai đã cấp chứng chỉ
  • Thời gian hiệu lực. xác định khung thời gian mà chứng chỉ có hiệu lực

Cũng giống như hộ chiếu, chứng chỉ chỉ thực sự hữu ích nếu chúng được tạo và công nhận bởi một số cơ quan có thẩm quyền. Việc trình duyệt của bạn biết về mọi chứng chỉ của mọi trang web bạn truy cập trên Internet là không thực tế. Thay vào đó, PKI dựa trên một khái niệm được gọi là Tổ chức phát hành chứng chỉ (CA)

Cơ quan cấp chứng chỉ chịu trách nhiệm cấp chứng chỉ. Họ được coi là bên thứ ba đáng tin cậy (TTP) trong PKI. Về cơ bản, các thực thể này đóng vai trò là cơ quan có thẩm quyền hợp lệ đối với chứng chỉ. Giả sử bạn muốn đến thăm một quốc gia khác và bạn có hộ chiếu với tất cả thông tin của mình trên đó. Làm thế nào để nhân viên xuất nhập cảnh ở nước ngoài biết rằng hộ chiếu của bạn chứa thông tin hợp lệ?

Nếu bạn tự điền tất cả thông tin và ký tên, thì mỗi nhân viên nhập cư ở mỗi quốc gia mà bạn muốn đến sẽ cần biết cá nhân bạn và có thể chứng thực rằng thông tin ở đó thực sự chính xác

Một cách khác để xử lý việc này là gửi tất cả thông tin của bạn cho Bên thứ ba đáng tin cậy (TTP). TTP sẽ điều tra kỹ lưỡng thông tin bạn cung cấp, xác minh yêu cầu của bạn và sau đó ký vào hộ chiếu của bạn. Điều này hóa ra thực tế hơn nhiều vì các nhân viên nhập cư chỉ cần biết các bên thứ ba đáng tin cậy

Kịch bản TTP là cách các chứng chỉ được xử lý trong thực tế. Quá trình diễn ra như thế này

  1. Tạo một yêu cầu ký chứng chỉ (CSR). Điều này giống như điền thông tin cho thị thực của bạn
  2. Gửi CSR cho bên thứ ba đáng tin cậy (TTP). Điều này giống như gửi thông tin của bạn đến một văn phòng xin thị thực
  3. Xác minh thông tin của bạn. Bằng cách nào đó, TTP cần xác minh thông tin bạn cung cấp. Ví dụ, hãy xem cách Amazon xác thực quyền sở hữu
  4. Tạo khóa công khai. TTP ký CSR của bạn. Điều này tương đương với việc TTP ký visa của bạn
  5. Phát hành Khóa công khai đã được xác minh. Điều này tương đương với việc bạn nhận được thị thực qua đường bưu điện.

Lưu ý rằng CSR được liên kết bằng mật mã với khóa riêng của bạn. Như vậy, cả ba phần thông tin—khóa chung, khóa riêng và tổ chức phát hành chứng chỉ—đều có liên quan theo cách này hay cách khác. Điều này tạo ra cái được gọi là chuỗi tin cậy, vì vậy, giờ đây bạn có một chứng chỉ hợp lệ có thể được sử dụng để xác minh danh tính của bạn

Thông thường, đây chỉ là trách nhiệm của chủ sở hữu trang web. Chủ sở hữu trang web sẽ làm theo tất cả các bước này. Khi kết thúc quá trình này, chứng chỉ của họ cho biết như sau

Từ thời điểm

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
74 đến thời điểm
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
75 Tôi là
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
76 theo
$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
77

Câu này là tất cả những gì một chứng chỉ thực sự nói với bạn. Các biến có thể được điền như sau

  • A là ngày giờ bắt đầu hợp lệ
  • B là ngày giờ kết thúc hợp lệ
  • X là tên của máy chủ
  • Y là tên của Tổ chức phát hành chứng chỉ

Về cơ bản, đây là tất cả những gì một chứng chỉ mô tả. Nói cách khác, có chứng chỉ không nhất thiết có nghĩa là bạn là người như bạn nói, chỉ là bạn được

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
77 đồng ý rằng bạn là người như bạn nói. Đây là nơi phần “đáng tin cậy” của các bên thứ ba đáng tin cậy xuất hiện

TTP cần được chia sẻ giữa máy khách và máy chủ để mọi người đều hài lòng về bắt tay HTTPS. Trình duyệt của bạn đi kèm với rất nhiều Tổ chức phát hành chứng chỉ được cài đặt tự động. Để xem chúng, hãy thực hiện các bước sau

  • Trình duyệt Chrome. Đi tới Cài đặt > Nâng cao > Quyền riêng tư và bảo mật > Quản lý chứng chỉ > Quyền hạn
  • firefox. Chuyển đến Cài đặt > Tùy chọn > Quyền riêng tư & Bảo mật > Xem chứng chỉ > Chính quyền

Điều này bao gồm cơ sở hạ tầng cần thiết để tạo các ứng dụng Python HTTPS trong thế giới thực. Trong phần tiếp theo, bạn sẽ áp dụng các khái niệm này vào mã của riêng mình. Bạn sẽ xem qua các ví dụ phổ biến nhất và trở thành Cơ quan cấp chứng chỉ của riêng bạn cho Secret Squirrels

Loại bỏ các quảng cáo

Ứng dụng HTTPS Python trông như thế nào?

Bây giờ bạn đã hiểu về các phần cơ bản cần thiết để tạo ứng dụng Python HTTPS, đã đến lúc kết hợp tất cả các phần lại với nhau từng phần một cho ứng dụng của bạn từ trước. Điều này sẽ đảm bảo rằng thông tin liên lạc của bạn giữa máy chủ và máy khách được an toàn

Có thể thiết lập toàn bộ cơ sở hạ tầng PKI trên máy của riêng bạn và đây chính xác là những gì bạn sẽ làm trong phần này. Nó không khó như âm thanh, vì vậy đừng lo lắng. Trở thành Tổ chức phát hành chứng chỉ thực sự khó hơn đáng kể so với việc thực hiện các bước bên dưới, nhưng những gì bạn sẽ đọc, ít nhiều, là tất cả những gì bạn cần để chạy CA của riêng mình

Trở thành Cơ quan cấp chứng chỉ

Cơ quan cấp chứng chỉ không gì khác hơn là một cặp khóa công khai và riêng tư rất quan trọng. Để trở thành CA, bạn chỉ cần tạo cặp khóa công khai và khóa riêng

Ghi chú. Trở thành một CA dành cho công chúng sử dụng là một quá trình rất khó khăn, mặc dù có nhiều công ty đã tuân theo quy trình này. Tuy nhiên, bạn sẽ không phải là một trong những công ty đó khi kết thúc hướng dẫn này.

Cặp khóa công khai và khóa riêng ban đầu của bạn sẽ là chứng chỉ tự ký. Bạn đang tạo bí mật ban đầu, vì vậy nếu bạn thực sự muốn trở thành một CA, thì điều cực kỳ quan trọng là khóa riêng tư này phải an toàn. Nếu ai đó có quyền truy cập vào cặp khóa công khai và riêng tư của CA, thì họ có thể tạo chứng chỉ hoàn toàn hợp lệ và bạn không thể làm gì để phát hiện vấn đề ngoại trừ ngừng tin tưởng CA của mình

Với cảnh báo đó, bạn có thể tạo chứng chỉ ngay lập tức. Để bắt đầu, bạn sẽ cần tạo khóa riêng. Dán phần sau vào một tệp có tên

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
79

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
19

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
100 tạo khóa riêng bằng RSA. Đây là một sự cố của mã

  • Dòng 2 đến 4 nhập các thư viện cần thiết để chức năng hoạt động
  • Dòng 7 đến 9 sử dụng RSA để tạo khóa riêng. Các số ma thuật
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    101 và
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    102 chỉ là hai giá trị có thể. Bạn có thể đọc thêm về lý do tại sao hoặc chỉ tin tưởng rằng những con số này hữu ích
  • Dòng 11 đến 12 thiết lập thuật toán mã hóa sẽ được sử dụng trên khóa riêng của bạn
  • Dòng 14 đến 21 ghi khóa riêng của bạn vào đĩa tại
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    103 được chỉ định. Tệp này được mã hóa bằng mật khẩu được cung cấp

Bước tiếp theo để trở thành CA của riêng bạn là tạo khóa công khai tự ký. Bạn có thể bỏ qua yêu cầu ký chứng chỉ (CSR) và ngay lập tức tạo khóa công khai. Dán phần sau vào

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
79

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
30

Ở đây bạn có một chức năng mới

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
105 sẽ tạo khóa công khai tự ký. Đây là cách mã này hoạt động

  • Các dòng 2 đến 5 là các mục nhập cần thiết để chức năng hoạt động
  • Dòng 8 đến 18 xây dựng thông tin về chủ đề của chứng chỉ
  • Dòng 21 sử dụng cùng một tổ chức phát hành và chủ đề vì đây là chứng chỉ tự ký
  • Các dòng 24 đến 25 cho biết khoảng thời gian mà khóa công khai này có hiệu lực. Trong trường hợp này, đó là 30 ngày
  • Dòng 28 đến 38 thêm tất cả thông tin bắt buộc vào đối tượng trình tạo khóa công khai, sau đó cần phải ký
  • Dòng 41 đến 43 ký khóa chung bằng khóa riêng
  • Dòng 45 đến 46 viết khóa công khai cho
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    103

Sử dụng hai chức năng này, bạn có thể tạo cặp khóa riêng và khóa chung khá nhanh trong Python

>>>

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
31

Sau khi nhập các hàm trợ giúp của bạn từ

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
107, trước tiên bạn tạo khóa riêng của mình và lưu nó vào tệp
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
108. Sau đó, bạn chuyển khóa riêng đó vào
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
105 để tạo khóa chung của mình. Trong thư mục của bạn bây giờ bạn sẽ có hai tệp

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
32

Xin chúc mừng. Bây giờ bạn có khả năng trở thành Cơ quan cấp chứng chỉ

Loại bỏ các quảng cáo

Tin tưởng máy chủ của bạn

Bước đầu tiên để máy chủ của bạn trở nên đáng tin cậy là bạn tạo Yêu cầu ký chứng chỉ (CSR). Trong thế giới thực, CSR sẽ được gửi đến Tổ chức phát hành chứng chỉ thực tế như Verisign hoặc Let's Encrypt. Trong ví dụ này, bạn sẽ sử dụng CA mà bạn vừa tạo

Dán mã để tạo CSR vào tệp

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
79 ở trên

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
33

Đối với hầu hết các phần, mã này giống hệt với cách bạn tạo khóa công khai ban đầu của mình. Sự khác biệt chính được nêu dưới đây

  • Dòng 16 đến 19 thiết lập tên DNS thay thế, tên này sẽ hợp lệ cho chứng chỉ của bạn
  • Các dòng 21 đến 25 tạo ra một đối tượng trình tạo khác, nhưng nguyên tắc cơ bản tương tự được áp dụng như trước. Bạn đang xây dựng tất cả các thuộc tính cần thiết cho CSR của mình
  • Dòng 27 ký CSR của bạn bằng khóa riêng
  • Dòng 29 đến 30 ghi CSR của bạn vào đĩa ở định dạng PEM

Bạn sẽ nhận thấy rằng, để tạo CSR, trước tiên bạn cần có khóa riêng. May mắn thay, bạn có thể sử dụng cùng một

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
100 khi bạn tạo khóa riêng của CA. Sử dụng hàm trên và các phương thức được xác định trước đó, bạn có thể thực hiện các thao tác sau

>>>

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
34

Sau khi bạn chạy các bước này trong bảng điều khiển, bạn sẽ nhận được hai tệp mới

  1. # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    112. khóa riêng của máy chủ của bạn
  2. # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    113. CSR của máy chủ của bạn

Bạn có thể xem CSR mới và khóa cá nhân của mình từ bảng điều khiển

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
35

Với hai tài liệu này trong tay, bây giờ bạn có thể bắt đầu quá trình ký chìa khóa của mình. Thông thường, rất nhiều xác minh sẽ xảy ra trong bước này. Trong thế giới thực, CA sẽ đảm bảo rằng bạn sở hữu

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
114 và yêu cầu bạn chứng minh điều đó theo nhiều cách khác nhau

Vì bạn là CA trong trường hợp này, bạn có thể bỏ qua vấn đề đau đầu đó và tạo khóa công khai được xác minh của riêng mình. Để làm điều đó, bạn sẽ thêm một chức năng khác vào tệp

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
79 của mình

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
36

Mã này trông rất giống với

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
105 từ tệp
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
117. Trên thực tế, chúng gần như giống hệt nhau. Sự khác biệt chính như sau

  • Các dòng 8 đến 9 đặt tên chủ đề trên CSR, trong khi tổ chức phát hành dựa trên Cơ quan cấp chứng chỉ
  • Dòng 10 lấy khóa công khai từ CSR lần này. Dòng trong
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    105 xác định đây là CA, ở cuối định nghĩa của
    # client.py
    import os
    import requests
    
    def get_secret_message():
        url = os.environ["SECRET_URL"]
        response = requests.get(url)
        print(f"The secret message is: {response.text}")
    
    if __name__ == "__main__":
        get_secret_message()
    
    119, đã bị xóa
  • Dòng 16 đến 17 sao chép mọi tiện ích mở rộng đã được đặt trên CSR
  • Dòng 20 ký khóa chung với khóa riêng của CA

Bước tiếp theo là kích hoạt bảng điều khiển Python và sử dụng

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
120. Bạn sẽ cần tải CSR của mình và khóa riêng và khóa chung của CA. Bắt đầu bằng cách tải CSR của bạn

>>>

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
37

Trong phần mã này, bạn đang mở tệp

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
113 của mình và sử dụng
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
122 để tạo đối tượng
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
123 của mình. Tiếp theo, bạn sẽ cần tải khóa công khai của CA

>>>

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
38

Một lần nữa, bạn đã tạo một đối tượng

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
124 có thể được sử dụng bởi
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
120. Mô-đun
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
126 có tiện dụng
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
127 để trợ giúp. Bước cuối cùng là tải khóa riêng của CA của bạn

>>>

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
39

Mã này sẽ tải lên khóa riêng của bạn. Nhớ lại từ trước đó rằng khóa riêng của bạn đã được mã hóa bằng mật khẩu bạn đã chỉ định. Với ba thành phần này, giờ đây bạn có thể ký CSR của mình và tạo khóa công khai đã xác minh

>>>

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
0

Sau khi chạy cái này, bạn sẽ có ba tệp khóa máy chủ trong thư mục của mình

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
1

chà. Đó là khá nhiều công việc. Tin tốt là bây giờ bạn đã có cặp khóa riêng và khóa chung, bạn không phải thay đổi bất kỳ mã máy chủ nào để bắt đầu sử dụng nó

Sử dụng tệp

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
6 ban đầu của bạn, hãy chạy lệnh sau để bắt đầu ứng dụng Python HTTPS hoàn toàn mới của bạn

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
2

Xin chúc mừng. Bây giờ bạn có một máy chủ hỗ trợ HTTPS Python đang chạy với cặp khóa công khai-riêng tư của riêng bạn, được ký bởi Cơ quan cấp chứng chỉ của chính bạn

Ghi chú. Có một mặt khác của phương trình xác thực HTTPS Python và đó là ứng dụng khách. Cũng có thể thiết lập xác minh chứng chỉ cho chứng chỉ ứng dụng khách. Điều này đòi hỏi nhiều công việc hơn một chút và không thực sự được nhìn thấy bên ngoài các doanh nghiệp. Tuy nhiên, xác thực ứng dụng khách có thể là một công cụ rất mạnh

Bây giờ, tất cả những gì còn lại phải làm là truy vấn máy chủ của bạn. Trước tiên, bạn cần thực hiện một số thay đổi đối với mã

$ sudo add-apt-repository ppa:wireshark-dev/stable
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo wireshark
9

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
3

Thay đổi duy nhất so với mã trước đó là từ

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
35 thành
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
131. Nếu bạn cố chạy mã này, thì bạn sẽ gặp lỗi

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
4

Đó là thông báo lỗi khá khó chịu. Phần quan trọng ở đây là thông điệp

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
132. Những từ này sẽ quen thuộc hơn với bạn bây giờ. Về cơ bản, nó nói như sau

máy chủ cục bộ. 5683 đã cho tôi một chứng chỉ. Tôi đã kiểm tra tổ chức phát hành chứng chỉ mà họ cấp cho tôi và theo tất cả các Tổ chức phát hành chứng chỉ mà tôi biết, tổ chức phát hành đó không phải là một trong số họ

Nếu bạn cố điều hướng đến trang web của mình bằng trình duyệt, thì bạn sẽ nhận được thông báo tương tự

Chứng chỉ tự ký SSL SSL của Python

Nếu bạn muốn tránh thông báo này, thì bạn phải thông báo cho

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
133 về Tổ chức phát hành chứng chỉ của mình. Tất cả những gì bạn cần làm là trỏ các yêu cầu vào tệp
# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
134 mà bạn đã tạo trước đó

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
5

Sau khi làm điều đó, bạn sẽ có thể chạy thành công như sau

# client.py
import os
import requests

def get_secret_message():
    url = os.environ["SECRET_URL"]
    response = requests.get(url)
    print(f"The secret message is: {response.text}")

if __name__ == "__main__":
    get_secret_message()
6

Đẹp. Bạn đã tạo một máy chủ HTTPS Python hoạt động đầy đủ và đã truy vấn thành công. Giờ đây, bạn và Sóc bí mật có các tin nhắn mà bạn có thể trao đổi qua lại một cách vui vẻ và an toàn

Loại bỏ các quảng cáo

Phần kết luận

Trong hướng dẫn này, bạn đã học được một số nền tảng cốt lõi của truyền thông an toàn trên Internet ngày nay. Bây giờ bạn đã hiểu các khối xây dựng này, bạn sẽ trở thành một nhà phát triển tốt hơn và an toàn hơn

Trong suốt hướng dẫn này, bạn đã hiểu được một số chủ đề

  • mật mã
  • HTTPS và TLS
  • cơ sở hạ tầng nơi công cộng
  • giấy chứng nhận

Nếu thông tin này khiến bạn quan tâm, thì bạn thật may mắn. Bạn hầu như không làm trầy xước bề mặt của tất cả các sắc thái liên quan đến mọi lớp. Thế giới bảo mật không ngừng phát triển và các kỹ thuật cũng như lỗ hổng mới luôn được phát hiện. Nếu bạn vẫn còn thắc mắc, vui lòng liên hệ trong phần nhận xét bên dưới hoặc trên Twitter

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Khám phá HTTPS và Mật mã học trong Python

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Chứng chỉ tự ký SSL SSL của Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Logan Jones

Chứng chỉ tự ký SSL SSL của Python
Chứng chỉ tự ký SSL SSL của Python

Xin chào, tôi là Logan, một cộng tác viên mã nguồn mở, nhà văn cho Real Python, nhà phát triển phần mềm và luôn cố gắng cải thiện. Hãy liên hệ và chúng ta hãy cùng nhau trở nên tốt hơn

» Thông tin thêm về Logan


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Chứng chỉ tự ký SSL SSL của Python

Aldren

Chứng chỉ tự ký SSL SSL của Python

Brad

Chứng chỉ tự ký SSL SSL của Python

Geir Arne

Chứng chỉ tự ký SSL SSL của Python

Jaya

Chứng chỉ tự ký SSL SSL của Python

Joanna

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Chứng chỉ tự ký SSL SSL của Python

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Làm cách nào để đặt chứng chỉ SSL trong 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ỉ.

Tôi có thể tự sử dụng không

Khi sử dụng SSL cho các ứng dụng phi sản xuất hoặc thử nghiệm khác bạn có thể sử dụng chứng chỉ SSL tự ký . Mặc dù chứng chỉ thực hiện mã hóa đầy đủ nhưng khách truy cập vào trang web của bạn sẽ thấy cảnh báo của trình duyệt cho biết rằng chứng chỉ không đáng tin cậy.

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

Python nhận chứng chỉ máy chủ SNI .
Tạo kết nối SSL với tên và cổng DNS đã cho
Tạo một SSLContext
Tạo SSLSocket từ kết nối và ngữ cảnh được tạo ở bước 1 và 2
Nhận chứng chỉ từ ổ cắm và chuyển đổi nó thành đối tượng X509
Đóng ổ cắm
Trả lại chứng chỉ

Làm cách nào để bỏ qua xác minh SSL trong Python?

Phương pháp 1. Truyền verify=False cho phương thức yêu cầu Cùng với URL cũng truyền tham số verify=False cho phương thức theo thứ tự .