簡體   English   中英

Python簡單的SSL通信

[英]Python simple SSL communication

我想在客戶端和用 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 ciphers=ciphers)

文件“/usr/lib/python3.4/ssl.py”,第 509 行,在init raise ValueError("certfile must be specified for server-side "

ValueError:必須為服務器端操作指定證書文件

拜托,我可不想一個復雜的SSL連接,我只是尋找到客戶端和服務器之間的數據進行加密,可能最簡單的方法,就像ncat--ssl選項( ncat --ssl -l -p 12345來自服務器端,而ncat --ssl 127.0.0.1 12345來自客戶端)。

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

您可以使用openssl生成自簽名證書,並在wrap_socket中指定certfile屬性和keyfile屬性服務器端

生成RSA公鑰/私鑰對

openssl genrsa -out private.pem 2048

生成自簽名證書

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

使用SSL作為安全協議將需要您創建或購買SSL證書,因為這是握手的必需部分。

來自RFC 6101

5.6.2。 服務器證書

如果要對服務器進行身份驗證(通常是這種情況),則服務器會在服務器問候消息之后立即發送其證書。 證書類型必須適合
選擇的密碼套件的密鑰交換算法,通常是X.509.v3證書

將您的證書文件傳遞給包裝器:

 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM