• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# -*- coding: latin-1 -*-
2#
3# Copyright (C) AB Strakt
4# Copyright (C) Jean-Paul Calderone
5# See LICENSE for details.
6
7"""
8Simple SSL client, using blocking I/O
9"""
10
11import os
12import socket
13import sys
14
15from OpenSSL import SSL, crypto
16
17
18def verify_cb(conn, cert, errnum, depth, ok):
19    certsubject = crypto.X509Name(cert.get_subject())
20    commonname = certsubject.commonName
21    print('Got certificate: ' + commonname)
22    return ok
23
24
25if len(sys.argv) < 3:
26    print('Usage: python client.py HOST PORT')
27    sys.exit(1)
28
29
30dir = os.path.dirname(sys.argv[0])
31if dir == '':
32    dir = os.curdir
33
34
35# Initialize context
36ctx = SSL.Context(SSL.SSLv23_METHOD)
37ctx.set_options(SSL.OP_NO_SSLv2)
38ctx.set_options(SSL.OP_NO_SSLv3)
39ctx.set_verify(SSL.VERIFY_PEER, verify_cb)  # Demand a certificate
40ctx.use_privatekey_file(os.path.join(dir, 'client.pkey'))
41ctx.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)
54        sys.stdout.write(sock.recv(1024).decode('utf-8'))
55        sys.stdout.flush()
56    except SSL.Error:
57        print('Connection died unexpectedly')
58        break
59
60
61sock.shutdown()
62sock.close()
63