CLX C++ Libraries
Home >> ssl::socket

Declarations

namespace ssl {
    enum { sslv2 = 0, sslv3, tlsv1, sslv23 };
    enum { pem = SSL_FILETYPE_PEM, asn1 = SSL_FILETYPE_ASN1 };
    
    template <
        int Version,
        int Family = AF_INET
    >
    class basic_socket : public basic_rawsocket<SOCK_STREAM, Family>;
    
    typedef basic_socket<sslv23, AF_INET> socket;
    typedef basic_acceptor<sslv23, AF_INET> acceptor;
    typedef basic_sockaddress<AF_INET, IPPROTO_TCP> sockaddress;
    typedef basic_sockbuf<socket> sockbuf;
    typedef basic_sockstream<socket> sockstream;
    typedef basic_sockmanager<SOCK_STREAM, AF_INET, 0> sockmanager;
};

Overview

ssl::socket は,SSL 通信を行う際に使用するソケットを生成するためのクラスです. テンプレートパラメータの第 1 引数で,使用する SSL/TLS のバージョンを指定します. sslv23 を指定した場合は,sslv2/sslv3 のどちらも使用可能になります.

ssl::socket は,tcp::socket と同様のインターフェースで使用することができます. ただし,サーバ証明書の認証を行う場合,connect() メソッドを呼ぶ前に verify_locations() メソッドを用いて,rootCA 証明書が存在するファイル名/ディレクトリを指定する必要があります. サーバ証明書の認証に失敗した場合,例外として verify_error が送出されます.

ssl::socket は OpenSSL を用いて実装しています.そのため,ssl::socket を利用する際には環境に OpenSSL ライブラリがインストールされている必要があります.OpenSSL に関する詳細は, OpenSSL: The Open Source toolkit for SSL/TLS ( OpenSSL 日本語サイト ) を参照して下さい.

Example

example_ssl_client.cpp

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include "clx/ssl.h"
#include "clx/lexical_cast.h"

int main(int argc, char* argv[]) {
    if (argc < 3) std::exit(-1);
    
    try {
        clx::ssl::socket s;
        s.connect(argv[1], clx::lexical_cast<int>(argv[2]));
        clx::ssl::sockstream tcps(s);
        
        while (1) {
            std::string buf;
            std::cin >> buf;
            if (std::cin.eof()) break;
            tcps << buf;
        }
    }
    catch (clx::socket_error& e) {
        std::cerr << e.what() << std::endl;
        std::exit(-1);
    }
    catch (clx::sockaddress_error& e) {
        std::cerr << e.what() << std::endl;
        std::exit(-1);
    }
    catch (std::runtime_error& e) {
        std::cerr << e.what() << std::endl;
        std::exit(-1);
    }
    
    return 0;
}

サーバ側のサンプルプログラムについては,ssl::acceptor を参照して下さい (example_ssl_server.cpp).

Template Parameters

Version
使用する SSL/TLS のバージョンを指定します.
Family
プロトコルファミリーを指定します.

Related Types

typedef SSL handler;
typedef basic_sockaddress<Family, IPPROTO_TCP> address_type;
typedef char char_type;
typedef typename std::basic_string<char> string_type;

Construction and Member Functions

basic_socket();
basic_socket(const basic_socket& cp);

template <class Socket>
explicit basic_socket(const Socket& cp);

virtual ~basic_socket();

3 番目のコンストラクタは,TCP 通信の途中から SSL 通信を行う場合などに使用します.

basic_socket(soket_int s, const address_type& addr);
basic_socket(const char_type* host, int port);
basic_socket(const string_type& host, int port);

指定された引数を基に新たな SSL ソケットを生成します.引数にホスト名, およびポート番号が指定された場合は,指定された引数で connect() メソッドを実行します.connect() メソッドに関しては後述します.

ソケット,およびアドレスが指定された場合,ssl::socket は既にコネクションは確立されたと見なします.このコンストラクタは, 主に ssl::acceptor が accept() を完了した後に,新しい通信用 ssl::socket を生成する際に使用します.

basic_socket& connect(const char_type* host, int port);
basic_socket& connect(const string_type& host, int port);
bool is_connect() const;

指定されたホスト名,およびポート番号で識別されるサーバへ接続します. connect(), is_connect() メソッドの詳細については, tcp::socket を参照して下さい.

connect() メソッドを実行すると,handshake() メソッドも同時に実行します. そのため,ユーザは通常,明示的に handshake() メソッドを実行する必要はありません.

basic_socket& handshake();
basic_socket& handshake(const char_type* cert, const char_type* priv, int type = pem);
bool is_handshake() const;

これらのメソッドは,通常は使用する必要がありません.TCP 通信の途中から SSL 通信を開始するような場合に使用します.引数なしで handshake() メソッドを実行した場合はクライアントとして,引数を指定して handshake() メソッドを実行した場合はサーバとしてハンドシェイクを行います.

bool verify_locations(const char_type* file, const char_type* dir = NULL);
bool verify_locations(const string_type& file, const string_type& dir = string_type());

verify_locations() メソッドはファイル名,またはディレクトリ名を引数に指定します. ファイル名を指定する場合は第 1 引数に,ディレクトリ名を指定する場合は第 2 引数に指定します. どちらか片方は NULL (または,空の文字列)でも構いません.verify_locations() メソッドを呼ぶと connect() 時にサーバ証明書の認証を行います.このため,コンストラクタで connect() を実行した (引数として,ホスト名/ポート番号を指定してコンストラクタを呼んだ)場合には, サーバ証明書の認証は行われません.

const address_type& address() const;
handler* ssl();
const handler* ssl() const;

各種情報にアクセスするためのメソッドです.address() メソッドに関しては, tcp::socket を参照して下さい.ssl() メソッドで返される値は, ユーザが SSL ライブラリの関数を直接操作する場合に必要になる事があります.

int send(const char_type* src, int n);
int send(const string_type& src);
int recv(char_type* src, int n);

サーバとデータの送受信を行うためのメソッドです.サーバとのデータ通信については, sockstream も参照して下さい.

Related Pages

  1. CLX C++ Libraries - tcp::socket
  2. CLX C++ Libraries - ssl::acceptor
  3. CLX C++ Libraries - sockstream
  4. CLX C++ Libraries - sockmanager
  5. CLX C++ Libraries - ssl::sockmanager

References

  1. OpenSSL: The Open Source toolkit for SSL/TLS
  2. OpenSSL 日本語サイト: The Open Source toolkit for SSL/TLS
  3. ネットワークプログラミングの基礎知識
  4. Life like a clown - Hello, OpenSSL!