Frage

Ich versuche, eine generische Server-Client-Anwendung zu schreiben, die die Lage sein, Daten zwischen Servern auszutauschen. Ich habe schon einige OpenSSL-Dokumente las über, und ich habe erfolgreich eingerichtet meinen eigenen CA und ein Zertifikat (und private Schlüssel) für Testzwecke erstellt.

Ich bin mit Python 2.3 stecken, so dass ich nicht den Standard „ssl“ Bibliothek verwenden kann. Stattdessen bin ich mit pyopenssl stecken, die nicht schlecht sein, aber es gibt nicht viele Dokumente gibt es.

Meine Frage ist wirklich nicht darum, daran zu arbeiten. Ich bin mehr verwirrt über die Zertifikate und wo sie gehen müssen.

Hier sind meine zwei Programme, die Arbeit:

Server:

#!/bin/env python

from OpenSSL import SSL
import socket
import pickle

def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok


ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb)

# ??????
ctx.use_privatekey_file('./Dmgr-key.pem')
ctx.use_certificate_file('Dmgr-cert.pem')
# ??????
ctx.load_verify_locations('./CAcert.pem')

server = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))

server.bind(('', 50000))
server.listen(3)

a, b = server.accept()

c = a.recv(1024)
print(c)

Auftraggeber:

from OpenSSL import SSL
import socket
import pickle


def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok

ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER, verify_cb)

# ??????????
ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')
# ?????????
ctx.load_verify_locations('/home/justin/code/work/CA/CAcert.pem')

sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.connect(('10.0.0.3', 50000))

a = Tester(2, 2)
b = pickle.dumps(a)
sock.send("Hello, world")

sock.flush()
sock.send(b)
sock.shutdown()
sock.close()

Ich fand diese Informationen von ftp://ftp.pbone.net/mirror/ftp.pld-linux.org/dists/2.0/PLD/i586/PLD/RPMS/python-pyOpenSSL -examples-0.6-2.i586.rpm die einige Beispiel-Skripte enthält.

Wie Sie sammeln können, verstehe ich nicht vollständig die Abschnitte zwischen dem „# ????????.“ Ich verstehe nicht, warum das Zertifikat und den privaten Schlüssel auf dem Client und dem Server benötigt werden. Ich bin mir nicht sicher, wo jeder gehen sollte, sollte aber nicht ich brauche nur einen Teil des Schlüssels zu verteilen (wahrscheinlich der öffentliche Teil)? Sie untergräbt den Zweck, mit asymmetrischen Schlüsseln, wenn Sie noch beide auf jedem Server benötigen, nicht wahr?

Ich habe versucht, abwechselnd entweder die pTaste oder cert auf jeder Box zu entfernen, und ich erhalte den folgenden Fehler unabhängig davon, welche ich entfernen:

  

OpenSSL.SSL.Error: [( 'SSL-Routinen', 'SSL3_READ_BYTES', 'SSLv3- Alarm Handshake-Fehler'), ( 'SSL-Routinen', 'SSL3_WRITE_BYTES', 'ssl Handshake-Fehler')]

Könnte jemand erklären, wenn dies das erwartete Verhalten für SSL ist. Muss ich für alle meine Kunden den privaten Schlüssel und Öffentlichkeit müssen verteilen wirklich cert? Ich versuche, keine großen Sicherheitsprobleme zu vermeiden, und private Schlüssel undicht würde dazu neigen, ein großer zu sein ...

Danke für die Hilfe!

=============================================== ===================

Dank caf mir geholfen herauszufinden, die Probleme aus. Auf der Grundlage seiner Empfehlung, habe ich zwei neue Zertifikat Paare: Spaceman und dmgr. Ich habe beide dann der „Spaceman“ Teile (Schlüssel, cert) im Client-Programm und das gleiche gilt für die „dmgr“ Tasten.

Im Grunde ist nur die folgenden zwei Zeilen in Client geändert, obwohl es sehr in der Arbeit mit OpenSSL auf der Seite war.

ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')

Korrigierte Version:

ctx.use_privatekey_file('/home/justin/code/work/CA/private/spaceman-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/spacemancert.pem')
War es hilfreich?

Lösung

In einer SSL-Transaktion kann jede Seite ein Zertifikat präsentieren ihre Identität auf die andere Seite zu überprüfen. Um dies zu tun, muss es den privaten Schlüssel müssen dieses Zertifikat entspricht. Diese sollen zu zwei andere Zertifikate, so dass jede Seite zwei verschiedene private Schlüssel haben.

Dieses Zertifikat / privates Schlüsselpaar ist die, dass Sie mit use_privatekey_file() und use_certificate_file() setzen. Dies sollte ein anders Zertifikat / Schlüsselpaar auf dem Server und den Client sein.

Wenn das Peers Zertifikat zu überprüfen, müssen Sie dann überprüfen:

  • Das ist das Zertifikat gültig (das heißt, von einer Zertifizierungsstelle signiert, dass Sie für diese Anwendung vertrauen, nicht abgelaufen ist, nicht widerrufen); und
  • Entspricht dem Peer, dass Sie denken Sie verbunden sind (das heißt, entspricht das Zertifikat die Identität, dass die Peer-Ansprüche). Diese Identität innerhalb des SubjectName Feldes des Zertifikats gespeichert ist, und es ist anwendungsspezifisch, wie Sie diese Karte auf eine Peer-Kennung (es könnte einen Benutzer-Login-Name sein, einen DNS-Name, oder etwas anderes).
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top