如何处理原始Python套接字中的ssl连接?

2023-12-22

我正在编写一个程序来下载给定的网页。由于某些限制,我只需要使用原始 python 套接字来进行所有连接。因此,我与给定域(对象的响应标头中的 Host 字段)建立套接字连接,然后发送 GET 请求。现在,当 url 是 https url 时,我认为我需要首先进行 SSL 握手(因为否则我会从服务器收到非 200 OK 响应以及提及 P3P 策略的其他错误响应)。我检查了curl的响应,以检查它如何能够成功下载,而我却没有,结果是curl首先进行SSL握手(这就是所有的区别)。 curl 总是能够成功下载给定的对象,唯一的区别始终是它所做的 SSL 握手。

所以我想知道如何在原始 python 套接字中进行 SSL 握手?基本上我想要一个简单的解决方案,除了使用原始套接字之外,它还允许我做最少的事情。


以下是使用 SLL 的 TCP 客户端的示例。

不确定这是否是下载网页的最佳方式,但它应该回答您的问题“原始 python 套接字中的 SSL 握手”。

您可能需要调整 struct.pack/unpack 但您已经了解了总体思路:

import socket
import ssl
import struct
import binascii
import sys

class NotConnectedException(Exception):
    def __init__(self, message=None, node=None):
        self.message = message
        self.node = node

class DisconnectedException(Exception):
    def __init__(self, message=None, node=None):
        self.message = message
        self.node = node

class Connector:
    def __init__(self):
        pass

    def is_connected(self):
        return (self.sock and self.ssl_sock)

    def open(self, hostname, port, cacert):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.ssl_sock = ssl.wrap_socket(self.sock, ca_certs=cacert, cert_reqs=ssl.CERT_REQUIRED)

        if hostname == socket.gethostname():
            ipaddress = socket.gethostbyname_ex(hostname)[2][0]
            self.ssl_sock.connect((ipaddress, port))
        else:
            self.ssl_sock.connect((hostname, port))

        self.sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)

    def close(self):
        if self.sock: self.sock.close()
        self.sock = None
        self.ssl_sock = None

    def send(self, buffer):
        if not self.ssl_sock: raise NotConnectedException("Not connected (SSL Socket is null)")
        self.ssl_sock.sendall(struct.pack('L', len(buffer)))
        self.ssl_sock.sendall(buffer)

    def receive(self):
        if not self.ssl_sock: raise NotConnectedException("Not connected (SSL Socket is null)")
        data_size_buffer = self.ssl_sock.recv(4)

        if len(data_size_buffer) <= 0:
            raise DisconnectedException()

        data_size = struct.unpack('L', data_size_buffer)[0]
        received_size = 0
        data_buffer = ""

        while received_size < data_size:
            chunk = self.ssl_sock.recv(1024)
            data_buffer += chunk
            received_size += len(chunk)

        return data_buffer

