blob: 56621223be4032af868da4799dd649de1ccbcf54 [file] [log] [blame]
Jean-Paul Calderone3de9f622008-03-12 14:12:19 -04001# -*- coding: latin-1 -*-
Jean-Paul Calderone897bc252008-02-18 20:50:23 -05002#
Jean-Paul Calderonede0a71e2011-03-02 19:55:11 -05003# Copyright (C) AB Strakt
4# Copyright (C) Jean-Paul Calderone
5# See LICENSE for details.
Jean-Paul Calderone8b63d452008-03-21 18:31:12 -04006
Jean-Paul Calderone897bc252008-02-18 20:50:23 -05007"""
8Simple SSL client, using blocking I/O
9"""
10
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010011import os
12import socket
13import sys
14
Jim Shaverb2ff5be2015-04-30 08:26:29 -040015from OpenSSL import SSL, crypto
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010016
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050017
18def verify_cb(conn, cert, errnum, depth, ok):
Jim Shaverb2ff5be2015-04-30 08:26:29 -040019 certsubject = crypto.X509Name(cert.get_subject())
20 commonname = certsubject.commonName
21 print('Got certificate: ' + commonname)
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050022 return ok
23
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010024
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050025if len(sys.argv) < 3:
Jim Shaver8a4a7ae2015-04-29 01:17:33 -040026 print('Usage: python client.py HOST PORT')
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050027 sys.exit(1)
28
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010029
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050030dir = os.path.dirname(sys.argv[0])
31if dir == '':
32 dir = os.curdir
33
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010034
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050035# Initialize context
36ctx = SSL.Context(SSL.SSLv23_METHOD)
Daniƫl van Eedenae8243d2016-01-16 18:00:52 +010037ctx.set_options(SSL.OP_NO_SSLv2)
38ctx.set_options(SSL.OP_NO_SSLv3)
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010039ctx.set_verify(SSL.VERIFY_PEER, verify_cb) # Demand a certificate
40ctx.use_privatekey_file(os.path.join(dir, 'client.pkey'))
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050041ctx.use_certificate_file(os.path.join(dir, 'client.cert'))
42ctx.load_verify_locations(os.path.join(dir, 'CA.cert'))
43
44# Set up client
45sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
46sock.connect((sys.argv[1], int(sys.argv[2])))
47
48while 1:
49 line = sys.stdin.readline()
50 if line == '':
51 break
52 try:
53 sock.send(line)
Jim Shaverb2ff5be2015-04-30 08:26:29 -040054 sys.stdout.write(sock.recv(1024).decode('utf-8'))
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050055 sys.stdout.flush()
56 except SSL.Error:
Jim Shaver71ad3682015-04-29 00:09:14 -040057 print('Connection died unexpectedly')
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050058 break
59
60
61sock.shutdown()
62sock.close()