【问题标题】:Python simple SSL communicationPython简单的SSL通信
【发布时间】:2016-09-05 14:39:03
【问题描述】:

我想在客户端和用 python 3 编写的服务器之间启动一个简单的 SSL 连接,但是我遇到了错误。

这是服务器代码:

#/usr/bin/python3
import socket
import ssl

HOST, PORT = '0.0.0.0', 12345

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(10)
client, addr = sock.accept()

# WRAP SOCKET
wrappedSocket = ssl.wrap_socket(client, server_side=True, ssl_version=ssl.PROTOCOL_SSLv23, ciphers="ADH-AES256-SHA")

# CONNECT AND PRINT REPLY

print(wrappedSocket.recv(1024))

# CLOSE SOCKET CONNECTION
wrappedSocket.close()

这是客户端代码:

#/usr/bin/python3

import socket
import ssl

HOST, PORT = '127.0.0.1', 12345

# CREATE SOCKE
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# WRAP SOCKET
wrappedSocket = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_SSLv23, ciphers="ADH-AES256-SHA")

# connect and send a message
wrappedSocket.connect((HOST, PORT))
wrappedSocket.send(b"Hello")

wrappedSocket.close()

这是我在服务器端遇到的错误:

Traceback(最近一次调用最后一次):

文件“server.py”,第 18 行,在

wrappedSocket = ssl.wrap_socket(client, server_side=True, ssl_version=ssl.PROTOCOL_SSLv23, ciphers="ADH-AES256-SHA")

文件“/usr/lib/python3.4/ssl.py”,第 890 行,在 wrap_socket 密码=密码)

文件“/usr/lib/python3.4/ssl.py”,第 509 行,在 init 中 raise ValueError("必须为服务器端指定证书文件"

ValueError:必须为服务器端操作指定证书文件

拜托,我不想要复杂的 SSL 连接,我只是在寻找最简单的方法来加密客户端和服务器之间的数据,就像 ncat 使用 --ssl 选项 (ncat --ssl -l -p 12345来自服务器端,ncat --ssl 127.0.0.1 12345 来自客户端)。

PS:我使用的是 Ubuntu 15.10 和 Python 3。

【问题讨论】:

    标签: linux python-3.x ssl server


    【解决方案1】:

    使用 SSL 作为安全协议将要求您创建或购买 SSL 证书,因为这是握手的必需部分。

    来自RFC 6101

    5.6.2。服务器证书

    如果要对服务器进行身份验证(通常是这种情况), 服务器在服务器 hello 消息之后立即发送其证书。证书类型必须适合
    所选密码套件的密钥交换算法,一般为X.509.v3证书

    【讨论】:

    • 有没有其他简单的方法来加密两个节点之间的数据??
    【解决方案2】:

    您可以使用openssl 生成自签名证书,并在wrap_socket 中指定certfile 属性和keyfile 属性服务器端

    生成 RSA 公钥/私钥对

    openssl genrsa -out private.pem 2048

    生成自签名证书

    openssl req -new -x509 -key private.pem -out cacert.pem -days 1095

    【讨论】:

      【解决方案3】:

      将您的证书文件传递给包装器:

       from http.server import HTTPServer, SimpleHTTPRequestHandler
       import ssl
       httpd = HTTPServer(('localhost', 4443), SimpleHTTPRequestHandler)
       httpd.socket = ssl.wrap_socket(httpd.socket, 
                       certfile='/tmp/tcert_key.pem', server_side=True)
       httpd.serve_forever()
      

      然后您必须输入您的自签名安全私钥的密码。集成密钥文件(certfile)可以用cat生成或者在shell中输入:

      键入 tkey.pem tcert.pem > tcert_key.pem

      相当于:

      $ cat file1 file2 > file3

      对于受保护的服务器端案例,可以删除私钥文件的密码。 OpenSSL 提供了工具来做到这一点。例如:

       openssl pkey -in yourkey-with-pass.pem -out yourkey-without-pass.pem
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        相关资源
        最近更新 更多