ejabberdにPsiでアクセス
以下の要領でVirtualBoxのCentOS 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のポートフォワーディングを設定しておきます。

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


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

一方、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でオンラインにすると、今度は成功しました。ただし、証明書のエラーが出ます。

また、/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}