Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Khám phá HTTPS và mật mã trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Exploring HTTPS and Cryptography in Python

Show

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 không? Bạn có thể nhận thấ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()
7 trên URL trong trình duyệt của bạn, nhưng nó là gì và làm thế nào để giữ thông tin của bạn an toàn? Hoặc có lẽ bạn muốn tạo một ứng dụng Python HTTPS, nhưng bạn không chắc chắn chính xác điều đó có nghĩa là gì. 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?keep your information safe? Or perhaps you want to create a Python HTTPS application, but you’re not exactly sure what that means. How can you be sure that your web application is safe?

Bạn có thể ngạc nhiên khi biết rằng bạn không 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ữ liên lạc qua internet an toàn. Bạn sẽ thấy các ví dụ cụ thể về cách ứng dụng HTTPS Python giữ an toàn 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ạngnetwork traffic
  • Áp dụng mật mã để giữ dữ liệu an toàncryptography to keep data safe
  • 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)Public Key Infrastructure (PKI)
  • Tạo cơ quan chứng chỉ của riêng bạnCertificate Authority
  • Xây dựng ứng dụng Python HTTPSPython HTTPS application
  • Xác định các cảnh báo và lỗi Python HTTPS thông thườngwarnings and errors

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 chuyển siêu văn bản, củng cố hầu hết các liên lạc 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 một tác nhân người dùng, như trình duyệt web của bạn, giao tiếp với một máy chủ web, như realpython.com. Ở đây, một sơ đồ đơn giản hóa của truyền thông HTTP:HyperText Transfer Protocol, which underpins most of the communications that go on when you’re surfing your favorite websites. More specifically, HTTP is how a user agent, like your web browser, communicates with a web server, like realpython.com. Here’s a simplified diagram of HTTP communications:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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, sự cố của từng bước:

  1. Bạn bảo trình duyệt của bạn đ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()
    
    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ủ.HTTP request to the server.
  4. Máy chủ nhận được yêu cầu HTTP và phân tích cú pháp.
  5. Máy chủ phản hồi với phản hồi HTTP.HTTP response.
  6. Máy tính của bạn nhận được, 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 của HTTP. Bạn yêu cầu một 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. Trong thực tế, điều này hầu như luôn luôn TCP qua IP (mặc dù Google đang cố gắng tạo ra một sự thay thế). Nếu bạn cần bồi dưỡng, sau đó kiểm tra lập trình ổ cắm trong Python (Hướng dẫn).

Khi các giao thức đi, 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 pháp mô tả những gì hành động mà khách hàng muốn thực hiện. Phương pháp 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 pháp khác có sẵn, 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.
    describes what action the client wants to perform. The method for static content is typically
    # 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, though there are others available, like
    $ 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, and
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    2.
  • Đường dẫn biểu thị cho máy chủ mà 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.
    indicates to the server what web page you would like to request. For example, the path of this page is
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    3.
  • Phiên bản 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. is one of several HTTP versions, like 1.0, 1.1, or 2.0. The most common is probably 1.1.
  • Các tiêu đề giúp mô tả thông tin bổ sung cho máy chủ. help describe additional information for the server.
  • Cơ thể 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 nó điển hình cho một số phương pháp có một cơ thể, như
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    0.
    provides the server with information from the client. Though this field is not required, it’s typical for some methods to have a body, like a
    $ 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 với phản hồi HTTP. Phản hồi HTTP chứa các yếu tố sau:

  • Phiên bản xác định phiên bản HTTP, thường sẽ giống như phiên bản yêu cầu. identifies the HTTP version, which will typically be the same as the request’s version.
  • 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. Có khá nhiều mã trạng thái. indicates whether a request was completed successfully. There are quite a few status codes.
  • Thông báo trạng thái cung cấp một thông điệp có thể đọc được của con người giúp mô tả mã trạng thái. provides a human-readable message that helps describe the status code.
  • 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. allow the server to respond with additional metadata about the request. These are the same concept as request headers.
  • 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. carries the content. Technically, this is optional, but typically it contains a useful resource.

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

HTTPS là gì?

Bây giờ bạn đã hiểu thêm một chút về HTTP, HTTPS là gì? Tin tốt là, bạn đã biết điều này! HTTPS là viết tắt của giao thức chuyển siêu văn bản an toàn. Về cơ bản, HTTPS là cùng một giao thức với HTTP nhưng với hàm ý thêm rằng thông tin liên lạc được bảo mật.HyperText Transfer Protocol Secure. Fundamentally, HTTPS is the same protocol as HTTP but with the added implication that the communications are secure.

HTTPS không viết lại bất kỳ nguyên tắc cơ bản nào của HTTP mà nó đã xây dựng. 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ật mã mã hóa thông tin trước khi nó gửi qua mạng.cryptographic protocols that encrypt the information before it’s sent over a network.

Vì vậy, tại sao tạo ra sự tách biệt này? Tại sao không giới thiệu sự phức tạp vào chính giao thức HTTP? Câu trả lời là tính di động. Đảm bảo truyền thông 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ười khác trên nhiều ứng dụng khác nhau:portability. Securing communications is an important and hard problem, but HTTP is only one of many protocols that require security. There are countless others across a wide variety of applications:

  • E-mail
  • Tin khẩn
  • VoIP (Voice Over IP)

Có những người khác, là tốt! Nếu mỗi giao thức này phải tạo ra cơ chế bảo mật của riêng họ, 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 liên lạc.

Hầu như tất cả cá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 được những điều cơ bản của giao tiếp an toàn cùng với cách áp dụng cụ thể cho HTTPS.

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

