6
votes

Ajouter SSL à une connexion

Comment sécurisez-vous une prise avec SSL dans RUBY lorsque vous devez communiquer sur le plus clair?

Je ne peux pas utiliser openssl :: SSL :: SSLSERVER Parce que c'est la responsabilité du client de demander une connexion SSL d'abord

Pour mettre une longue histoire courte, je tente de mettre en œuvre RFC3207, où le client envoie le mot-clé "StartTLs", puis une connexion SSL est créée.

Ma question est "Comment créer la connexion SSL après que le serveur ait envoyé '220 OK'?"

Je sais que je peux utiliser openssl :: ssl :: sslsocket sur le côté client, mais je ne sais pas quoi faire sur le côté serveur

Si vous savez faire cela dans une langue autre que Ruby, postez simplement le code et je vais le traduire, je travaille dessus pendant environ 8 heures et j'ai besoin de tout ce que je peux obtenir

J'ai demandé à # Ruby-Lang, mais sans être en vain et j'ai essayé d'envelopper des objets de prise en sslsockets sur le serveur et le client en même temps, mais cela ne fonctionne pas non plus

En bref, je suis très coincé, j'ai besoin de toute l'aide que je peux obtenir


0 commentaires

3 Réponses :


0
votes

J'ai fait de la tête à ce sujet, enregistré pour une utilisation future:

  • Oui, vous devez utiliser openssl :: ssl :: sslsocket sur les deux extrémités
  • du côté serveur, vous devez créer un objet OpenSSL :: SSL :: SSLContext Object , en passant dans un symbole avec le protocole que vous souhaitez utiliser et "_server" annexé à la fin, voir openssl :: SSL: : SSLContext :: Méthodes de ce que je veux dire, à l'usage courte ": TLSV1_SERVER" pour RFC3207 Vous n'avez même pas besoin de le faire, sur le côté serveur Créer le contexte avec certs, puis appelez #Accept sur la prise à Attendez le transfert client
  • Passez les certificats SSL à l'objet CTX

    Modifier comme vous s'il vous plaît


0 commentaires

3
votes

Vous devez définir le champ START_IMMAMMEDYS SSLSERVER sur FALSE afin de démarrer le serveur SSL en mode texte brut. À tout moment (c'est-à-dire lorsque vous recevez la commande StartTLS du client), vous pouvez appeler la méthode d'acceptation de SSLSocket pour initier la poignée de main SSL / TLS. Le client doit bien entendu accepter le protocole :)

Voici un exemple de serveur que j'ai écrit pour tester ceci: p> xxx pré>

Je suis sûr que l'affiche originale sait Comment tester des starttls, mais le reste d'entre nous pourrait avoir besoin de ce rappel. Actiellement, je suis normalement en train d'utiliser les utils du paquet GNUTLS (gnoutls-bin à Debian / Ubuntu) pour tester les starttls, car cela me permet de démarrer la poignée de main chaque fois que je veux: P>

$ gnutls-cli --starttls --port 9002 --insecure localhost


1 commentaires

J'ai séparé l'implémentation d'OpenSSL SSLServer comme référence pour écrire le code que j'utilise aujourd'hui, et il regarde presque identique en dehors de #sync_close, et je lance toujours les erreurs: /



3
votes

j'ai créé ce Gist pour illustrer comment configurer un serveur TLS minimal. Vous voudrez peut-être laisser des lignes 62-67, c'était pour illustrer une nouvelle fonctionnalité sur le coffre.

Mais autre que cela, c'est un serveur TLS entièrement actif, vous pouvez y construire pour ajouter des fonctionnalités supplémentaires.

Vous pouvez également modifier le CN du certificat de serveur de "localhost" à un domaine réel si vous souhaitez l'utiliser sérieusement :)

Vous remarquerez peut-être que la plus grande partie du travail est en train de définir. les aspects PKI correctement. La partie de serveur de base est la suivante: xxx


1 commentaires

Combien de la génération de certificat puis-je décoller? J'envisage de la mettre dans un script pour générer un certificat pendant une année et conserver les certificats du contrôle de la source. Votre échantillon barebone ci-dessus est (à peu près, à la réutilisation de contexte) ce que j'utilise maintenant, et cela provoque occasionnellement des erreurs étranges, et je pense que vous avez déjà vu ces déjà :)