2010-11-24 14 views
2

J'ai une exigence étrange. J'essaie de communiquer avec un serveur écrit en C#. Il ressemble à ceci essentiellement:Connexion à .NET Sslstream x.509 socket avec Python ou Ruby ou Perl

SslStream sslStream = new SslStream(client.GetStream(), true, 
            ValidateServerCertificate, 
            SelectLocalCertificate); 
sslStream.AuthenticateAsServer(_pushCert); 

J'ai aussi un exemple de code en C# qui utilise un certificat X509 et se connecte au serveur. J'ai aussi le mot de passe pour le fichier cert.pfx.

Ce que je voudrais faire est de configurer un type de script shell qui peut se connecter au socket, transmettre quelques octets et recevoir la réponse. (J'ai vraiment essayé Python ou Ruby ou Perl)

J'ai essayé d'utiliser le wrapper SSL de Python, mais j'ai une erreur indiquant qu'il n'y a pas d'algorithme connu pour que le serveur/client parle.

Exemple de mon code Python:

ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s = ssl.wrap_socket(ss, ca_certs=CERT, ssl_version=ssl.PROTOCOL_SSLv23) 
#Attempt connection to our server 
try: 
    s.connect((HOST, PORT)) 
    print s 
except: 
    print 'ERROR Connecting' 
    sys.exit(0) 

Pour J'ai essayé CERT quelques différents FILEE: le .pfx, et quelques extraits du .pfx en utilisant OpenSSL.

J'ai également essayé plusieurs exemples différents (arguments pour le fichier ssl.wrap_socket). Je ne connais pas vraiment ces connexions non plus.

Peut-être que quelqu'un ici pourrait donner un coup de main?

Merci!

+0

Le serveur doit avoir accès à la clé privée du serveur et non au client. –

+0

Le certificat que j'ai utilisé (.pfx) provenait d'un client C# qui se connectait à ce serveur.L'erreur que je reçois toujours (Exception) est: "Le client et le serveur ne peuvent pas communiquer, car ils ne possèdent pas d'algorithme commun" – Chris

+0

AuthenticateAsServer utilise SSL 3.0 ou TLS 1.0 par défaut, et votre code Python semble utiliser SSL 2 ou 3. Donc, ils * devraient * être d'accord sur SSL 3.0 (qui afaik spécifie un ensemble d'algorithmes que toutes les implémentations doivent supporter). Je dirais que le seul point d'échec possible est le certificat. Essayez avec un autre. (Vous pouvez facilement créer un certificat auto-signé en utilisant [makecert.exe] (http: //msdn.microsoft.com/en-us/library/bfsktky3 \ (v = VS.100 \) .aspx).) – dtb

Répondre

0

Vous pouvez simplifier votre appel constructeur SslStream:

SslStream sslStream = new SslStream(client.GetStream()); 
sslStream.AuthenticateAsServer(_pushCert); 

Ce serveur envoie _pushCert et ne vous attendez pas au client d'envoyer un certificat de retour. Le serveur a besoin de la clé privée pour que le certificat établisse la connexion SSL. Le client n'a besoin que du certificat racine de l'autorité de certification qui a signé le certificat de serveur (ou une option pour accepter un certificat non approuvé). Il doit figurer dans le "magasin de certificats racines approuvés" ou être identifié comme approuvé dans le wrapper client. .

Si le certificat du serveur est signé par un certificat de l'autorité de certification intermédiaire lui-même signé par le certificat de l'autorité de certification racine, le client a également besoin de ce certificat intermédiaire. Cela peut être envoyé par le serveur, ou peut déjà être sur le client. De toute façon, toute la chaîne de signature des certificats doit être en main chez le client pour vérifier toutes les signatures le long de la chaîne. Le certificat d'autorité de certification intermédiaire n'a pas besoin d'être dans le magasin racine approuvé.

Aucun côté n'a besoin d'une clé privée pour la racine de l'autorité de certification ou pour un certificat de signature intermédiaire.

Cependant, si votre serveur s'attend à ce que le client envoie un certificat client, vous devez appeler AuthenticateAsServer avec plus d'arguments (clientCertificateRequired == true). Dans ce cas, le client a besoin de son propre certificat et de la clé privée pour son certificat. Le serveur a besoin de la racine de l'autorité de certification qui signe le certificat client dans son magasin approuvé. Le wrapper client prendra un fichier pfx, contenant par exemple le certificat client et la clé privée. Le serveur n'a pas besoin de la clé privée du client.