Truyền thông 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 thế giới di chuyển trực tuyến, bao gồm các ngân hàng và các trang web chăm sóc sức khỏe, nó ngày càng trở nên quan trọng hơn đối với các nhà phát triển để tạo ra các ứng dụng Python HTTPS. Một lần nữa, HTTPS chỉ là HTTP trên TLS hoặc SSL. TLS được thiết kế để cung cấp sự riêng tư từ những người nghe lén. 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á những khái niệm này một cách sâu sắc bằng cách thực hiện như sau:

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

Bắt đầu nào!

Tạo một ứng dụng ví dụ

Giả sử bạn là người lãnh đạo của một câu lạc bộ Python mát mẻ được gọi là Squirrels. Những con sóc, là bí mật, đòi hỏi một thông điệp bí mật để tham dự các cuộc họp của họ. Là người lãnh đạo, bạn chọn thông điệp bí mật, thay đổi cho mỗi cuộc họp. Tuy nhiên, đôi khi, bạn rất khó để gặp 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 thông điệp bí mật cho chính họ.

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

  • Bình để xây dựng một ứng dụng web to build a web application
  • UWSGI như một máy chủ sản xuất as a production server
  • Yêu cầu tập thể dục máy chủ của bạn to exercise your server

Để 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

$ 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 bình:

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE

Ứng dụng Bình này sẽ hiển thị thông báo bí mật bất cứ khi nào ai đó truy cập đườ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. Không có cách nào, bạn triển khai ứng dụng của mình trên máy chủ bí mật của mình và chạy nó:

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app

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

$ 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ì tất cả mọi người trong những con sóc bí mật đều biết Python, bạn quyết định giúp đỡ họ. Bạn viết một tập lệnh có 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 tin nhắn 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 điệp bí mật miễn là chúng có bộ biến môi trường

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
0. Trong trường hợp này,
$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
0 là
$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
2. 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à bảo họ giữ bí mật và an toàn.

Trong khi điều này có vẻ ổn, hãy yên tâm với nó thì 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 sẽ an toàn. Nhưng ngay cả khi nhóm của bạn bằng cách nào đó đã quản lý để giữ cho URL an toàn, thông điệp bí mật của bạn vẫn không được bảo mật. Để chứng minh lý do tại sao bạn sẽ cần biết một chút về lưu lượng truy cập mạng. Để làm điều này, bạn sẽ sử dụng một công cụ gọi là Wireshark.Wireshark.

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 thấy những gì xảy ra trên 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 cảm thấy tự do nếu bạn muốn theo dõi. Trang tải xuống có sẵn một số trình cài đặt:

  • MacOS 10.12 trở lên
  • Windows Installer 64 bit
  • Windows Installer 32 bit

Nếu bạn sử dụng Windows hoặc Mac, thì bạn sẽ 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 nên có một wireshark đang chạy.

Nếu bạn ở trên 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ể. Bạn có thể cài đặt Wireshark với 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 nên được gặp một màn hình trông giống như thế này:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Với việc chạy Wireshark, đó là thời gian để 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 bất cứ ai xem. Điều này có nghĩa là ngay cả khi ai đó không có

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
0 của bạn, họ vẫn có thể thấy mọi thứ bạn làm miễn là họ có thể theo dõi lưu lượng trên bất kỳ thiết bị nào giữa bạn và máy chủ.not secure. HTTP will send everything in the clear for anyone to see. What this means is that even if someone doesn’t have your
$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
0, they can still see everything you do as long as they can monitor traffic on any device between you and the server.

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

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app

Đ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 bắt gói này sẽ giúp bạn thấy tất cả lưu lượng truy cập đi và từ máy chủ. Bắt đầu bằng cách chọn Loopback: LO Giao diện trên Wireshark:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Bạn có thể thấy rằng phần Loopback: LO được tô sáng. Điều này hướng dẫn Wireshark giám sát cổng này cho 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

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
4 vào bộ lọc chụp và
$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
5 trong bộ lọc hiển thị:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Cửa sổ mới này khá đơn giản, nhưng thông điệp ở phía dưới cho biết

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
6, cho thấy nó hoạt động. Don Tiết lo lắng rằng không có gì được hiển thị, vì điều đó 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. Để nhận một số dữ liệu, hãy thử chạy máy khách của bạn:

$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail

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 từ trên cao, bây giờ bạn sẽ thấy một số mục trong Wireshark. Nếu tất cả đã diễn ra tốt đẹp, thì bạn sẽ thấy hai mục trông giống như thế này:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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 máy khách đế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:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Đó 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. Khi bạn chọn một trong các mục này, bạn sẽ thấy hàng giữa và dưới cùng với thông tin.

Hàng giữa cung cấp cho bạn một sự cố của 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, một bản tóm tắt nhanh chóng về thông tin 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à ID giao diện 0 (LO) cho giao diện loopback của bạn. This row describes the physical interface used to send the request. In your case, this is probably Interface ID 0 (lo) for your loopback interface.
  2. Thông tin Ethernet: Hàng này cho bạn thấy giao thức Layer-2, bao gồm các địa chỉ MAC nguồn và đích. This row shows you the Layer-2 Protocol, which includes source and destination MAC addresses.
  3. IPv4: Hàng này hiển thị địa chỉ IP nguồn và đích (127.0.0.1). This row displays source and destination IP addresses (127.0.0.1).
  4. TCP: Hàng này bao gồm bắt tay TCP cần thiết để tạo ra một ống dữ liệu đáng tin cậy. This row includes the required TCP handshake in order to create a reliable pipe of data.
  5. HTTP: Hàng này hiển thị thông tin về chính yêu cầu HTTP. This row displays information about the HTTP request itself.

