| # -*- 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() |