63 lines
1.4 KiB
Python
63 lines
1.4 KiB
Python
# -*- coding: latin-1 -*-
|
|
#
|
|
# Copyright (C) AB Strakt
|
|
# Copyright (C) Jean-Paul Calderone
|
|
# See LICENSE for details.
|
|
|
|
"""
|
|
Simple SSL client, using blocking I/O
|
|
"""
|
|
|
|
import os
|
|
import socket
|
|
import sys
|
|
|
|
from OpenSSL import SSL, crypto
|
|
|
|
|
|
def verify_cb(conn, cert, errnum, depth, ok):
|
|
certsubject = crypto.X509Name(cert.get_subject())
|
|
commonname = certsubject.commonName
|
|
print('Got certificate: ' + commonname)
|
|
return ok
|
|
|
|
|
|
if len(sys.argv) < 3:
|
|
print('Usage: python client.py HOST PORT')
|
|
sys.exit(1)
|
|
|
|
|
|
dir = os.path.dirname(sys.argv[0])
|
|
if dir == '':
|
|
dir = os.curdir
|
|
|
|
|
|
# Initialize context
|
|
ctx = SSL.Context(SSL.SSLv23_METHOD)
|
|
ctx.set_options(SSL.OP_NO_SSLv2)
|
|
ctx.set_options(SSL.OP_NO_SSLv3)
|
|
ctx.set_verify(SSL.VERIFY_PEER, verify_cb) # Demand a certificate
|
|
ctx.use_privatekey_file(os.path.join(dir, 'client.pkey'))
|
|
ctx.use_certificate_file(os.path.join(dir, 'client.cert'))
|
|
ctx.load_verify_locations(os.path.join(dir, 'CA.cert'))
|
|
|
|
# Set up client
|
|
sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
|
|
sock.connect((sys.argv[1], int(sys.argv[2])))
|
|
|
|
while 1:
|
|
line = sys.stdin.readline()
|
|
if line == '':
|
|
break
|
|
try:
|
|
sock.send(line)
|
|
sys.stdout.write(sock.recv(1024).decode('utf-8'))
|
|
sys.stdout.flush()
|
|
except SSL.Error:
|
|
print('Connection died unexpectedly')
|
|
break
|
|
|
|
|
|
sock.shutdown()
|
|
sock.close()
|