-
Notifications
You must be signed in to change notification settings - Fork 14
Description
Describe the bug
OpenRTM-aist+TAOでSSLIOP通信させる際に以下の不具合が発生する。
- RTCの起動に失敗する。
- マスターマネージャがTAOで動作している場合、スレーブマネージャの登録に失敗する。
To Reproduce
Steps to reproduce the behavior:
- 設定ファイルrtc.ssl.confとsvc.ssl.confを用意する。
corba.args: -ORBEndpoint ssliop:// -ORBSvcConf ./svc.ssl.conf -ORBDebugLevel 10
corba.nameservers: corbaloc:ssliop:localhost:2809
corba.master_manager: ssliop://localhost:2810
dynamic SSLIOP_Factory Service_Object *
TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory()
"-SSLPrivateKey PEM:server.pem -SSLCertificate PEM:root.crt -SSLPassword passward"
static Advanced_Resource_Factory "-ORBProtocolFactory SSLIOP_Factory"
- 以下のコマンドを実行する。
./ConsoleOutComp -d -f rtc.ssl.conf
./ConsoleInComp -f rtc.ssl.conf
- 以下のようにTAOのデバッグメッセージを確認したらsvc.ssl.confに
-SSLNoProtectionオプションを追加して再度コマンドを実行
SSLIOP (18845|18845) Interceptor (context), ssl=0 collocated=1
TAO (18845|18845) SL2_AccessDecision::access_decision(0,get_port_profile) collocated 1 NOT FOUND using default 0
TAO (18845|18845) SL2::access_allowed_ex returned false
terminate called after throwing an instance of 'CORBA::NO_PERMISSION'
- TAOのデバッグメッセージを確認すると以下のエラーが発生している。
TAO (17744|17770) - GIOP_Message_State::parse_message_header_i
TAO (17744|17770) - TAO_GIOP_Message_State::parse_magic_bytes, bad �IOP header: magic word [16,03,01,01]
TAO (17744|17770) - Transport[12]::handle_input, error parsing incoming message
TAO (17744|17770) - Resume_Handle::handle_input_return_value_hook, handle_input returning -1, so handle is not resumed.
TAO (17744|17770) - Connection_Handler[12]::handle_input_internal, handle = 12/12, retval = -1
TAO (17744|17770) - Connection_Handler[12]::close_connection_eh, purging entry from cache
Reproducibility
100%
Expected behavior
- RTCが正常に起動する
- マネージャを登録できる
Screenshots or Logs
Environment
- OS: Ubuntu 18.04
- OpenRTM-aist master branch
Additional context
- マスターマネージャへのスレーブマネージャの登録について
マスターマネージャへのスレーブマネージャの登録についてはcorbaloc形式での接続が失敗してから問題が起こっている。
エンドポイントをssliop://localhost:2810という形式ではなく、iiop://localhost:/ssl_port=2809もしくはssliop://localhost:/ssl_port=2810のようにssl_portのパラメータでポート番号を指定すると何故か問題が発生しない。TAOの仕様なのかバグなのかは不明。
現在のOpenRTM-aistの実装ではcorba.master_managerの項目に指定したエンドポイントを自動的にcorbaloc形式に変換するようになっているが、上記のようなssl_portのパラメータでポート番号を指定する場合の変換には対応していないため、現状ではマスターマネージャとスレーブマネージャで別々の設定ファイルを用意する必要がある。
- RTCの起動失敗について
TAOのSSLIOPにはCORBAオブジェクトごとにアクセス権限を設定する仕組み(OMG Security Service Specification Version 1.8のThe SecurityLevel2::AccessDecision Interfaceに対応する仕組み)があり、プロセス内からのCORBAオブジェクトへのアクセスはSSLではないため基本的にCORBA::NO_PERMISSION例外を投げるようになっている。
TAOではデフォルトでアクセスを許可/拒否を設定するdefault_decision関数とプロセス内部からのアクセスを許可/拒否を設定するdefault_collocated_decision関数が用意されており、特定のCORBAオブジェクトのアクセスの許可/拒否を設定したものを除き、設定していないCORBAオブジェクトについてはデフォルトの設定で許可/拒否を判断する。
ただし、現在のTAO(ver. 3.0.6)ではdefault_collocated_decision関数が上手く動作しておらず、プロセス内部からのアクセスだけではなく、プロセス外部からの通信の許可/拒否も設定されてしまう。
ソースコードを読んでみたのですが、意図が分からなかったのでバグだと思います。
正常に動作させるには、SL2_SecurityManager.cppの以下の部分に修正が必要です。
// if (this->default_collocated_decision_) //修正前
if (this->default_collocated_decision_ && collocated) //修正後
access_decision = true;