Khi bạn mở rộng lớp giao thức chuyể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:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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

  • 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
    # 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
    $ sudo add-apt-repository ppa:wireshark-dev/stable
    $ sudo apt-get update
    $ sudo apt-get install wireshark
    $ sudo wireshark
    
    7
  • Phiên bản:
    $ SECRET_URL="http://127.0.0.1:5683" python client.py
    The secret message is: fluffy tail
    
    0
    $ SECRET_URL="http://127.0.0.1:5683" python client.py
    The secret message is: fluffy tail
    
    0
  • Tiêu đề:
    $ SECRET_URL="http://127.0.0.1:5683" python client.py
    The secret message is: fluffy tail
    
    1,
    $ SECRET_URL="http://127.0.0.1:5683" python client.py
    The secret message is: fluffy tail
    
    2 và những người khác
    $ SECRET_URL="http://127.0.0.1:5683" python client.py
    The secret message is: fluffy tail
    
    1,
    $ SECRET_URL="http://127.0.0.1:5683" python client.py
    The secret message is: fluffy tail
    
    2, and others
  • Cơ thể: Không có cơ thể No body

Hàng cuối cùng bạn sẽ thấy là một kết xuất dữ liệu hex. Bạn có thể nhận thấy trong bãi Hex này mà bạn thực sự có thể thấy các phần trong yêu cầu HTTP của bạn. Đó là vì yêu cầu HTTP của bạn đã được gửi tại Open. Nhưng những gì về câu trả lời? Nếu bạn nhấp vào phản hồi HTTP, thì bạn sẽ thấy một chế độ xem tương tự:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Một lần nữa, bạn có ba phần giống nhau. Nếu bạn nhìn kỹ vào bãi rác hex, thì bạn sẽ thấy thông điệp bí mật bằng văn bản đơn giản! Đây là một vấn đề lớn đối với những con sóc bí mật. Điều này có nghĩa là bất cứ ai có một số bí quyết kỹ thuật đều có thể rất dễ dàng nhìn 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? Câu trả lời là mật mã.cryptography.

Làm thế nào để mật mã giúp?

Trong phần này, bạn sẽ học một cách để giữ dữ liệu của mình an toàn 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ù chiến thắng này là bước cuối cùng của bạn, nhưng nó sẽ giúp bạn có được một nền tảng vững chắc về cách xây dựng các ứng dụng Python HTTPS.cryptography keys and using them on both your server and your client. While this won’t be your final step, it will help you get a solid foundation for how to build Python HTTPS applications.

Hiểu về cơ bản về mật mã

Cryptography là một cách để bảo mật thông tin liên lạc từ những người nghe lén hoặc đối thủ. Một cách khác để nêu điều này là bạn có thể lấy thông tin bình thường, được gọi là Plaintext và chuyển đổi nó thành văn bản bị xáo trộn, được gọi là CodeText.plaintext, and converting it to scrambled text, called ciphertext.

Mật mã học có thể đáng sợ lúc đầu, nhưng các khái niệm cơ bản là khá dễ tiếp cận. Trên thực tế, bạn có lẽ đã 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 bạn và sử dụng nó để vượt qua các ghi chú trong lớp, thì bạn đã thực hành mật mã. .

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

$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail
3 và chuyển đổi nó thành một cái gì đó không thể hiểu được. Một cách để làm điều này là ánh xạ một số ký tự nhất định lên các ký tự khác nhau. Một cách hiệu quả để làm điều này là thay đổi các nhân vậ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:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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

$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail
4, thì bạn thực sự sẽ gửi tin nhắn
$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail
5. Nếu bạn áp dụng điều này vào
$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail
3, thì giả sử rằng không gian giữ nguyên, bạn sẽ nhận được
$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail
7. Mặc dù nó không hoàn hảo, nhưng nó có thể trông giống như vô nghĩa đối với bất cứ ai nhìn thấy nó.

Xin chúc mừng! Bạn đã tạo ra những gì được biết đến trong mật mã như một mật mã, mô tả cách chuyển đổi bản rõ thành bản mã và trở 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 máy Enigma, mặc dù là một phiên bản đơn giản hơn nhiều.cipher, which describes how to convert plaintext to ciphertext and back. Your cipher, in this case, is described in English. This particular type of cipher is called a substitution cipher. Fundamentally this is the same type of cipher used in the Enigma Machine, albeit a much simpler version.

Bây giờ, nếu bạn muốn nhận được một tin nhắn cho các sóc bí mật, thì trước tiên bạn sẽ cần nói với họ có bao nhiêu chữ cái để thay đổi và sau đó cung cấp cho chúng tin nhắn được mã hóa. Trong Python, điều này có thể trông giống như sau:

CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)

Tại đây, bạn đã tạo ra một hàm gọi là

$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail
8, sẽ lấy bản rõ và chuyển đổi nó thành bản mã. Hãy tưởng tượng bạn có một từ điển
$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail
9 có tất cả các nhân vật được vạch ra. Tương tự, bạn có thể tạo một
CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
0:

DECIPHER = {v: k for k, v in CIPHER.items()}

def decrypt(ciphertext: str):
    return "".join(DECIPHER.get(letter, letter) for letter in ciphertext)

Chức năng này trái ngược với

$ SECRET_URL="http://127.0.0.1:5683" python client.py
The secret message is: fluffy tail
8. Nó sẽ lấy bản mã và chuyển đổi nó thành bản rõ. Trong hình thức của 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ã các tin nhắn. Đối với ví dụ trên, khóa đó là
CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
2. Đó là, mật mã cho biết bạn nên chuyển từng chữ cái theo một ký tự. Điều quan trọng là rất quan trọng để giữ bí mật bởi vì bất kỳ ai có chìa khóa đều có thể dễ dàng giải mã thông điệp của bạn.

Trong thời đại hiện đại, mật mã học 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. Trong khi toán học đằng sau những mật mã này nằm ngoài phạm vi của hướng dẫn này, các khái niệm cơ bản vẫn giống nhau. Bạn có một mật 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à các 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ỡ một kẻ nghe trộm. Bây giờ, hãy để Lừa 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 Python HTTPS

