Hướng dẫn python requests tls version - python yêu cầu phiên bản tls

Có thể thấy phiên bản TLS nào được đàm phán với máy chủ bằng mô -đun Python Requests không? Một cái gì đó tương tự như những gì openssl s_client -connect sẽ trở lại

---
No client certificate CA names sent
---
SSL handshake has read 3043 bytes and written 375 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.1
    Cipher    : ECDHE-RSA-AES256-SHA
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None

Đã hỏi ngày 2 tháng 10 năm 2017 lúc 19:02Oct 2, 2017 at 19:02

Hướng dẫn python requests tls version - python yêu cầu phiên bản tls

PalepalpalepalPalePal

531 Huy hiệu bạc4 Huy hiệu đồng1 silver badge4 bronze badges

4

Sao chép cốt lõi của câu trả lời khác của tôi tại https://stackoverflow.com/a/55462022/6368697 Nếu bạn muốn làm mọi thứ chỉ một lần và để thử nghiệm, một bản vá khỉ có thể là đủ một triển khai thích hợp với bộ điều hợp vận chuyển và cũng hiển thị chứng chỉ thích hợp):

import requests
from requests.packages.urllib3.connection import VerifiedHTTPSConnection

SOCK = None

_orig_connect = requests.packages.urllib3.connection.VerifiedHTTPSConnection.connect

def _connect(self):
    global SOCK
    _orig_connect(self)
    SOCK = self.sock

requests.packages.urllib3.connection.VerifiedHTTPSConnection.connect = _connect

requests.get('https://yahoo.com')
tlscon = SOCK.connection
print 'Cipher is %s/%s' % (tlscon.get_cipher_name(), tlscon.get_cipher_version())
print 'Remote certificates: %s' % (tlscon.get_peer_certificate())
print 'Protocol version: %s' % tlscon.get_protocol_version_name()

Sản lượng này:

Cipher is ECDHE-RSA-AES128-GCM-SHA256/TLSv1.2
Remote certificates: 
Protocol version: TLSv1.2

Đã trả lời ngày 12 tháng 4 năm 2019 lúc 15:05Apr 12, 2019 at 15:05

Hướng dẫn python requests tls version - python yêu cầu phiên bản tls

Patrick Mevzekpatrick MevzekPatrick Mevzek

10.1k16 Huy hiệu vàng34 Huy hiệu bạc 50 Huy hiệu Đồng16 gold badges34 silver badges50 bronze badges

Các yêu cầu của Python là một thư viện rất mạnh mẽ có thể được sử dụng các yêu cầu HTTP. Nó rất dễ sử dụng và có hàng tấn các tính năng tuyệt vời. Trong khi làm việc trên việc tuân thủ CC, tôi cần hạn chế phiên bản TLS thành 1.2 cũng như hạn chế các bộ mật mã trong gói Hello Client Hello. Và tôi cần phải làm điều này thông qua thư viện yêu cầu.

Tôi đã tìm thấy rất nhiều giải pháp trực tuyến nhưng hầu hết chúng đều chứa các triển khai riêng biệt để hạn chế phiên bản TLS và hạn chế các bộ mật mã. Tôi không thể tìm thấy một giải pháp duy nhất có chứa cả hai chức năng và vì vậy tôi phải tự mình đưa ra nó.

Trước khi bạn có thể bắt đầu với mã, hãy đảm bảo rằng bạn đã cài đặt thư viện yêu cầu:

Mã sau (I hèll giải thích các bit và mảnh sau) đạt được chức năng cần thiết. Cuộn xuống xa hơn sau mã để giải thích và kiểm tra:

import ssl
import requests

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.util import ssl_

CIPHERS = (
    'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:
    ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES256-SHA'
)


