如何通過Python3和ssl實現加密通訊功能

2022-09-29 18:33:09 字數 3687 閱讀 7634

一、說明

1. python標準庫ssl可實現加密通訊

2. ssl庫底層使用openssl,做了面向對像化改造和簡化,但還是可以明顯看出openssl的痕跡

3. 本文先給出python實現的socket通訊,在此基礎上再給出ssl通訊以便讀者更方便地看到socket和ssl在python程式設計中的區別

4. 說到ssl很多人都會想到https,但本質而言ssl是在傳輸層和應用層之間新插入的乙個層,根據不同層無關原則ssl和https並沒有任何繫結關係,ssl之上完全可以是其他任何應用層協議(比如pop/imap/telnet等等)

二、程式實現

2.1 socket通訊實現

客戶端**:

import socket

class client_class:

def send_hello(self):

# 與服務端建立連線

client_socket = socket.socket(socket.af_inet,socket.sock_stream)

client_socket.connect(('127.0.0.1',9999))

# 向服務端傳送訊息

msg = "do i connect with server ?".encode("utf-8")

client_socket.send(msg)

# 接收服務端返回的訊息

msg = client_socket.recv(1024).decode('utf-8')

print(f"receive msg from server : ")

client_socket.close()

if __name__ == "__main__":

client = client_class()

client.send_hello()

服務端**:

import socket

class server_class :

def build_listen(self):

# 監聽埠

server_socket = socket.socket(socket.af_inet,socket.sock_stream)

server_socket.bind(('127.0.0.1',9999))

server_socket.listen(5)

while true:

# 接收客戶端連線

client_socket, addr = server_socket.accept()

# 接收客戶端資訊

msg = client_socket.recv(1024).decode("utf-8")

print(f"receive msg from client :程式設計客棧")

# 向客戶端傳送資訊

msg = f"yes , you h**e client_socketect with server.\r\n".encode("utf-8")

client_socket.send(msg)

client_socket.close()

if __name__ == "__main__":

server = server_class()

server.build_listen()

2.2 ssl通訊實現

客戶端**:

import socket

import ssl

class client_ssl:

def send_hello(self,):

# 生成ssl上下文

context = ssl.sslcontext(ssl.protocol_tls_client)

# 載入信任根證書

context.load_verify_locations('cert/ca.crt')

# 與服務端建立socket連線

with socket.create_connection(('127.0.0.1', 9443)) as

# 將socket打包成ssl socket

# 一定要注意的是這裡的server_hostname不是指服務端ip,而是指服務端證書中設定的cn,我這裡正好設定成127.0.1而已

with context.wrap_socket(sock, server_hostname='127.0.0.1') as ssock:

# 向服務端傳送資訊

程式設計客棧msg = "do i conne with server ?".encode("utf-8")

ssock.send(msg)

# 接收服務端返回的資訊

msg = ssock.recv(1024).decode("utf-8")

print(f"receive msg from server : ")

ssock.close()

if __name__ == "__main__":

client = client_ssl()

client.send_hello()

服務端**:

import socket

import ssl

class server_ssl:

def build_listen(self):

# 生成ssl上下文

context = ssl.sslcontext(ssl.protocol_tls_server)

# 載入伺服器所用證書和私鑰

context.load_cert_chain('cert/server.crt', 'cert/server_rsa_private.pem.unsecure')

# 監聽埠

with socket.socket(socket.af_inet, socket.sock_stream, 0) as sock:

sock.bind(('127.0.0.1', 9443))

sock.listen(5)

# 將socket打包成ssl socket

with context.wrap_socket(sock, server_side=true) as ssock:

while true:

# 接收客戶端連線

client_socket, addr = ssock.accept()

# 接收客戶端資訊

msg = client_socket.recv(1024).decode("utf-8")

print(f"receive msg from client :")

# 向客戶端傳送資訊

msg = f"yes , you h**e clienogjgpvmyt_socketect with server.\r\n".encode("utf-8")

client_socket.send(msg)

client_socket.close()

if __name__ == "__main__":

server = server_ssl()

server.build_listen()

三、執行結果

當前專案結構如圖所示,證書生成可參考:openssl實現雙向認證教程

3.1 socket通訊執行結果

客戶端:

服務端:

3.2 ssl通訊執行結果

客戶端:

服務端:

本文標題: 如何通過python3和ssl實現加密通訊功能

本文位址:

Python3編譯安裝ssl模組問題

1.檢視linux系統中是否安裝了ssl devel包 檢視命令 rpm q openssl devel 安裝命令 安裝成功!2.編譯安裝ssl模組到python3中 說明 python3.6後部分安裝包貌似沒有 with ssl命令了 configure prefix home scrapy us...

通過Python3實現TCP程式設計

偽 ss socket 建立伺服器套接字 ss.bind 把位址繫結到套接字上 ss.listen 監聽連線 最大連線數 info loop 伺服器無限迴圈 cs ss.accept 接受客戶端連線 comm loop 通訊迴圈 cs.recv cs.send 對話 接收 傳送 cs.close 關...

python3 整除 python如何整除

python 的除法運算子有兩個 表示普通除法,使用它除出來的結果與平常數學計算的結果是相同的 即除不盡時,會產生小數部分 而 表示整除,使用它除出來的結果只有整數部分,小數部分將會被捨棄。記住,在 python 3.x 中,除法運算的結果都是浮點型別。例如如下 print 19 4的結果是 19 ...