Question

Je suis en train d'écrire une application client-serveur générique qui sera en mesure d'échanger des données entre les serveurs. J'ai lu sur un bon nombre de documents OpenSSL, et j'ai installé avec succès mon propre CA et créé un cert (et la clé privée) à des fins de test.

Je suis coincé avec Python 2.3, donc je ne peux pas utiliser la bibliothèque standard « ssl ». Au lieu de cela, je suis coincé avec pyopenssl, ce qui ne semble pas mal, mais il n'y a pas beaucoup de documents là-bas à ce sujet.

Ma question est pas vraiment à le faire marcher. Je suis plus confus au sujet des certificats et où ils doivent aller.

Voici mes deux programmes faire travail:

Serveur:

#!/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)

Client:

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

J'ai trouvé ces informations ftp://ftp.pbone.net/mirror/ftp.pld-linux.org/dists/2.0/PLD/i586/PLD/RPMS/python-pyOpenSSL -examples-0.6-2.i586.rpm qui contient des exemples de scripts.

Comme vous pouvez recueillir, je ne comprends pas complètement les sections entre le « # ????????. » Je ne comprends pas pourquoi le certificat et la clé privée sont nécessaires à la fois le client et le serveur. Je ne sais pas où chacun devrait aller, mais je ne devrais pas seulement besoin de distribuer une partie de la clé (probablement la partie publique)? Elle porte atteinte à l'objectif d'avoir des clés asymétriques si vous avez encore besoin à la fois sur chaque serveur, droit?

J'ai essayé en alternance soit la suppression ou pkey cert de chaque boîte, et je reçois l'erreur suivante, peu importe que je supprimer:

  

OpenSSL.SSL.Error: [( 'routines SSL', 'SSL3_READ_BYTES', 'échec de négociation de SSLv3 alerte'), ( 'routines SSL', 'SSL3_WRITE_BYTES', 'l'échec de la poignée de main ssl')]

Quelqu'un pourrait-il expliquer si tel est le comportement attendu pour SSL. Ai-je vraiment besoin de distribuer la clé privée et publique cert à tous mes clients? J'essaie d'éviter les énormes problèmes de sécurité, et une fuite des clés privées auraient tendance à être un grand ...

Merci pour l'aide!

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

Merci à CaF pour moi aider à comprendre le problème. Sur la base de sa recommandation, j'ai créé deux nouvelles paires de certificat: Spaceman et dmgr. Je mets alors les deux parties « Spaceman » (clé, cert) dans le programme client, et même pour les touches « dmgr ».

En fait, seules les deux lignes suivantes dans Client changé, bien qu'il y ait toujours assez de travail avec OpenSSL sur le côté.

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')

Version corrigée:

ctx.use_privatekey_file('/home/justin/code/work/CA/private/spaceman-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/spacemancert.pem')
Était-ce utile?

La solution

Dans une transaction SSL, chaque côté peut présenter un certificat pour vérifier son identité de l'autre côté. Pour ce faire, il a besoin d'avoir la clé privée correspondant à ce certificat. Ceux-ci sont destinés à être deux différents certificats, de sorte que chaque partie aura deux clés privées différentes.

Ce certificat / clé privée paire est celui que vous définissez à l'aide use_privatekey_file() et use_certificate_file(). Cela devrait être un différent certificat / paire de clés sur le serveur et le client.

Lors de la vérification du certificat de pairs, vous devez alors vérifier:

  • Que le certificat est valide (c'est signé par une autorité de certification qui vous avez confiance pour cette application, non expiré, non révoqué); et
  • Correspond au pair que vous penser vous êtes connecté à (qui est, le certificat correspond à l'identité que les revendications par les pairs). Cette identité est stockée dans le champ SubjectName du certificat, et il est de savoir comment vous associez à un identité de pairs spécifique à l'application (il est peut-être un nom de connexion de l'utilisateur, un nom DNS, ou quelque chose d'autre).
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top