然后你像这样使用这个类:

    connector = Connector.Connector()
    connector.open(server_ip, server_port, path_to_the_CA_cert.pem)
    connector.send(your_data)
    response = connector.receive()
    connector.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理原始Python套接字中的ssl连接? 的相关文章

  • 使用 Tkinter 进行多线程 Python

    我用这些函数在画布上画小圆圈 这是绘制圆圈的函数 class Fourmis def init self can posx posy name radius self can can self largeur can int self ca
  • 使用 theano 进行多处理

    我正在尝试将 theano 与 cpu 多处理和神经网络库 Keras 结合使用 I use device gpu标记并加载 keras 模型 然后 为了提取超过一百万张图像的特征 我使用多处理池 该函数看起来像这样 from keras
  • 如何从字典列表中查找键的值?

    如何从字典列表中获取给定键的值 mylist powerpoint color blue client name Sport Parents Regrouped sort order ascending chart layout 1 cha
  • 包含可变数据的正则表达式 - ply.lex

    我正在使用 python 模块ply lex编写一个词法分析器 我用正则表达式指定了一些标记 但现在我卡住了 我有一个list of Keywords谁应该是token data是一个包含大约 1000 个关键字的列表 这些关键字都应该被识
  • set() 可以在 Python 进程之间共享吗?

    我正在 Python 2 7 中使用多重处理来处理非常大的数据集 当每个进程运行时 它会将整数添加到共享的 mp Manager Queue 中 但前提是其他进程尚未添加相同的整数 由于您无法对队列进行 in 式成员资格测试 因此我这样做的
  • 使用 gin 索引和 sqlalchemy 返回排名搜索结果

    我为全文搜索设置了 GIN 索引 我想获取与搜索查询匹配的记录列表 按排名排序 记录与搜索查询的匹配程度 对于结果 我只需要记录及其列 不需要用于排序的实际排名值 我有以下查询 它运行良好并从我的 postgresql 数据库返回预期结果
  • 为线条指定颜色

    我试图在 matplotlib 中绘制可变数量的行 其中 X Y 数据和颜色存储在 numpy 数组中 如下所示 有没有办法将颜色数组传递到绘图函数中 这样我就不必采取额外的步骤来单独为每条线分配颜色 我是否应该将 RGB 颜色数组转换为另
  • 在 Qt Creator 中相互公开 QML 组件

    我正在使用 Qt Quick 和 PySide2 开发仪表板应用程序 但在 Qt Creator 的设计模式中公开我的 QML 组件时遇到问题 我的文件夹结构如下所示 myapp mycomponents component1 qml co
  • 来自异常导入 PendingDeprecationWarning ModuleNotFoundError:没有名为“异常”的模块

    我正在尝试使用Python 创建一个word 文档 我在终端中 pip install python docx 我的代码如下所示 from docx import Document document Document document sa
  • 使用每日频率格式化 x 轴

    我正在尝试获取每日数据图 我有 3 个月的数据 每天都很难指出 如何格式化 x 轴 以便我可以获得每个日期 可以使用以下命令更改主要刻度的频率set major locator mdates DayLocator interval 5 如下
  • OkHttp javax.net.ssl.SSLPeerUnverifiedException:主机名domain.com未验证

    我几天来一直在努力让它发挥作用 我正在尝试通过以下方式连接到我的服务器https带有自签名证书 我认为现在没有任何页面或示例是我未读过的 我做了什么 按照本教程创建了 bks 密钥库 http blog crazybob org 2010
  • 我的 R 平方分数为负,但使用 k 倍交叉验证的准确度分数约为 92%

    对于下面的代码 我的 r 平方分数为负 但使用 k 折交叉验证的准确度分数为 92 这怎么可能 我使用随机森林回归算法来预测一些数据 数据集的链接在下面的链接中给出 https www kaggle com ludobenistant hr
  • Django ConnectionAbortedError:[WinError 10053]已建立的连接被主机中的软件中止

    我将 django 与 postgresql 一起使用 每当我尝试保存或删除任何内容时 都会发生此错误 Traceback most recent call last File c program files x86 python35 32
  • 使用 PyQt5 拖放 QLabels

    我正在尝试使用 PyQt5 将 Qlabel 拖放到另一个 Qlabel 上 from PyQt5 QtWidgets import QApplication QWidget QToolTip QPushButton QMessageBox
  • AWS ALB 截断 HTTP 响应

    我有一个带有目标组的 ALB 和运行 PHP API 的 ECS 集群 我正在尝试查询 API 以获得 CSV 响应 但如果请求通过 ALB 我会得到被截断的结果 当我通过 SSH 连接到运行集群的 EC2 实例并尝试手动运行curl 通过
  • 如何更改 PyGame 中声音或音乐的音量?

    如何更改 PyGame 中的音量 例如通过设置更改音量 我制作了 UI 元素 只需要知道如何更改音量即可 我知道我说不清楚 但你可以理解我 请帮忙 更改音量取决于您是否正在播放pygame mixer Sound https www pyg
  • Python 中的数据可用性图表

    我想知道Python是否有一些东西可以绘制具有多个变量的时间序列的数据可用性 下面显示了一个示例 取自Visavail js 时间数据可用性图表 https github com flrs visavail 1 description 以下
  • 多行 x 刻度标签

    我正在尝试制作类似于此 Excel 示例的图 我想知道 x 刻度标签上是否有第二层 例如 5 年统计摘要 我知道我可以使用制作多行刻度标签 n但我希望能够独立地转换这两个级别 这很接近 fig plt figure figsize 8 4
  • 如何在Python中从stdin中逐行读取

    每个人都知道如何在 C 中计算 STDIN 中的字符 但是 当我尝试在 python3 中执行此操作时 我发现这是一个难题 计数器 py import sys chrCounter 0 for line in sys stdin readl
  • 仅在满足条件时添加到字典

    我在用urllib urlencode构建 Web POST 参数 但是有一些值我只想在除None为他们而存在 apple green orange orange params urllib urlencode apple apple or

随机推荐