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;
}
#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 dhparam -outform PEM -out dh512.pem 512
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:
Okomentovat