?
Hallo zusammen,
ich versuche einen simplen Mailclient zu schreiben. Der soll sich mit dem Mailserver meiner Uni verbinden, sich autentifizieren und dann eine Mail verschicken. Die Verbindung soll SSL sein und später kann dann darüber SMTP AUTH gesprochen werden. Aber soweit komme ich erst gar nicht.
In einem Test konnte ich schon die Kommunikation händisch nachvollziehen. Dafür habe ich mir das Programm "stunnel" für Windows installiert, welches einen lokalen Port öffnet, bei eingehenden Verbindungen eine SSL-Verbindung nach außen aufbaut und den Datenverkehr weiterleitet (ein Tunnel halt). Das funktionierte auch ganz gut, ich konnte Nachrichten verschicken und erhielt auch Antwort.
Nun möchte ich das aus meinem C++ Code heraus nachvollziehen ohne stunnel. Dafür möchte ich Boost benutzen. Ich habe mich soweit an diesem Beispiel von der Boost-Seite orientiert:
http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/ssl/client.cpp
Daraus und aus diversen Blogeinträgen, die ich zum Thema gefunden habe, habe ich das folgende Beispiel extrahiert. Ein paar Versuche sind auskommentiert, die auch nicht funktioniert haben:
boost::asio::io_service my_io_service;
ssl::context ctx(my_io_service, ssl::context::sslv23);
//ssl::context ctx(my_io_service, ssl::context::sslv23_client);
ctx.set_verify_mode(ssl::context::verify_none);
//ctx.set_default_verify_paths();
//ctx.set_verify_mode( ssl::verify_peer );
ssl::stream<ip::tcp::socket> ssl_sock(my_io_service, ctx);
ip::tcp::socket::lowest_layer_type& sock = ssl_sock.lowest_layer();
boost::asio::ip::tcp::resolver myresolver(my_io_service);
boost::asio::ip::tcp::resolver::query query("relay-auth.rwth-aachen.de", "465");
boost::asio::ip::tcp::resolver::iterator iterator = myresolver.resolve(query);
boost::system::error_code return_error_code;
boost::asio::connect(sock, iterator, return_error_code);
std::cout << (return_error_code ? "Error connecting" : "Connection without errors") << std::endl;
std::cout << "Errorcode message = \"" << return_error_code.message() << "\"" << std::endl << std::endl;
ssl_sock.handshake(boost::asio::ssl::stream_base::client, return_error_code);
std::cout << (return_error_code ? "Error handshaking" : "Handshake done without errors") << std::endl;
std::cout << "Errorcode message = \"" << return_error_code.message() << "\"" << std::endl << std::endl;
boost::asio::write(ssl_sock, boost::asio::buffer("Hallo Sie!", 6), return_error_code);
std::cout << (return_error_code ? "Error sending" : "Sending done without errors") << std::endl;
std::cout << "Errorcode message = \"" << return_error_code.message() << "\"" << std::endl << std::endl;
Dieses Programm gibt mir diese Ausgabe:
Connection without errors
Errorcode message = "Der Vorgang wurde erfolgreich beendet"
Error handshaking
Errorcode message = "sslv3 alert handshake failure"
Error sending
Errorcode message = "sslv3 alert handshake failure"
Es hapert also schon beim Handshake. Ich weiß nicht weiter. Falls es an den Zertifikaten liegt, frage ich mich, wie ein Programm wie stunnel das denn regelt. Dem habe ich ja auch keine Zertifikate übergeben.
Vielen Dank schonmal!