Connexion STARTTLS avec Ruby et OpenSSL - ruby, ssl, openssl, starttls

En utilisant openssl s_client sur la ligne de commande, je peux établir une connexion avec un serveur POP3 nécessitant STARTTLS.

openssl s_client -connect pop3.example.com:110 -starttls pop3

Comment puis-je accomplir la même chose (surtout le -starttls pop part) en utilisant la bibliothèque OpenSSL de Ruby:

tcp_socket = TCPSocket.new host, port
ssl_context = OpenSSL::SSL::SSLContext.new
ssl_client = OpenSSL::SSL::SSLSocket.new tcp_socket, ssl_context
ssl_client.connect

Réponses:

2 pour la réponse № 1

La spécification POP3 stipule que vous devez envoyer STLS afin d'initier la prise de contact TLS. Par conséquent, vous devriez envoyer STLS sur le socket non crypté en premier, et après cela, vous devriez pouvoir appeler connect sur la couche OpenSSL, qui effectuera ensuite la prise de contact réelle.

Si vous appelez connect avant d'envoyer STLS, le serveur ne sait pas ce qui se passe, et va l'interpréter comme une entrée inutile.

Exemple de travail:

tcp = TCPSocket.new(host, port)

puts tcp.gets
tcp.puts "STLS"
puts tcp.gets

ssl_context = OpenSSL::SSL::SSLContext.new
ssl_client  = OpenSSL::SSL::SSLSocket.new(tcp, ssl_context)

ssl_client.connect
puts ssl_client.state

ssl_client.puts "NOOP"
puts ssl_client.gets

Sortie:

+OK POP3 ready <[email protected]>
+OK
SSLOK
+OK

Menu