class TlsAdapter(HTTPAdapter):

    def __init__(self, ssl_options=0, **kwargs):
        self.ssl_options = ssl_options
        super(TlsAdapter, self).__init__(**kwargs)

    def init_poolmanager(self, *pool_args, **pool_kwargs):
        ctx = ssl_.create_urllib3_context(ciphers=CIPHERS, cert_reqs=ssl.CERT_REQUIRED, options=self.ssl_options)
        self.poolmanager = PoolManager(*pool_args,
                                       ssl_context=ctx,
                                       **pool_kwargs)


session = requests.session()
adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
session.mount("https://", adapter)

try:
    r = session.request('GET', 'https://google.com')
    print(r)
except Exception as exception:
    print(exception)

Sau đây là những điểm quan trọng cần lưu ý:

  1. Bạn có thể kiểm soát danh sách mật mã thông qua biến mật mã. Biến đó có một tham số chuỗi của tất cả các bộ mật mã mà bạn cần để cho phép phân tách bằng một trò chơi:. Danh sách các bộ mật mã có sẵn có thể được tìm thấy bằng cách chạy các mật mã của OpenSSL trong thiết bị đầu cuối.CIPHERS variable. That variable takes a string parameter of all the cipher suites that you need to allow separated with a “:” . The list of available cipher suites can be found by running “openssl ciphers” in the terminal.

  2. Bạn có thể kiểm soát các phiên bản TLS nào để hạn chế bằng cách sử dụng các tham số của TLSADAPTER. Nó có thể lấy các đối số sau:TlsAdapter. It can take the following arguments:

    • SSL.OP_NO_TLSV1 (để hạn chế TLS v1)
    • SSL.OP_NO_TLSV1_1 (để hạn chế TLS v1.1)
    • SSL.OP_NO_TLSV1_2 (để hạn chế TLS v1.2)
  3. Bạn có thể kiểm soát phương thức HTTP và URL thông qua các tham số của phiên.Request. Ở đây tôi đã sử dụng phương pháp Get. Tuy nhiên, nếu bạn đang sử dụng bất kỳ phương thức nào khác yêu cầu bạn gửi một thân yêu cầu như POST hoặc đặt thì cũng có thể được thêm vào đây làm đối số.session.request. Here i have used the GET Method. However, if you are using any other method that requires you to send a request body such as POST or PUT then that can also be added here as an argument.

Bây giờ, để kiểm tra điều này liệu chúng tôi có thực sự quản lý để hạn chế các bộ mã hóa và phiên bản TLS hay không, chúng tôi sẽ cần Wireshark là một công cụ phân tích gói rất phổ biến. Nếu bạn chưa có nó, hãy cài đặt nó bằng cách chạy lệnh sau:

sudo apt-get install wireshark

Khi Wireshark được cài đặt, hãy chạy nó.

Hướng dẫn python requests tls version - python yêu cầu phiên bản tls

Trên màn hình này, bạn nên một danh sách các kết nối mạng có sẵn của thiết bị hiện tại của bạn. Ví dụ: trong hình ảnh trên, bạn có thể thấy ENP0S25, WLP3S0, v.v ... Các mạng này liên kết với kết nối Ethernet của bạn, kết nối không dây, v.v. Tôi đã chọn ENP0S25 vì đó là tên của kết nối Ethernet của tôi. Chọn kết nối mạng tùy thuộc vào kết nối mà bạn hiện đang truy cập.

Khi bạn chọn kết nối mạng, bạn nên đến màn hình này liệt kê tất cả các gói được gửi và nhận từ máy của bạn.

Hướng dẫn python requests tls version - python yêu cầu phiên bản tls

Tuy nhiên, bạn sẽ thấy rất nhiều gói ở đây không có ích gì với chúng tôi. Vì vậy, chúng tôi cần lọc xuống lưu lượng truy cập được ghi lại bởi Wireshark bằng địa chỉ IP của máy chủ mà chúng tôi sẽ tấn công. Với mục đích của hướng dẫn này, tôi đã sử dụng địa chỉ IP của Google.