May mắn cho bạn, bạn không 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ô-đun

CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
3 có thể giúp bạn tạo dữ liệu ngẫu nhiên an toàn về mặt 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 là
CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
4. Nó có sẵn trên PYPI, vì vậy bạn có thể cài đặt nó với PIP:

$ pip install cryptography

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

CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
4 vào môi trường ảo của bạn. Với
CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
4 được cài đặt, giờ đây bạn có thể mã hóa và giải mã mọi thứ theo cách bảo mật toán học bằng cách sử dụng phương pháp
CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
7.

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

CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
2. Trong cùng một tĩnh mạch, bạn cần tạo một khóa để Fernet hoạt động chính xác:

>>>

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
0

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

CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
7 và tạo khóa. Chìa khóa chỉ là một loạt các byte, nhưng nó cực kỳ quan trọng là bạn giữ bí mật và an toàn quan trọng 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.

Chìa khóa này hoạt động giống như chìa khóa trước đó. Nó bắt buộc phải thực hiện quá trình chuyển đổi sang bản mã và trở lại Plaintext. Bây giờ nó thời gian cho phần thú vị! Bạn có thể mã hóa một tin nhắn như thế này:

>>>

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
1

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

CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
7 và tạo khóa. Chìa khóa chỉ là một loạt các byte, nhưng nó cực kỳ quan trọng là bạn giữ bí mật và an toàn quan trọng 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.

Chìa khóa này hoạt động giống như chìa khóa trước đó. Nó bắt buộc phải thực hiện quá trình chuyển đổi sang bản mã và trở lại Plaintext. Bây giờ nó thời gian cho phần thú vị! Bạn có thể mã hóa một tin nhắn như thế này:

Trong mã này, bạn đã tạo ra một đối tượng Fernet có tên DECIPHER = {v: k for k, v in CIPHER.items()} def decrypt(ciphertext: str): return "".join(DECIPHER.get(letter, letter) for letter in ciphertext) 0, sau đó bạn có thể sử dụng để mã hóa tin nhắn của mình. Lưu ý rằng tin nhắn bí mật của bạn $ SECRET_URL="http://127.0.0.1:5683" python client.py The secret message is: fluffy tail 3 cần phải là một đối tượng DECIPHER = {v: k for k, v in CIPHER.items()} def decrypt(ciphertext: str): return "".join(DECIPHER.get(letter, letter) for letter in ciphertext) 2 để mã hóa nó. Sau khi mã hóa, bạn có thể thấy rằng DECIPHER = {v: k for k, v in CIPHER.items()} def decrypt(ciphertext: str): return "".join(DECIPHER.get(letter, letter) for letter in ciphertext) 3 là một luồng dài các byte.

Nhờ Fernet, bản mã hóa này có thể bị thao túng hoặc đọc mà không cần chìa 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, đây được gọi là mã hóa đối xứng. Trong phần tiếp theo, bạn sẽ thấy cách đặt mã hóa đối xứng này để sử dụng để giữ dữ liệu của bạn an toàn.

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
2

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

CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
7 bạn đã sử dụng trong phần trước. Chìa khóa hiện được đọc dưới dạng đối tượng
DECIPHER = {v: k for k, v in CIPHER.items()}

def decrypt(ciphertext: str):
    return "".join(DECIPHER.get(letter, letter) for letter in ciphertext)
2 từ môi trường bằng cách sử dụng
DECIPHER = {v: k for k, v in CIPHER.items()}

def decrypt(ciphertext: str):
    return "".join(DECIPHER.get(letter, letter) for letter in ciphertext)
7. Với máy chủ tránh đường, giờ đây bạn có thể tập trung vào máy khách. Dán phần sau vào
DECIPHER = {v: k for k, v in CIPHER.items()}

def decrypt(ciphertext: str):
    return "".join(DECIPHER.get(letter, letter) for letter in ciphertext)
8:

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
3

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

CIPHER = {"a": "z", "A": "Z", "b": "a"} # And so on

def encrypt(plaintext: str):
    return "".join(CIPHER.get(letter, letter) for letter in plaintext)
7.
$ pip install cryptography
0 Làm như sau:

  1. Thực hiện yêu cầu đến máy chủ của bạn. the request to your server.
  2. Lấy các byte thô từ phản ứng. the raw bytes from the response.
  3. Cố gắng giải mã các byte thô. to decrypt the raw bytes.
  4. In tin nhắn được giải mã. the decrypted message.

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 đã mã hóa thành công và giải mã thông điệp bí mật của mình:

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
4

Trong cuộc gọi này, bạn sẽ khởi động máy chủ trên cổng 5683 một lần nữa. Lần này, bạn vượt qua trong một chuỗi được mã hóa

$ pip install cryptography
1 ít nhất là một chuỗi được mã hóa 32 chiều dài. Với máy chủ của bạn đã khởi động lại, bây giờ bạn có thể truy vấn nó:

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
5

Woohoo! Bạn đã có thể mã hóa và giải mã thông điệp của bạn. Nếu bạn thử chạy nó với

$ pip install cryptography
1 không hợp lệ, thì bạn sẽ gặp lỗi:

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
6

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? Vâng, vâng, nó là. Để chứng minh điều này, bạn có thể quay lại Wireshark và bắt đầu một bản ghi mới với cùng các bộ lọc như trước đây. Sau khi bạn có thiết lập chụp, hãy chạy lại mã máy khách:secure? Well, yes, it is. To prove this, you can go back to Wireshark and start a new capture with the same filters as before. After you have the capture setup, run the client code again:

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
5

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 tin nhắn 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:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
8

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

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

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

