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_sockbuf<socket> sockbuf;
typedef basic_sockstream<socket> sockstream;
};
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
#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() を実行した (引数として,ホスト名/ポート番号を指定してコンストラクタを呼んだ)場合には, サーバ証明書の認証は行われません.