CLX C++ Libraries - ssl::acceptor
Author: clown

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

# Declaration

    namespace ssl {
        template <
            int Version,
            int Family = AF_INET
        >
        class basic_acceptor : 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 通信を行うときに，サーバ用ソケットを生成するためのクラスです． ssl::acceptor は，クライアントからのコネクション確立要求を受諾するまでの作業を担います． この際，自身の公開鍵と秘密鍵のファイルを指定する必要があります（accept() メソッドの第 1 引数． および第 2 引数）．ssl::acceptor は，クライアントとのコネクションが確立すると ssl::socket オブジェクトを返すので，実際のデータ転送は返された ssl::scoket，または，ssl::sockstream を用いて行います． ssl::acceptor は，クライアントとのコネクションの確立に失敗すると socket_error を例外として送出します．

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

OpenSSL がインストールされている場合，サーバ側の公開鍵， および秘密鍵は以下のコマンドで生成することができます（public.key，および private.key の部分には任意のファイル名を指定します）．

    openssl req -new -x509 -nodes -out public.key -keyout private.key

# Example

example_ssl_server.cpp

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

    int recv(clx::ssl::socket& sock);

    int main(int argc, char* argv[]) {
        if (argc < 2) return -1;
        try {
            clx::ssl::acceptor s(clx::lexical_cast<int>(argv[1]));

            while (1) {
                clx::ssl::socket clt = s.accept("public.key", "private.key");
                std::cout << clt.address().ipaddr() << ':' << clt.address().port()
                    << " Connection was established" << std::endl;

                if (recv(clt) == -1) break;
                else {
                    std::cout << clt.address().ipaddr() << ':' << clt.address().port()
                        << " Connection was closed" << std::endl;
                    clt.close();
                }
            }
        }
        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;
    }

    int recv(clx::ssl::socket& sock)
    {
        clx::ssl::sockstream ss(sock);
        std::string msg;
        while (1) {
            std::string buf;
            ss >> buf;
            if (buf.empty()) break;
            msg += buf;
        }
        std::cout << "Receive messages: " << msg << std::endl;
        return 0;
    }

クライアント側のサンプルプログラムについては，ssl::socket を参照して下さい (example_ssl_client.cpp)．

# Template Parameters

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

# Related Types

    typedef basic_rawsocket<SOCK_STREAM, Family, 0> rawsocket;
    typedef basic_sockaddress<Family, IPPROTO_TCP> sockaddress;
    typedef char char_type;
    typedef typename std::basic_string<char> string_type;

# Construction and Member Functions

    basic_acceptor();
    explicit basic_acceptor(int port, int n = nmax);
    virtual ~basic_acceptor();

コンストラクタでは，ポート番号を指定してサーバ用ソケットを作成します．

    basic_acceptor& open(int port, int n = nmax);
    basic_socket<Version, Family> accept(const char_type* cert, const char_type* priv,
        int type = pem);
    basic_socket<Version, Family> accept(const string_type& cert, const string_type& priv,
        int type = pem);

accept() メソッドには，サーバ側の公開鍵，および秘密鍵のファイル名を指定します．

# Related Pages

1. CLX C++ Libraries - tcp::acceptor
2. CLX C++ Libraries - ssl::socket
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!