$ pip install cryptography
3 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 HTTP thực sự hoạt động? Đó là nơi mà mã hóa không đối xứng xuất hiện.asymmetric encryption comes into play.

Các phím được chia sẻ như thế nào?

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

Vì vậy, làm thế nào để bạn thay đổi khóa của bạn? Nếu bạn chỉ có một máy chủ và một máy khách, thì đây có thể là một nhiệm vụ nhanh chóng. Tuy nhiên, khi bạn nhận được nhiều máy khách và nhiều máy chủ hơn, ngày càng có nhiều sự phối hợp cần phải xảy ra để thay đổi khóa và giữ bí mật của bạn một cách an toàn.change your key? If you only have one server and one client, then this might be a quick task. However, as you get more clients and more servers, there is more and more coordination that needs to happen in order to change the key and keep your secrets safe effectively.

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. Nó có thể là không thể để bạn cố gắng và khiến mọi người nhớ chìa khóa đó. Khi số khách hàng và máy chủ của bạn phát triển, bạn có thể sẽ sử dụng các khóa dễ nhớ và đoán hơn.

Nếu bạn có thể đối phó với việc thay đổi khóa của mình, thì bạn vẫn còn một vấn đề nữa để giải quyết. Làm thế nào để bạn chia sẻ khóa ban đầu của bạn? Trong ví dụ Squirrels, bạn đã giải quyết vấn đề này bằng cách truy cập vật lý vào từng thành viên. Bạn có thể cung cấp cho mỗi thành viên bí mật và bảo họ giữ bí mật, nhưng hãy nhớ rằng ai đó sẽ là liên kết yếu nhất.share your initial key? In the Secret Squirrels example, you solved this problem by having physical access to each of the members. You could give each member the secret in person and tell them to keep it secret, but remember that someone will be the weakest link.

Bây giờ, giả sử bạn thêm một thành viên vào những con sóc bí mật từ một vị trí vật lý khác. Làm thế nào để bạn chia sẻ bí mật với thành viên này? Bạn có làm cho họ đi máy bay cho bạn mỗi khi chính thay đổi không? Sẽ thật tuyệt nếu bạn có thể đặt khóa bí mật trên máy chủ của mình và tự động chia sẻ nó. 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 cứ ai cũng có thể nhận được chìa 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 điệp bí mật, nhưng bây giờ bạn chỉ có nhiều vấn đề gấp đôi 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.

Những gì bạn cần là cho hai bên chưa bao giờ truyền đạt để có một bí mật chung. Nghe có vẻ không thể, phải không? May mắn thay, ba chàng trai với tên của Ralph Merkle, Whitfield Diffie và Martin Hellman có lưng của bạn. Họ đã giúp chứng minh rằng mật mã khóa công cộng, còn được gọi là mã hóa không đối xứng, là có thể.

Mã hóa không đối xứng cho phép hai người dùng chưa bao giờ giao tiếp 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 một sự tương tự màu sắc. Hãy tưởng tượng bạn có kịch bản sau: allows for two users who have never communicated before to share a common secret. One of the easiest ways to understand the fundamentals is to use a color analogy. Imagine you have the following scenario:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Trong sơ đồ này, bạn đã cố gắng giao tiếp 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 điệp viên có thể 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ó một khóa riêng. Thật không may, bạn có thể gửi khóa riêng của mình vì gián điệp sẽ thấy nó. Vậy bạn làm gì?

Điều đầu tiên bạn cần làm là đồng ý với đối tác của mình trên một màu, như màu vàng:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Lưu ý ở đây rằng gián điệp có thể nhìn thấy màu chia sẻ, cũng như bạn và con sóc bí mật. Màu sắc được chia sẻ là công khai hiệu quả. Bây giờ, cả bạn và con sóc bí mật đều kết hợp các khóa riêng của bạn với màu chia sẻ:public. Now, both you and the Secret Squirrel combine your private keys with the shared color:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

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

Spy, tuy nhiê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 chia sẻ ban đầu. Các điệp viên sẽ phải đến cửa hàng và mua rất nhiều màu xanh lam khác nhau để thử. Ngay cả sau đó, thật khó để biết nếu họ đang nhìn vào màu xanh lá cây phù hợp sau sự kết hợp! Nói tóm lại, khóa riêng của bạn vẫn còn riêng tư.private.

Nhưng còn bạn và con sóc bí mật thì sao? Bạn vẫn không có một bí mật kết hợp! Đây là nơi khóa riêng của bạn 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ẽ kết thúc với cùng một màu:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Bây giờ, bạn và con sóc bí mật có cùng màu bí mật. 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 là chính xác đáng ngạc nhiên đối với cách thức hoạt động của mật mã khóa công cộng. 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 quan trọng được tạo thành từ các phần sau:Diffie-Hellman key exchange. The key exchange is made up of the following parts:

  • Chìa khóa riêng là màu riêng của bạn từ các ví dụ. is your private color from the examples.
  • Chìa khóa công khai là màu kết hợp mà bạn đã chia sẻ. is the combined color that you shared.

Chìa khóa riêng là thứ bạn luôn giữ riêng tư, trong khi khóa công khai có thể được chia sẻ với bất kỳ ai. Những 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. Bây giờ máy chủ và máy khách có bí mật chia sẻ, bạn có thể sử dụng mã hóa đối xứng Pal cũ của mình để mã hóa tất cả các tin nhắn tiếp theo!

Khi bạn giao tiếp qua một trang web an toàn, như trang web này, trình duyệt của bạn và máy chủ đã thiết lập một giao tiếp 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ủ.requests information from the server.
  2. Trình duyệt của bạn và máy chủ trao đổi các khóa công khai.exchange public keys.
  3. Trình duyệt của bạn và máy chủ tạo khóa riêng.generate a shared private key.
  4. Trình duyệt của bạn và các tin nhắn mã hóa và giải mã máy chủ bằng khóa được chia sẻ này thông qua mã hóa đối xứng.encrypt and decrypt messages using this shared key through symmetric encryption.

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 và bên thứ ba có thể giúp bạn giữ an toàn cho khách hàng và máy chủ.

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

