我假设你想使用defacto标准进行网络加密SSL(安全套接字层)。
客户端很容易,基本上你用SSL套接字包装你的标准套接字,客户端是内置的,所以没有什么特别的安装或导入。
#!/usr/bin/python3 import socket import sys from builtins import input def main(): try: serverHostNumber = input("Please enter the ip address of the server: \n") serverPortNumber = input("Please enter the port of the server: \n") # create a socket object sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # connection to hostname on the port. sock.connect((serverHostNumber, int(serverPortNumber))) TcpSocket = socket.ssl(sock) while True: data = TcpSocket.recv(1024) print("Server : ", data) sendData = input("Client : ") if sendData == "exit": TcpSocket.close() sys.exit() TcpSocket.send(sendData.encode(encoding='ascii', errors='strict')) except Exception as e: print("The error: ", e) sys.exit() if __name__ == "__main__" : main()
服务器端更难。
首先,您需要安装 pyopenssl
之后你将需要生成一个私钥和一个证书(除非你已经有一个),这在linux上非常简单,只需从命令行运行:
openssl genrsa 1024 > key openssl req -new -x509 -nodes -sha1 -days 365 -key key > cert
对于Windows,您需要 使用这些方法之一
最后,一旦完成所有先决条件,SSl就会为服务器端包装套接字,就像它对客户端一样。
import socket from OpenSSL import SSL context = SSL.Context(SSL.SSLv23_METHOD) context.use_privatekey_file('key') context.use_certificate_file('cert') s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s = SSL.Connection(context, s) s.bind(("0.0.0.0",8000)) s.listen(2) print("I'm waiting for a connection...!") (client, (ip, port)) = s.accept() print("Connection recived from the {}".format(ip)) messageToClient = "You connected to the server sucessfuly.\n" client.send(messageToClient.encode('ascii')) dataRecived = "Message!" while True: dataRecived = client.recv(1024) print("Client :", dataRecived) print("Server :") dataSend = raw_input() client.send(str(dataSend) + "\n") print("Connection has been closed.") client.close() print("Server has been shutdowned.") s.close() def main(): try: print("Server has started.") connectionOrianted() except : print("Maybe connection terminated.") finally: print("Session has closed.")
我没有机会测试这些脚本,但它们应该可以工作。我希望这回答了你的问题。