Sao chép dòng sau trong trường văn bản bộ lọc hiển thị và thay thế IP bằng IP của máy chủ mà bạn sẽ kiểm tra nó trên: ip.addr == 216.58.213.227

Bây giờ chạy tập lệnh Python:

Thiết bị đầu cuối sẽ xuất ra một đơn giản, điều đó có nghĩa là yêu cầu đã được nhận thành công.

Tuy nhiên, có khả năng bạn có thể không có lưu lượng truy cập trong Wireshark do thực tế là Google sử dụng rất nhiều địa chỉ IP và địa chỉ IP mà chúng tôi đang sử dụng để lọc dữ liệu gói của chúng tôi có thể không phải là IP mà yêu cầu của chúng tôi đã được gửi. Để khắc phục điều này, chúng tôi cần thêm một mục nhập trong tệp máy chủ.

Mở tệp máy chủ trong bất kỳ trình chỉnh sửa nào có đặc quyền sudo:

và thêm dòng sau:

import requests
from requests.packages.urllib3.connection import VerifiedHTTPSConnection

SOCK = None

_orig_connect = requests.packages.urllib3.connection.VerifiedHTTPSConnection.connect

def _connect(self):
    global SOCK
    _orig_connect(self)
    SOCK = self.sock

requests.packages.urllib3.connection.VerifiedHTTPSConnection.connect = _connect

requests.get('https://yahoo.com')
tlscon = SOCK.connection
print 'Cipher is %s/%s' % (tlscon.get_cipher_name(), tlscon.get_cipher_version())
print 'Remote certificates: %s' % (tlscon.get_peer_certificate())
print 'Protocol version: %s' % tlscon.get_protocol_version_name()
0. Bằng cách này, tất cả các yêu cầu cho Google Google.com sẽ được gửi đến địa chỉ IP 216.58.213.227.216.58.213.227 ip address.

Khi điều này được thực hiện, chạy lại kịch bản Python và bây giờ bạn sẽ thấy gói được ghi lại trong Wireshark.

Hướng dẫn python requests tls version - python yêu cầu phiên bản tls

Ở đây, trong gói Hello Client, chúng ta có thể thấy rằng giao thức là TLSV1.2. Để kiểm tra các bộ mật mã nào được gửi bởi tập lệnh Python, điều hướng đến: Lớp ổ cắm an toàn -> Lớp bản ghi TLSV1.2TLSv1.2. To check which cipher suites were sent by the python script, Navigate to: Secure Sockets Layer -> TLSv1.2 Record Layer -> Handshake Protocol -> Cipher Suites

Hướng dẫn python requests tls version - python yêu cầu phiên bản tls

Ở đây, chúng ta có thể thấy rằng chỉ những cuits mật mã được gửi đến máy chủ để đàm phán TLS mà chúng tôi cho phép trong tập lệnh Python của chúng tôi.

Để kiểm tra thêm điều này, hãy sửa đổi phiên bản TLS và các bộ mật mã bị hạn chế.Thay đổi biến mật mã thành chỉ sau:

CIPHERS = (
    'AES256-SHA'
)

Và thay đổi các đối số phiên bản TLS để hạn chế TLSV1 và TLSV1.2 thay vì TLSV1.1:

adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_2)

Thực hiện lại tập lệnh Python và xem kết quả trong Wireshark.

Hướng dẫn python requests tls version - python yêu cầu phiên bản tls

Bây giờ chúng ta có thể thấy rằng giao thức đang được sử dụng để giao tiếp là TLSV1.1.Ngoài ra, chỉ có một bộ mật mã được gửi bởi khách hàng để đàm phán TLS và đó là một bộ mà chúng tôi đã chỉ định.

Tôi hy vọng rằng điều này là hữu ích!Xin vui lòng liên hệ với tôi trong trường hợp bạn gặp phải bất kỳ vấn đề nào.Chúc mừng!