Đưa ra 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 PlainText thành CodeText và Back. converts plaintext to ciphertext and back.
  2. Xác thực xác minh rằng một người hoặc sự vật là họ nói họ là ai. verifies that a person or thing is who they say they are.

Bạn đã nghe nhiều về cách thức mã hóa hoạt động, nhưng còn xác thực thì sao? Để hiểu xác thực trong thế giới thực, bạn sẽ cần biết về cơ sở hạ tầng chính của công chúng. 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ỉ.Public Key Infrastructure. PKI introduces another important concept into the security ecosystem, called certificates.

Giấy chứng nhận 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 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 ai sở hữu chứng chỉ identifies who owns the certificate
  • Được cấp bởi: Xác định người đã cấp giấy chứng nhận identifies who issued the certificate
  • Thời gian hợp lệ: Xác định khung thời gian mà chứng chỉ hợp lệ identifies the time frame for which the certificate is valid

Giống như hộ chiếu, chứng chỉ chỉ thực sự hữu ích nếu chúng được tạo ra và công nhận bởi một số cơ quan có thẩm quyền. Nó không thực tế cho 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. Thay vào đó, PKI dựa vào một khái niệm được gọi là cơ quan chứng chỉ (CA).Certificate Authorities (CA).

Cơ quan chứng chỉ chịu trách nhiệm cấp giấy chứng nhận. Họ được coi là một 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 hợp lệ cho một 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 bạn về nó. Làm thế nào để các nhân viên nhập cư ở 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 vào 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 bạn muốn truy cập sẽ cần phải 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ý điều này là gửi tất cả thông tin của bạn vào bên thứ ba đáng tin cậy (TTP). TTP sẽ thực hiện một cuộc điều tra kỹ lưỡng về thông tin bạn cung cấp, xác minh các 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 là 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.Trusted Third Party (TTP). The TTP would do a thorough investigation of the information you provided, verify your claims, and then sign your passport. This turns out to be much more practical because the immigration officers only need to know the trusted third parties.

Kịch bản TTP là cách xử lý chứng chỉ 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. This is like filling out the information for your visa.
  2. Gửi CSR đến 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 vào văn phòng ứng dụng visa. This is like sending your information into a visa application office.
  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ụ, xem Amazon xác nhận quyền sở hữu như thế nào. Somehow, the TTP needs to verify the information you provided. As an example, see how Amazon validates ownership.
  4. Tạo khóa công khai: TTP ký CSR của bạn. Điều này tương đương với TTP ký Visa của bạn. The TTP signs your CSR. This is equivalent to the TTP signing your visa.
  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 của mình trong thư. This is equivalent to you receiving your visa in the mail.

Lưu ý rằng CSR được buộc bằng mật mã với khóa riêng của bạn. Như vậy, cả ba mẩu thông tin, khóa công khai, khóa riêng và cơ quan chứng chỉ, có liên quan theo cách này hay cách khác. Điều này tạo ra những gì được gọi là một chuỗi niềm tin, vì vậy bây giờ 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. Một chủ sở hữu trang web sẽ làm theo tất cả các bước này. Vào cuối quá trình này, chứng chỉ của họ cho biết như sau:

Theo thời gian

$ pip install cryptography
4 đến thời gian
$ pip install cryptography
5 Tôi là
$ pip install cryptography
6 theo
$ pip install cryptography
7

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

  • A là ngày bắt đầu hợp lệ. is the valid start date and time.
  • B là ngày và thời gian kết thúc hợp lệ. is the valid end date and time.
  • X là tên của máy chủ. is the name of the server.
  • Y là tên của cơ quan chứng chỉ. is the name of the Certificate Authority.

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

$ pip install cryptography
7 để đồng ý rằng bạn là người mà bạn nói. Đây là nơi mà phần đáng tin cậy của các bê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 các máy khách và máy chủ để mọi người hài lòng về việc bắt tay HTTPS. Trình duyệt của bạn đi kèm với rất nhiều cơ quan chứng chỉ được cài đặt tự động. Để xem chúng, hãy thực hiện các bước sau:

  • Chrome: Chuyển đến Cài đặt> Nâng cao> Quyền riêng tư và Bảo mật> Quản lý chứng chỉ> Cơ quan chức năng. Go to Settings > Advanced > Privacy and security > Manage certificates > Authorities.
  • Firefox: Chuyển đến Cài đặt> Tùy chọn> Quyền riêng tư & Bảo mật> Xem chứng chỉ> Cơ quan chức năng. Go to Settings > Preferences > Privacy & Security > View Certificates > Authorities.

Đ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 bạn. Bạn sẽ đi qua các ví dụ phổ biến nhất và trở thành cơ quan chứng chỉ của riêng bạn cho những con sóc bí mật!

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

Bây giờ bạn có một sự hiểu biết 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 với nhau từng người một với ứng dụng của bạn từ trước. Điều này sẽ đảm bảo rằng giao tiếp của bạn giữa máy chủ và máy khách được bảo mật.

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 một cơ quan chứng chỉ thực sự khó hơn đáng kể so với thực hiện các bước dưới đây, nhưng những gì bạn sẽ đọc là, ít nhiều, tất cả những gì bạn cần để chạy CA của riêng mình.

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

Một cơ quan chứng chỉ không có 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 ra một cặp khóa công khai và riêng tư.

