ejabberdにPsiでアクセス

以下の要領でVirtualBoxCentOS 5.5にインストールしたejabberdに、Psiでアクセスしてみます。
CentOS 5.5にejabberdをインストール - ayweekend's blog

ejabberdの設定

/opt/ejabberd-2.1.10/conf/ejabberd.cfgに最初から以下のように設定があります。

{listen,
 [
  {5222, ejabberd_c2s, [
                        {certfile, "/opt/ejabberd-2.1.10/conf/server.pem"}, starttls,
                        {access, c2s},
                        {shaper, c2s_shaper},
                        {max_stanza_size, 65536}
                       ]},
...

5222番ポートを開けます。なお、SELinuxはすでに無効にしています。

~# system-config-securitylevel-tui -q -p 5222:tcp

Psiのインストール

PsiはVirtaulBoxのXubuntu 12.04にインストールします。

~$ sudo apt-get install psi

Psiからアクセス

CentOSとXubuntuはVirtualBoxのゲストOSでNAT接続です。そのためホストOSを経由してアクセスします。

VirtualBoxの仮想マシン設定からCentOSのポートフォワーディングを設定しておきます。

f:id:ayweekend:20120515003507p:plain

PsiでJIDとパスワード、接続先のホストとポート番号を指定します。

f:id:ayweekend:20120515003511p:plain

f:id:ayweekend:20120515003510p:plain

設定の後、オンラインにしようとするとエラーが出ます。

f:id:ayweekend:20120515003509p:plain

一方、CentOS/opt/ejabberd-2.1.10/logs/ejabberd.logを見てみると、以下のエラーが残っていました。

=ERROR REPORT==== 2012-05-15 00:25:54 ===
** State machine <0.531.0> terminating 
** Last event in was {xmlstreamelement,
                         {xmlelement,"starttls",
                             [{"xmlns","urn:ietf:params:xml:ns:xmpp-tls"}],
                             []}}
** When State == wait_for_feature_request
**      Data  == {state,{socket_state,gen_tcp,#Port<0.475>,<0.530.0>},
                        ejabberd_socket,#Ref<0.0.0.11085>,false,"3203444177",
                        {sasl_state,"jabber","localhost.localdomain",[],
                                    #Fun<ejabberd_c2s.1.52538782>,
                                    #Fun<ejabberd_c2s.2.77839348>,
                                    #Fun<ejabberd_c2s.3.97921512>,undefined,
                                    undefined},
                        c2s,c2s_shaper,false,true,false,false,
                        [verify_none,
                         {certfile,"/opt/ejabberd-2.1.10/conf/server.pem"}],
                        false,undefined,[],"localhost.localdomain",[],
                        undefined,
                        {pres_t,0},
                        {pres_f,0},
                        {pres_a,0},
                        {pres_i,0},
                        undefined,undefined,undefined,false,
                        {userlist,none,[],false},
                        unknown,unknown,
                        {{10,0,2,2},56954},
                        [],"en"}
** Reason for termination = 
** {{case_clause,{error,{open_error,-10}}},
    [{tls,tcp_to_tls,2},
     {ejabberd_socket,starttls,3},
     {ejabberd_c2s,wait_for_feature_request,2},
     {p1_fsm,handle_msg,10},
     {proc_lib,init_p,5}]}

ググッてみて以下のページが見つかりました。
http://stackoverflow.com/questions/4546076/ejabberd-tls-driver-error

libssl.so.0.9.8とlibcrypto.so.0.9.8がないからというようなことだそうです。記載されている通り確認してみます。

~# ldd /opt/ejabberd-2.1.10/lib/ejabberd-2.1.10/priv/linux-x86/lib/tls_drv.so 
	linux-gate.so.1 =>  (0x005cd000)
	libssl.so.0.9.8 => not found
	libcrypto.so.0.9.8 => not found
	libc.so.6 => /lib/libc.so.6 (0x00e49000)
	/lib/ld-linux.so.2 (0x001eb000)

ありませんでした。シンボリックリンクを作成します。

~# cd /lib/
lib# ln -s libssl.so.0.9.8e libssl.so.0.9.8
lib# ln -s libcrypto.so.0.9.8e libcrypto.so.0.9.8
lib# ls libssl.so.* libcrypto.so.*
libcrypto.so.0.9.8   libcrypto.so.6   libssl.so.0.9.8e
libcrypto.so.0.9.8e  libssl.so.0.9.8  libssl.so.6

もう一度確認してみます。今度は大丈夫なようです。

~# cd /opt/ejabberd-2.1.10/lib/ejabberd-2.1.10/priv/linux-x86/lib/
lib# ldd tls_drv.so 
./tls_drv.so: /lib/libcrypto.so.0.9.8: no version information available (required by ./tls_drv.so)
./tls_drv.so: /lib/libssl.so.0.9.8: no version information available (required by ./tls_drv.so)
	linux-gate.so.1 =>  (0x00598000)
	libssl.so.0.9.8 => /lib/libssl.so.0.9.8 (0x00ba2000)
	libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x00651000)
	libc.so.6 => /lib/libc.so.6 (0x00110000)
	libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00a2b000)
	libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x007fd000)
	libcom_err.so.2 => /lib/libcom_err.so.2 (0x00938000)
	libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x005df000)
	libresolv.so.2 => /lib/libresolv.so.2 (0x00e72000)
	libdl.so.2 => /lib/libdl.so.2 (0x003e4000)
	libz.so.1 => /usr/lib/libz.so.1 (0x00ed1000)
	/lib/ld-linux.so.2 (0x00e50000)
	libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00a5e000)
	libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00256000)
	libselinux.so.1 => /lib/libselinux.so.1 (0x00e0e000)
	libsepol.so.1 => /lib/libsepol.so.1 (0x00259000)

あらためてPsiでオンラインにすると、今度は成功しました。ただし、証明書のエラーが出ます。

f:id:ayweekend:20120515003512p:plain

また、/opt/ejabberd-2.1.10/logs/ejabberd.logを見てみると、接続のログが残っています。

=INFO REPORT==== 2012-05-15 00:52:50 ===
I(<0.443.0>:ejabberd_listener:281) : (#Port<0.477>) Accepted connection {{10,0,2,2},57284} -> {{10,0,2,15},5222}