3 Mayıs 2017 Çarşamba

asio sll context Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/asio/ssl.hpp>
Constructor - method
TLS V1.2 ise daha düşük sürümdeki şunlar desteklenir. Daha düşük protokol desteği için Windows'ta ayarları değiştirmek gerekebilir.
TLS v. 1.1, TLS v. 1.0, SSL 3.0, SSL 2.0
Şöyle yaparız.
asio::ssl::context ctx (asio::ssl::context::tlsv12_server);
veya şöyle yaparız.
asio::ssl::context ctx(asio::ssl::context::tlsv12_client);
veya şöyle yaparız.
asio::ssl::context ctx (asio::ssl::context::tlsv11); 
veya şöyle yaparız.
asio::ssl::context ctx (asio::ssl::context::sslv23_client);
veya şöyle yaparız.
asio::ssl::context ctx (asio::ssl::context::sslv23)
Constructor - io_service + method
Bu constructor deprecated. Kullanılmamalı. Şöyle yaparız.
boost::asio::io_service ios;
asio::ssl::context ctx {ios, asio::ssl::context::method::sslv23_client};
add_certificate_authority metodu
Şöyle yaparız.
std::vector<char> caCrtBuffer = ...;
ctx.add_certificate_authority(asio::buffer(caCrtBuffer, caCrtBuffer.size()));
impl metodu
Şöyle yaparız.
SSL_CTX* impl = ctx.impl(); 
load_verify_file metodu
CA sertifikaların olduğu dosyayı yükler. Şöyle yaparız.
ctx.load_verify_file(filename);
Şöyle yaparız.
ctx.load_verify_file("ca.pem");
Sertifiları windows'ta almak için şöyle yaparız.
#include <windows.h>
#include <Wincrypt.h>

std::vector<std::string> system_root_certificates()
{
  std::vector<std::string> certs;

  HCERTSTORE hStore;
  PCCERT_CONTEXT pCertContext = NULL;

  if (!(hStore = ::CertOpenStore(
              CERT_STORE_PROV_SYSTEM_A,
              0,
              NULL,
              CERT_SYSTEM_STORE_CURRENT_USER,
              "Root")))
        return certs;

  do
  {
    if (pCertContext = ::CertFindCertificateInStore(
                  hStore,
                  X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
                  0,
                  CERT_FIND_ANY,
                  NULL,
                  pCertContext))
    {
      certs.push_back("-----BEGIN CERTIFICATE-----\n" +
          Base64::encode_copy(std::string((char *) pCertContext->pbCertEncoded,
                              (size_t) pCertContext->cbCertEncoded), true) +
                            "\n-----END CERTIFICATE-----\n");
      }
  } while (pCertContext);

  if (!pCertContext)
    ::CertFreeCertificateContext(pCertContext);

  ::CertCloseStore(
              hStore,
              CERT_CLOSE_STORE_FORCE_FLAG);

  return certs;
}
Dosya oluşturmak için şöyle yaparız.
...
for (size_t i = 0; i < certs.size(); ++i)
    certFile << certs[i];
...
native_handle metodu
Şöyle yaparız.
SSL_CIPHER* handle = ctx->native_handle(); 
set_default_verify_paths metodu
Açıklaması şöyle.
Trusted certificates are often installed or updated via the OS, browsers, or individual packages. For instance, in the *nix world, the certificates are often available through the ca-certificates package, and the certificates are installed to locations that boost::asio::ssl::context::set_default_verify_paths() will find.
OpenSSL kurulumunun oluşturduğu CA'ları kullanır. Bu dizin sanırım SSL_CERT_DIR ortam değişkeni ile belirtiliyor.
Örnek
Şöyle yaparız.
// set security
ctx.set_default_verify_paths();
set_options metodu
Örnek 1
Şöyle yaparız.
ctx.set_options(SSL_OP_NO_TICKET);
Örnek
SSLv2 istemiyorsak şöyle yaparız.
ctx.set_options
(
  boost::asio::ssl::context::default_workarounds |
  boost::asio::ssl::context::no_sslv2
);
Örnek 
Bir çok sunucu SSLV3 ve altını desteklemiyor. Sunucular şu hatayı verirler.
Error: sslv3 alert handshake failure
Bu desteği istemediğimizi belirtmek için şöyle yaparız.
ctx.set_options(boost::asio::ssl::context::default_workarounds |
                boost::asio::ssl::context::no_sslv2 |
                boost::asio::ssl::context::no_sslv3);
Örnek
Şöyle yaparız.
try {
  ctx.set_options(boost::asio::ssl::context::default_workarounds |
            boost::asio::ssl::context::no_sslv2 |
            boost::asio::ssl::context::no_sslv3 |
            boost::asio::ssl::context::single_dh_use);
}
catch (std::exception& e) {
  std::cout << e.what() << std::endl;
}
Örnek
Şöyle yaparız.
ctx.set_options(asio::ssl::context::default_workarounds |   asio::ssl::context::no_sslv2 | asio::ssl::context::no_sslv3 |   asio::ssl::context::no_tlsv1 | asio::ssl::context::no_tlsv1_1 |   asio::ssl::context::single_dh_use);
Örnek
Şöyle yaparız.
ctx.set_options( asio::ssl::context::default_workarounds |
                 asio::ssl::context::no_sslv2 |
                 asio::ssl::context::single_dh_use);
set_password_callback metodu
Şöyle yaparız.
ctx.set_password_callback (&password_callback);   
set_verify_callback metodu
Örnek ver. ssl::stream sınıfında da aynı metod mevcut.

set_verify_mode metodu
İstemci tarafında şöyle yaparız.
ctx.set_verify_mode(asio::ssl::verify_peer |
                    asio::ssl::verify_fail_if_no_peer_cert);
user_certificate_chain metodu
SSL sunucusunda kullanılır. Şöyle yaparız.
boost::asio::const_buffer cert = ...;
ctx.use_certificate_chain (cert);
Şöyle yaparız.
std::vector<char> buf = ...; ctx.use_certificate_chain (asio::buffer(buf, userCrtBuffer.size()));
use_certificate_chain_file metodu
Şöyle yaparız.
ctx.use_certificate_chain_file("server.pem");
user_certificate_file metodu
Şöyle yaparız.
ctx.use_certificate_file ("public_key.pem", ssl::context::pem);
use_private_key metodu
SSL sunucusunda kullanılır. Şöyle yaparız.
boost::asio::const_buffer key =...;
ctx.use_private_key(key, boost::asio::ssl::context::pem);
Şöyle yaparız.
std::vector<char> userKeyBuffer = ctx.use_private_key (asio::buffer(userKeyBuffer, userKeyBuffer.size()),    asio::ssl::context::pem);
use_private_key_file metodu
Şöyle yaparız.
ctx.use_private_key_file("server.pem", boost::asio::ssl::context::pem);
use_rsa_private_key_file metodu
Şöyle yaparız.
ctx.use_rsa_private_key_file ("private_key.pem", ssl::context::pem);
use_tmp_dh metodu
Şöyle yaparız.
std::vector<char> dhParamsBuffer = ...
ctx.use_tmp_dh (asio::buffer(dhParamsBuffer, dhParamsBuffer.size()));

Hiç yorum yok:

Yorum Gönder