Cặp khóa công khai và riêng tư ban đầu của bạn sẽ là một chứng chỉ tự ký. Bạn có thể tạo ra bí mật ban đầu, vì vậy nếu bạn thực sự sẽ trở thành CA, thì điều đó cực kỳ quan trọng là khóa riêng này là 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ư 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ừ việc ngừng tin tưởng CA.

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 phải tạo một khóa riêng. Dán phần sau vào một tệp có tên

$ pip install cryptography
9:

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
9

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
00 tạo khóa riêng bằng RSA. Ở đây, một sự cố của mã:

  • Dòng 2 đến 4 Nhập các thư viện cần thiết cho chức năng hoạt động. import the libraries required for the function to work.
  • Dòng 7 đến 9 Sử dụng RSA để tạo khóa riêng. Các số ma thuật
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    01 và
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    02 chỉ là hai giá trị có thể. Bạn có thể đọc thêm về lý do tại sao hoặc chỉ tin rằng những con số này là hữu ích.
    use RSA to generate a private key. The magic numbers
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    01 and
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    02 are just two possible values. You can read more about why or just trust that these numbers are useful.
  • Các 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. set up the encryption algorithm to be used on your private key.
  • Các dòng 14 đến 21 Viết khóa riêng của bạn vào đĩa tại
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    03 được chỉ định. Tệp này được mã hóa bằng mật khẩu được cung cấp.
    write your private key to disk at the specified
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    03. This file is encrypted using the password provided.

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à xây dựng khóa công khai ngay lập tức. Dán phần sau vào

$ pip install cryptography
9:

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
0

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

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
05 sẽ tạo khóa công khai tự ký. Ở đây, cách thức hoạt động của mã này:

  • Dòng 2 đến 5 là nhập khẩu cần thiết cho chức năng hoạt động. are imports required for the function to work.
  • Dòng 8 đến 18 xây dựng thông tin về chủ đề của chứng chỉ. build up information about the subject of the certificate.
  • 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ý. uses the same issuer and subject since this is a self-signed certificate.
  • Các dòng 24 đến 25 chỉ ra phạm vi thời gian trong đó khóa công khai này là hợp lệ. Trong trường hợp này, nó 30 ngày. indicate the time range during which this public key is valid. In this case, it’s 30 days.
  • Các dòng 28 đến 38 Thêm tất cả thông tin cần thiết vào một đối tượng xây dựng khóa công khai, sau đó cần phải được ký. add all required information to a public key builder object, which then needs to be signed.
  • Dòng 41 đến 43 ký khóa công khai với khóa riêng. sign the public key with the private key.
  • Dòng 45 đến 46 Viết khóa công khai ra
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    03.
    write the public key out to
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    03.

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

>>>

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
1

Sau khi nhập các chức năng trợ giúp của bạn từ

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
07, trước tiên bạn tạo khóa riêng của mình và lưu nó vào tệp
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
08. Sau đó, bạn chuyển khóa riêng đó vào
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
05 để tạo khóa công khai của bạn. Trong thư mục của bạn, bây giờ bạn nên có hai tệp:

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
2

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

Tin tưởng vào 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 một cơ quan chứng chỉ thực tế như Verisign hoặc để cho mã hóa. Trong ví dụ này, bạn sẽ sử dụng CA bạn vừa tạo.Certificate Signing Request (CSR). In the real world, the CSR would be sent to an actual Certificate Authority like Verisign or Let’s Encrypt. In this example, you’ll use the CA you just created.

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

$ pip install cryptography
9 từ trên:

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
3

Đối với hầu hết các phần này, mã này giống hệt với cách bạn tạo khóa công khai ban đầu của bạn. 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ế, sẽ có giá trị cho chứng chỉ của bạn. set up alternate DNS names, which will be valid for your certificate.
  • Các dòng 21 đến 25 tạo ra một đối tượng xây dựng khác nhau, nhưng cùng một nguyên tắc cơ bản được áp dụng như trước. Bạn xây dựng tất cả các thuộc tính cần thiết cho CSR của bạn. generate a different builder object, but the same fundamental principle applies as before. You’re building all the required attributes for your CSR.
  • Dòng 27 ký vào CSR của bạn bằng khóa riêng. signs your CSR with a private key.
  • Dòng 29 đến 30 Viết CSR của bạn vào đĩa ở định dạng PEM. write your CSR to disk in PEM format.

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

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
00 từ khi bạn tạo khóa riêng CA của bạn. Sử dụng chức năng trên và các phương thức trước được xác định, bạn có thể thực hiện như sau:

>>>

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
4

Sau khi nhập các chức năng trợ giúp của bạn từ

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
07, trước tiên bạn tạo khóa riêng của mình và lưu nó vào tệp
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
08. Sau đó, bạn chuyển khóa riêng đó vào
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
05 để tạo khóa công khai của bạn. Trong thư mục của bạn, bây giờ bạn nên có hai tệp:

  1. Xin chúc mừng! Bây giờ bạn có khả năng trở thành một cơ quan chứng chỉ. your server’s private key
  2. Tin tưởng vào máy chủ của bạn your server’s CSR

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 một cơ quan chứng chỉ thực tế như Verisign hoặc để cho mã hóa. Trong ví dụ này, bạn sẽ sử dụng CA bạn vừa tạo.

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
5

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

$ pip install cryptography
9 từ trên:

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

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
6

