Python简单的SSL通信

时间:2016-05-10 14:33:13

标签: linux python-3.x ssl server

我想在客户端和用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()

以下是我在服务器端出现的错误:

  

追踪(最近一次呼叫最后一次):

     

文件“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       提高ValueError(“必须为服务器端指定certfile”

     

ValueError:必须为服务器端操作指定certfile

请,我不想要复杂的SSL连接,我只想找到最简单的方法来加密客户端和服务器之间的数据,就像ncat选项--ssl一样(服务器端ncat --ssl -l -p 12345,客户端ncat --ssl 127.0.0.1 12345。)

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

来自RFC 6101

  

5.6.2。服务器证书

     

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

答案 2 :(得分:0)

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

 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