28.8.07

Jednoduchý příklad SSL spojení v asio

Dělám teď projekt pomocí knihovny asio a chci ukázat, jak snadné je vytvořit jednoduchý prográmek, který naslouchá na daném portu a přijme šifrované SSL spojení, pak vypíše zprávu, kterou obdržel (omlouvám se za formátování, ale Blogger nic pohodlnějšího asi nenabízí :-/):

#include <asio.hpp>
#include <asio/ssl.hpp>
#include <iostream>
#include <exception>

int main()

try
{
asio::io_service io_service_;
asio::ssl::context context_(io_service_, asio::ssl::context::sslv23);
asio::ip::tcp::acceptor acceptor_(io_service_, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 22222));

context_.set_options(
asio::ssl::context::default_workarounds
| asio::ssl::context::no_sslv2
| asio::ssl::context::single_dh_use);
context_.use_certificate_chain_file("server.pem");
context_.use_private_key_file("key.pem", asio::ssl::context::pem);
context_.use_tmp_dh_file("dh512.pem");

asio::ssl::stream<asio::ip::tcp::socket> s(io_service_, context_);
acceptor_.accept(s.lowest_layer());

s.handshake(asio::ssl::stream_base::server);
char data[8192];
s.read_some(asio::buffer(data, 8192));

std::cout <
< "I got: " << data << std::endl;

s.shutdown();
}
catch (asio::error& e) {
std::cerr
<< "error: " << e.what() << std::endl;
}

Ještě dodám, že certifikát a privátní klíč se dají vytvořit třeba takto:
openssl req -new -x509 -nodes -out server.pem -keyout key.pem
a Diffie-Hellmanovy parametry (slouží k výměně klíčů a certifikátů) třeba takto:
openssl dhparam -outform PEM -out dh512.pem 512

Žádné komentáře: