RabbitMQ CライブラリでSSL接続する。
Pythonだとパラメータ一発で設定できるところ、Cライブラリ https://github.com/alanxz/rabbitmq-c では、正しく手続きを踏まないと完結しないので、そこのところを書く。
ヘッダファイルを読み込む。
# include <amqp_ssl_socket.h>
SSLライブラリをイニシャライズする。プログラムの中で、SSLライブラリを呼び出す前に一度だけ実行すればよい。RabbitMQで使用する以外にSSLライブラリを使用していて、そちらで既にSSLライブラリを初期化している場合は、パラメータをfalseにすれば、重複して初期化プログラムを実行しない。
amqp_set_initialize_ssl_library (true);
socket生成は、通常の amqp_tcp_socket_new() のかわりに、amqp_ssl_socket_new() を使用する。
amqp_socket_t* socket = amqp_ssl_socket_new (conn);
クライアント接続する際に、サーバ証明書のチェックを行うことを指定する。デフォルトは「チェックする」。
amqp_ssl_socket_set_verify (socket, true);
追記:amqp_ssl_socket_set_verify()でfalseをセットしても、サーバ証明書ファイルを指定しないと、amqp_socket_open()の時に、サーバ証明書の検証エラーが出ました。
その後、通常通りサーバに接続する。以降、SSL上でメッセージのやり取りが行われる。ホスト名指定は、サーバ証明書に書かれているホスト名でなければ、チェックではねられる。また、RabbitMQのguestユーザのデフォルト設定は、localhost接続のみに限られているので注意。
int rc_sock = amqp_socket_open (socket, "amqp.server.name", 5671);
まとめると、以下のとおり。
# include <amqp.h>
# include <amqp_tcp_socket.h>
# include <amqp_framing.h>
# include <amqp_ssl_socket.h>
int main (int argc, char** argv) {
amqp_set_initialize_ssl_library (true);
amqp_connection_state_t conn = amqp_new_connection ();
amqp_socket_t* socket = amqp_ssl_socket_new (conn);
int rc_ca = amqp_ssl_socket_set_cacert (socket, "/usr/local/share/certs/ca-root-nss.crt");
amqp_ssl_socket_set_verify (socket, true);
int rc_sock = amqp_socket_open (socket, "amqp.server.name", 5671);
if (rc_sock != AMQP_STATUS_OK) {
fprintf (stderr, "connection failure.\n");
exit (1);
}
amqp_rpc_reply_t rc_login = amqp_login (conn, "/", AMQP_DEFAULT_MAX_CHANNELS, AMQP_DEFAULT_FRAME_SIZE, AMQP_DEFAULT_HEARTBEAT, AMQP_SASL_METHOD_PLAIN, "username", "userpassword");
:
}