この記事では、POCO C++ ライブラリで構築したサーバーにて、https通信ができるようにする方法を記載します。https通信を行うためには、POCOライブラリのビルド時に、OpneSSLとの依存関係を解決させる必要がありますので、そちらの内容を中心にご紹介します。
この記事はこんな人向けです。
- POCO C++ のビルド時にOpneSSLの依存関係を解決したい人
- POCO C++ で構築したサーバーでhttps通信を行えるようにしたい人
- POCO C++ のhttps通信を行う実装例が知りたい人
※以下は説明しません。
- SSL証明書の作成方法
※前提として以下は実現できているものとする
・POCO C++ ライブラリのビルドとインストール
・POCO C++ ライブラリを使ってサーバーを構築し、http通信の実装を行っている。
この内容については以下記事も併せてご確認ください。
・Windows10
・OpenSSL Ver1.1.1w
・poco C++ Version: poco-1.12.4-all
・Visual Stuidio : Microsoft Visual Studio Community 2022 (64 ビット) – Current Version 17.7.6
OpenSSLのPCインストール
POCOをビルドする際にOpenSSLが必要なので、まずは以下サイトのインストーラーを使ってPCにOpenSSLをインストールします。
https://slproweb.com/products/Win32OpenSSL.html
注意点として、Version1.1.1wを使用するようにしてください。
※現時点で最新はVersion3.1.4ですが、このVersionだとPOCOのビルドがうまくできませんでした。(もしかしたら上手い方法はあるかもです。。)
※Light版はビルドに適応できません
OpenSSLインストーラの流れは以下をご覧ください。
これでOpenSSLのPCインストールは完了です!
OpenSSLの依存関係解決
POCOのCmakeビルド設定でOpneSSLの依存関係を解決します。
1.cmake-guiで設定を開く
コマンドプロンプトを開き、POCOライブラリのCmake用のフォルダで、以下コマンドを実行する。
cmake-gui .
設定画面を開いて「Add Entry」を押し、Cmake変数を追加する。(追加する変数は次で説明します)
2.Cmake変数の追加
2-1.OPENSSL_INCLUDE_DIR の追加
以下のように、OpenSSLのヘッダーファイルが格納されたディレクトリへのパスを設定する。
2-2.OPENSSL_CRYPTO_LIBRARY の追加
以下のように、OpenSSLのライブラリファイル(通常は「libcrypto.lib」や「libcrypto.so」など)へのパスを設定する。
2-3.OPENSSL_SSL_LIBRARY の追加
以下のように、OpenSSLのSSLライブラリファイル(通常は「libssl.lib」や「libssl.so」など)へのパスを設定する。
3.Cmake変数の設定変更
3-1.ENABLE_NETSSL の変更
変数「ENABLE_NETSSL」にチェックを入れる
3-2.LIB_EAY の変更
変数「LIB_EAY_DEBUG」、「LIB_EAY_RELEASE」の2つの変数に、libcrypto.libとlibssl.libのパスを設定する。
以上でCmakeビルド設定は完了です!
POCO C++ のビルドとインストール
コマンドプロンプトを開き、POCOライブラリのCmake用のフォルダで、以下コマンドを実行する。
cmake .. && cmake --build .
ビルドができたら、以下コマンドでPCへのインストールを行う。
cmake --build . --target install
VisualStudioの依存関係設定
C++プロジェクトでOpneSSLライブラリを読み込ませる
OpneSSLを読み込ませるには、Visual StudioのC++プロジェクトの設定にて以下2つの設定を行う必要があります。
*OpneSSLは特に指定していなければ、”C:\Program Files\OpenSSL-Win64”にインストールされているはずです
①ヘッダーファイル(.h)の読み込み設定
「構成プロパティ」 > 「VC++ディレクトリ」> 「インクルードディレクトリ」:PCにインストールしたOpneSSL ライブラリの「include」フォルダまでのパスを設定する
②ライブラリファイル(.lib)読み込み設定
「構成プロパティ」 > 「VC++ディレクトリ」 > 「ライブラリディレクトリ」:PCにインストールしたOpneSSL ライブラリの「lib」フォルダまでのパスを設定する
PCの環境変数のPATHにOpneSSLライブラリのパスを追加する
- Windowsのスタートメニューにて、「環境変数」と検索する
- 「システム環境変数の編集」を選択する
- 「環境変数」を選択する
- PathにPCにインストールしたOpenSSL ライブラリの「bin」フォルダまでのパスを設定する
POCO C++ サーバーでのhttps通信実装
※POCOサーバーでhttp通信ができていることを前提にしています。
以下のヘッダファイルを追加します。
#include "Poco/Net/Context.h"
#include "Poco/Net/SecureServerSocket.h"
Poco::Util::ServerApplicationを継承している、サーバーを立てるクラスは以下のように実装を行います。
※今回SSL証明書の作成は行えている前提としています。
class PocoTestServer : public Poco::Util::ServerApplication
{
protected:
int main(const std::vector<std::string>& args)
{
int maxThreads = 5; // クライアント最大同時接続数
// 接続スレッド数設定
Poco::ThreadPool::defaultPool().addCapacity(maxThreads);
// SSL/TLSコンテキストの作成
Poco::Net::Context::Ptr pContext = new Poco::Net::Context(
Poco::Net::Context::SERVER_USE,
"server.key", // 秘密鍵ファイルのパス
"server.crt", // 証明書ファイルのパス
"", // チェーン証明書ファイルのパス(無しの場合は空文字列)
Poco::Net::Context::VERIFY_RELAXED, // 証明書検証モード
9, // サーバーでのスレッド数
false // 証明書の確認を無効化
);
// 設定値クラス
Poco::Net::HTTPServerParams* params = new Poco::Net::HTTPServerParams;
params->setMaxQueued(100); // 接続要求ソケット最大数
params->setMaxThreads(maxThreads);
Poco::Net::SecureServerSocket svs(8080, 10, pContext); // 8080ポート, 同時に行う接続要求10
// HTTPサーバクラスのインスタンス
Poco::Net::HTTPServer srv(new TestRequestHandlerFactory(), svs, params);
// サーバ動作開始
srv.start();
std::cout << "Server Start" << std::endl;
// CTRL-C が押されるまで、
// またはプロセスが強制終了されるまで待機
waitForTerminationRequest();
// サーバ動作ストップ
srv.stop();
return Application::EXIT_OK;
}
};
curlコマンドによるサーバー動作確認
サーバーの動作確認は、コマンドプロンプトでcurlコマンドを実行して行います。
なお、今回サーバーはローカルサーバーとして動作させているので、ローカルサーバーにアクセスする方法となっています。(サーバーの外部公開は今回対象外です)
curl -k -verbose -X POST https://localhost:8080/Endpoint
※”Endpoint”はサーバーで設定しているEndointの文字列にしてください。
まとめ
httpsでのアクセスできましたでしょうか??
C++のライブラリを使えるように環境を作成していくのは、慣れてないと結構大変ですよね。。
私はあまり知識がない状態で環境構築を行ってかなり苦労したので、少しでも皆様の作業の参考になれば幸いです!