7 Mart 2018 Çarşamba

asio ssl stream Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/asio/ssl.hpp>
Sınıf bir template. Şöyledir.
boost::asio::ssl::stream<boost::asio::ip::tcp::socket>;
 Altta OpenSSL kütüphanesini kullanır. Bu sınıf ile tekrar bağlanma örneği burada.

Constructor
Şöyle yaparız.
boost::asio::io_service ios;
boost::asio::ssl::context ctx (boost::asio::ssl::context::tlsv1);
boost::asio::ssl::stream <boost::asio::ip::tcp::socket> socket (ios, ctx);
async_handshake metodu
Şöyle yaparız.
socket.async_handshake(boost::asio::ssl::stream_base::handshake_type::client,
    handler);
Handler şöyledir.
void TLSSocket::on_handshake(const boost::system::error_code& error){
  if(!error){
    ...
  } else {
    std::cout << "Handshaking error: " << error.message() << "\n";
  }
}
Handshake başarılı ise şöyle örneği yazma işlemi yapabiliriz. Şöyle yaparız.
void handle_handshake(const boost::system::error_code& err)
{
  if (!err)
  {
    boost::asio::async_write(socket,requestBuf,handler);

  }
}
async_read_some metodu
Örnek ver

async_shutdown metodu
Örnek ver

async_write_somet metodu
Örnek ver

handshake metodu
Şöyle yaparız.
socket.handshake(ssl::stream_base::handshake_type::client);
lowest_layer metodu
basic_socket'i döndürür.

1. Bağlanmak için şöyle yaparız.
socket.lowest_layer().connect({ {}, 8087 }); // http://localhost:8087
2. Bağlanmak için şöyle yaparız
boost::asio::async_connect (socket.lowest_layer(),ep,handler);
Handler metodu şöyledir.
void onConnect (const boost::system::error_code& error){
  if(!error) {
    try {
    socket.async_handshake(boost::asio::ssl::stream_base::handshake_type::client,
                   handshakeHandler);
    } catch (std::exception ex){
      std::cout << "Handshaking error: " << ex.what() << "\n";
    }
  } else {
    std::cout << "Connect error: " << error.message() << "\n";
  }
}
3. Bağlanmak için şöyle yaparız. Handler yine aynıdır.
socket.lowest_layer().async_connect (ep,handler); 
4. Socketi kapatmak için şöyle yaparız.
socket.lowest_layer().cancel();
native metodu
Şöyle yaparız.
char* const host = "104.236.162.70" ;// IP of  isocpp.org
// Set SNI Hostname (many hosts need this to handshake successfully)
if(! SSL_set_tlsext_host_name(stream_.native_handle(), host))
{
  ...
}
next_layer metodu
tcp socketini döndürür. Bağlantı kurulduktan sonra okuma yazma işlemi için direkt tcp soketi kullanılmamalıdır. next_layer() ve lowest_layer() farklıdır. Bağlanmak için şöyle yaparız.
Şöyle yaparız.
tcp::resolver::results_type results = ...;

// Make the connection on the IP address we get from a lookup
boost::asio::async_connect(
  stream_.next_layer(),
    results.begin(),
    results.end(),
    std::bind(
      &session::on_connect,
      shared_from_this(),
      std::placeholders::_1));

read_somet metodu - char []
Şöyle yaparız.
char buf[1024];
size_t bytes_transferred = socket.read_some(boost::asio::buffer(buf), ec);
read_some metodu - boost::array
Şöyle yaparız.
boost::array<char, 128> buffer;
boost::system::error_code error;
size_t len = socket->read_some(boost::asio::buffer(buffer), error);

if (error == boost::asio::error::eof)
  break;
else if (error)
  throw boost::system::system_error(error);

std::cout.write(buffer.data(), len);
set_verify_callback metodu
ssl::context sınıfında da aynı metod mevcut. Yani context ile sertifika bir şekilde doğrulanıbileceği gibi socket ile de doğrulanabilir. Şöyle yaparız. Bu çağrıdan önce set_verify_mode çağrısı yapılabilir.
socket.set_verify_callback(boost::bind(&..., this, _1, _2));
Handler kodlamak için şöyle yaparız.
bool TLSSocket::on_verify_certificate(bool verified,
  boost::asio::ssl::verify_context &ctx) {
    char subject_name[256];
    X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
    X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
    std::cout << "Verifying " << subject_name << "\n";

    return verified;
}
set_verify_mode metodu
Örnek
Şöyle yaparız.
socket.set_verify_mode(boost::asio::ssl::verify_none);
Örnek
Şöyle yaparız.
socket.set_verify_mode(asio::ssl::verify_fail_if_no_peer_cert);
Örnek
Şöyle yaparız.
socket.set_verify_mode(boost::asio::ssl::verify_peer);
Örnek
Şöyle yaparız.
socket.set_verify_mode(ssl::verify_peer);
socket.set_verify_callback(ssl::rfc2818_verification("host.name"));
shutdown metodu
Açıklaması şöyle
It is cleanest to make shutdown() calls on both the ssl::stream and its lowest_layer(). The first ends the SSL connection and the second ends the TCP connection.
Şöyle yaparız.
socket.shutdown();
socket.lowest_layer().close();
write_some metodu
Örnek ver

Hiç yorum yok:

Yorum Gönder