Dòng 16 đến 19 Thiết lập tên DNS thay thế, sẽ có giá trị cho chứng chỉ của bạn.

  • Các dòng 21 đến 25 tạo ra một đối tượng xây dựng khác nhau, nhưng cùng một nguyên tắc cơ bản được áp dụng như trước. Bạn xây dựng tất cả các thuộc tính cần thiết cho CSR của bạn. base the subject name on the CSR, while the issuer is based on the Certificate Authority.
  • Dòng 27 ký vào CSR của bạn bằng khóa riêng. gets the public key from the CSR this time. The line in
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    05 that specifies this is a CA, at the end of the
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    19 definition, has been removed.
  • Dòng 29 đến 30 Viết CSR của bạn vào đĩa ở định dạng PEM. copy any extensions that were set on the CSR.
  • Bạn sẽ nhận thấy rằng, để tạo CSR, bạn sẽ cần một khóa riêng trước. May mắn thay, bạn có thể sử dụng cùng một
    # server.py
    from flask import Flask
    
    SECRET_MESSAGE = "fluffy tail"
    app = Flask(__name__)
    
    @app.route("/")
    def get_secret_message():
        return SECRET_MESSAGE
    
    00 từ khi bạn tạo khóa riêng CA của bạn. Sử dụng chức năng trên và các phương thức trước được xác định, bạn có thể thực hiện như sau:
    signs the public key with the CA’s private key.

Sau khi bạn chạy các bước này trong bảng điều khiển, bạn nên kết thúc với hai tệp mới:

>>>

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
7

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

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
13 của mình và sử dụng
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
22 để tạo đối tượng
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
23 của bạn. Tiếp theo, bạn sẽ cần phải tải khóa công khai CA của bạn:

>>>

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
8

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

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
24 có thể được sử dụng bởi
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
20. Mô -đun
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
26 có
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
27 tiện dụng để giúp đỡ. Bước cuối cùng là tải khóa riêng CA của bạn:

>>>

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
9

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

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
24 có thể được sử dụng bởi
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
20. Mô -đun
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
26 có
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
27 tiện dụng để giúp đỡ. Bước cuối cùng là tải khóa riêng 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()
0

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

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
24 có thể được sử dụng bởi
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
20. Mô -đun
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
26 có
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
27 tiện dụng để giúp đỡ. Bước cuối cùng là tải khóa riêng 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()
1

Mã này sẽ tải lên khóa riêng của bạn. Nhớ lại 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, giờ đây bạn có thể ký CSR của mình và tạo khóa công khai đã được xác minh:

Sau khi chạy này, bạn nên 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()
2

Whew! Đó 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à công cộng, 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()
3

Xin chúc mừng! Bây giờ bạn có một máy chủ hỗ trợ Python HTTPS chạy với cặp khóa công cộng riêng tư của riêng bạn, được ký bởi cơ quan chứng chỉ rất riêng 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()
4

Bây giờ, tất cả những gì còn lại để làm là truy vấn máy chủ của bạn. Đầu tiên, bạn sẽ 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:

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

$ uwsgi --http-socket 127.0.0.1:5683 --mount /=server:app
5 đến
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
31. Nếu bạn cố gắng chạy mã này, thì bạn sẽ gặp lỗi:

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

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
32. Những từ này nên quen thuộc hơn với bạn bây giờ. Về cơ bản, nó nói như sau:

Hướng dẫn python https request with certificate - yêu cầu https python với chứng chỉ

Localhost: 5683 đã cho tôi một chứng chỉ. Tôi đã kiểm tra nhà phát hành chứng chỉ mà nó đã cung cấp cho tôi, và theo tất cả các cơ quan chứng chỉ mà tôi biết, rằng nhà phát hành không phải là một trong số họ.

# 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

Nếu bạn cố gắng điều hướng đến trang web của mình bằng trình duyệt, thì bạn sẽ nhận được một thông báo tương 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()
6

Nếu bạn muốn tránh tin nhắn này, thì bạn phải nói

# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
33 về cơ quan chứng chỉ của bạn! Tất cả những gì bạn cần làm là các yêu cầu điểm tại tệp
# server.py
from flask import Flask

SECRET_MESSAGE = "fluffy tail"
app = Flask(__name__)

@app.route("/")
def get_secret_message():
    return SECRET_MESSAGE
34 mà bạn đã tạo trước đó:

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

Tốt đẹp! Bạn đã tạo ra một máy chủ Python HTTPS hoạt động đầy đủ và đã truy vấn thành công. Bạn và những con sóc bí mật bây giờ có những thông điệp mà bạn có thể giao dịch qua lại hạnh phúc và an toàn!secure communications on the Internet today. Now that you understand these building blocks, you’ll become a better and more secure developer.

Sự 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 các giao tiếp an toàn trên internet ngày hôm 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 This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Exploring HTTPS and Cryptography in Python

Yêu cầu Python có hoạt động cho HTTPS không?

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.verifies SSL certificates for HTTPS requests, just like a web browser.

Yêu cầu có sử dụng certifi không?

Yêu cầu sử dụng chứng chỉ từ Chứng nhận gói.Điều này cho phép người dùng cập nhật chứng chỉ đáng tin cậy của họ mà không thay đổi phiên bản yêu cầu.Trước phiên bản 2.16, các yêu cầu đã gói một bộ CAS gốc mà nó tin cậy, có nguồn gốc từ cửa hàng Mozilla Trust.. This 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.

Yêu cầu có hoạt động với HTTPS không?

Các yêu cầu và phản hồi của HTTP được gửi trong bản rõ, điều đó có nghĩa là bất cứ ai cũng có thể đọc chúng.HTTPS khắc phục vấn đề này bằng cách sử dụng mã hóa TLS/SSL.. HTTPS corrects this problem by using TLS/SSL encryption.

HTTP có thể có chứng chỉ không?

HTTPS: Điều quan trọng nhất đối với các doanh nghiệp, chứng chỉ SSL là cần thiết cho địa chỉ web HTTPS.HTTPS là hình thức an toàn của HTTP và các trang web HTTPS là các trang web có lưu lượng truy cập được mã hóa bởi SSL/TLS.an SSL certificate is necessary for an HTTPS web address. HTTPS is the secure form of HTTP, and HTTPS websites are websites that have their traffic encrypted by SSL/TLS.