CLX C++ Libraries - tcp::socket
Author: clown

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

# Declarations

    namespace ssl {
        enum { sslv2 = 0, sslv3, tlsv1, sslv23 };

        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, AFINET> 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 basic_rawsocket<SOCK_STREAM, Family, 0> rawsocket;
    typedef SSL handler;
    typedef basic_sockaddress<Family, IPPROTO_TCP> sockaddress;
    typedef char char_type;
    typedef typename std::basic_string<char> string_type;

# Construction and Member Functions

    basic_socket();
    basic_socket(const basic_socket& cp);
    explicit basic_socket(soket_int s, const sockaddress& addr);
    explicit basic_socket(const char_type* host, int port);
    explicit basic_socket(const string_type& host, int port);
    virtual ~basic_socket();

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

    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());

    bool is_connect() const;
    const sockaddress& address() const;
    handler* ssl();
    const handler* ssl() const;

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

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

# 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!