set RTCTREE_SSL_ENABLE=YES
set ORBsslCAFile=%RTM_ROOT%/ext/ssl/root.crt
set ORBsslKeyFile=%RTM_ROOT%/ext/ssl/server.pem
set ORBsslKeyPassword=password
set RTCTREE_NAMESERVERS=ssliop:localhost:2809
set ORBserverTransportRule=* ssl
set ORBclientTransportRule=* ssl
set ORBendPoint=giop:ssl::
概要
オブジェクトのCORBA Security Service仕様のセキュリティ機能を一部使用可能になっています。 CORBA Security Serviceではセキュリティポリシーのモデル、認証、アクセス制御、メッセージ保護、委譲、監査、否認不可の機能を定義していますが、omniORBではGIOPメッセージをSSL/TLSによるサーバー・クライアント認証と暗号化で保護するSSLIOP通信をサポートしています。 このページではOpenRTM-aistでomniORBのSSLIOP通信を使用する手順を説明します。
C++
Windows
OpenRTM-aistのビルドとインストール
まず、OpenSSLのヘッダーファイル、ライブラリを適当な場所に展開してください。
OpenRTM-aist+omniORBを以下の手順でビルド、インストールします。
ただし、CMake実行時にSSL_ENABLE、OPENSSL_ROOT_DIRのオプションを設定する必要があります。
また、CMake実行時にOpenRTM-aistのインストールフォルダは指定してそこにインストールするようにしてください。
Ubuntu
OpenRTM-aistのビルドとインストール
OpenSSLのヘッダとライブラリをインストールします。
OpenRTM-aist+omniORBを以下の手順でビルド、インストールします。
ただし、SSL_ENABLEのオプションを設定する必要があります。
Python
OpenRTM-aistのビルドとインストール
以下の手順でOpenRTM-aist Python版をインストールしてださい。
ただし、動作確認でOpenRTM-aist C++版付属のネームサーバーを使用するため、C++版のビルドも実行してください。
動作確認
ネームサーバー起動
SSLTransportの動作確認のためにはネームサーバーがSSLIOP通信に対応している必要があります。 OpenRTM-aist付属のopenrtmNamesを起動します。
以下のコマンドを実行してください。パスは確認して変更してください。
rtc.names.ssl.confでは生成済みのルート証明書root.crtと秘密鍵とサーバー証明書を連結したファイルserver.pemを使用するため、動作確認に使用するRTCもこれらの証明書ファイルを使います。 実際にシステムを開発する際は証明書と秘密鍵を変更してください。
RTC起動
以下のようなrtc.confを作成します。OpenRTM-aistをインストールしたパスは適宜変更してください。
C++では以下のファイルを作成します。
Pythonでは以下のファイルを作成します。
各設定項目の内容は以下のようになっています。
このrtc.confを指定してConsoleIn、ConsoleOutのRTCを起動します。
これでネームサーバーに登録されますが、RTシステムエディタにSSLIOP通信機能はないため、OpenRTM-aistの機能かrtshellによりポートの接続やRTCのアクティブ化を実行する必要があります。
マネージャ起動時のポート接続、RTCのアクティブ化
rtc.confのmanager.components.preconnect、manager.components.preactivationでrtcname形式、rtcloc形式を指定することでポートの接続、RTCのアクティブ化ができます。 SSLIOP通信の場合は以下のようにプロトコルにssliopを指定することで使用可能になります。
rtshellによる操作
まず、現在インストールされるrtshellでは対応していないため、最新版のrtctree、rtshell、rtsprofileが必要です。
rtshellでSSLIOP通信機能を使用するためには以下の環境変数を設定する必要があります。
以下のように接続するネームサーバーのアドレスの前にssliop:を付けることでSSLIOP通信でネームサーバーに接続できるようになります。
秘密鍵、証明書の生成
まずは秘密鍵、証明書の生成が必要です。
証明書にはルート証明書、中間証明書、サーバー証明書、クライアント証明書があります。 以下はサーバー証明書によるサーバー認証を行う場合の概要図です。
通信するサーバー、クライアントPC以外に公開鍵証明書認証局(CA、Certificate Authority)が必要です。 認証局はルート証明書と対応する秘密鍵(秘密鍵1)を持っています。 サーバーは秘密鍵を生成後、生成した秘密鍵(秘密鍵a)でCSR(Certificate Signing Request:公開鍵情報、ウェブサイトの所有者情報)を認証局に送信します。 認証局はCSRに秘密鍵1で署名したサーバー証明書を発行します。 サーバーとクライアントのSSL/TLS通信のハンドシェイク処理でサーバー証明書を送信します。この時に他にも鍵交換アルゴリズムの処理などもありますが説明は省略します。 クライアントは予め入手しておいたルート証明書の公開鍵でサーバー証明書の署名の検証を行い、証明書の検証が完了したら暗号化通信(秘密鍵aで符号化、サーバー証明書の公開鍵で復号)を開始します。
この他に中間認証局がルート認証局から中間証明書を取得し、中間認証局がサーバー証明書を発行する場合があります。 説明は以下のサイトの図が分かりやすいので参考になると思います。
ここまでの説明ではクライアント側がサーバーの認証をしていましたが、サーバーがクライアントの認証をする場合があります。 omniORBでは引数`-ORBsslVerifyMode`や環境変数`ORBsslVerifyMode`で以下のパラメータを設定することで認証方法を変更可能です。
omniORBはサーバー証明書、クライアント証明書のルート証明書ファイルを個別に指定できないため、どちらも`corba.ssl.certificate_authority_file`オプションで指定してください。
まとめると、OpenRTM-aistのSSL/TLS通信にはルート証明書、サーバー証明書、クライアント証明書、中間証明書、秘密鍵を以下のように配置する必要があります。
以降ではOpenSSLのコマンドを使って自己認証局と自己署名証明書(いわゆるオレオレ証明書)を作成してみます。 cnfファイルは上記のリンク先のサイトのものを使用します。
まず適当な作業フォルダにroot、inter、serverフォルダを作成します。
ルート認証局の秘密鍵、ルート証明書を作成します。
次に中間認証局の秘密鍵、中間証明書のCSRを作成します。
ルート認証局で中間証明書を発行します。
サーバーで秘密鍵とサーバー証明書のCSRを作成します。
中間認証局でサーバー証明書を発行します。
秘密鍵、サーバー証明書、中間証明書を連結します。
今回使用するのは連結したファイル(server.pem)とルート証明書(RootCA_crt.pem)です。
簡単な動作確認
OpenRTM-aistをビルド、インストールすると、SSLTransportの簡単な動作確認用の設定ファイルがインストールされます。