【问题标题】:Python socket server handle HTTPS requestPython 套接字服务器处理 HTTPS 请求
【发布时间】:2022-01-13 05:02:34
【问题描述】:

我使用 Python 2.7 和 socket 模块编写了一个套接字服务器。

当我发出 HTTP 请求时,一切都按预期工作:服务器接受它并正确回答。但如果不是(假设)http://a.com 我浏览 https://a.com 我收到某种加密的标头,我不知道如何告诉客户端服务器不支持 HTTPS。

我用谷歌搜索了一下,但没有什么好处。我尝试使用纯 HTTP 进行回复,但浏览器显然忽略了该响应。

如果有人能告诉我一种告诉客户没有 SSL 的方法,那真的会对我有帮助。

提前致谢。

【问题讨论】:

  • 在大多数情况下,会有一个网络服务器 (nginx/apache/etc.) 可以处理您的 python 应用程序的 SSL 和代理。运行一个网络服务器并让 python 监听一个套接字文件或锁定对本地主机的请求。
  • 我不确定是否有办法让您的连接既是 ssl 又是非。在所有情况下,我都认为您需要单独的端口,通常是 80 (http)、443 (https)
  • 谢谢克里斯。但是如果我想要 强制客户端访问 http 呢?我知道这并不安全,只是想知道。
  • nginx可以配置监听,默认为https,serverfault.com/questions/10854/…

标签: python sockets ssl https


【解决方案1】:

我遇到了同样的问题。您必须在代码中配置“ssl”上下文:

import socket, ssl

HOST = "www.youtube.com"
PORT = 443

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_sock = context.wrap_socket(s, server_hostname=HOST)
s_sock.connect((HOST, 443))
s_sock.send(" GET / HTTP/1.1\r\nHost: www.youtube.com\r\n\r\n ".encode())

while True:
    data = s_sock.recv(2048)
    if ( len(data) < 1 ) :
        break
    print(data)

s_sock.close()

【讨论】:

  • 以上代码仅用于处理来自客户端的 HTTPS。我相信服务器端 HTTPS 处理方式不同。
  • 它产生错误:OSError: [WinError 10038] 尝试对不是套接字的东西进行操作。为什么会这样?
  • 你创建了context 但不使用它?
  • 给我这个结果:b'HTTP/1.0 400 Bad Request\r\nContent-Length: 54\r\nContent-Type: text/html; charset=UTF-8\r\n日期:格林威治标准时间 2021 年 4 月 30 日星期五 08:28:45\r\n\r\n错误 400(错误请求)!!1 html>'
【解决方案2】:

试试this。模块名称已更改,因此它们现在是 http.server 模块的一部分(标准安装的一部分) - 请参阅 Python 2 的 SimpleHTTPServer documentation 顶部的注释。但主要问题是您需要获得 SSL 证书以保护连接(我认为最简单的方法是 OpenSSL)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多