http://z-push.sourceforge.net/soswp/
# tar xzf z-push-2.1.0-1750.tar.gz # cd z-push-2.1.0-1750 # ls INSTALL LICENSE backend config.php include index.php lib tools version.php z-push-admin.php z-push-top.php
とりあえずINSTALLを読む。
サーバ要件:PHP5.1以上
ということは、PHP5.1とapacheの環境があればよいということか。
まずはDNS名(app.example.net)を用意する。
続いて鍵+証明書を作り、これをSSLサイトに食わせておく。
# openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout app.example.net.key -out app.example.net.crt
インストールは書いてある通りにやってみよう。prefixは/usr/localにしてみる。
# sudo tar xzf z-push-2.1.0-1750.tar.gz -C /usr/local/share # mkdir /var/lib/z-push /var/log/z-push # chown apache:apache /var/lib/z-push /var/log/z-push # vi /etc/httpd/conf.d/ssl.conf # httpd -t # service httpd reload
--- /etc/httpd/conf.d/ssl.conf (before) +++ /etc/httpd/conf.d/ssl.conf (after) @@ -81,5 +81,14 @@ AllowOverride all </Directory> + + Alias /Microsoft-Server-ActiveSync /usr/local/share/z-push/index.php + <directory /usr/local/share/z-push> + php_flag magic_quotes_gpc off + php_flag register_globals off + php_flag magic_quotes_runtime off + php_flag short_open_tag on + </Directory> + </VirtualHost> </IfModule>というわけで、予想通りはまる。
なんか言ってる。
PHP-MAPI extension is not available
調べてみたところ、一部のパッケージが足りていなかったもよう。
# yum install php-imap php-soap php-process
と思ったら、php-processはPHP5.3のパッケージなのね。
あきらめて、php-*系のパッケージを全部捨てて、php53-*をインストール。
# rpm -e php php-たくさん # yum install php-process php
やってみたがまだ動かぬ。
php-mapiってどこにあるんだよ!!
とりあえず「php-mapi rpm」で適当に探してくる。
.....fedoraprojectに落ちてたぽい。
# rpm -ivh php53-mapi-7.0.13-1.el5.i386.rpm エラー: 依存性の欠如: libicudata.so.36 は php53-mapi-7.0.13-1.el5.i386 に必要とされています libicui18n.so.36 は php53-mapi-7.0.13-1.el5.i386 に必要とされています libicuuc.so.36 は php53-mapi-7.0.13-1.el5.i386 に必要とされています libinetmapi.so.1 は php53-mapi-7.0.13-1.el5.i386 に必要とされています libmapi.so.0 は php53-mapi-7.0.13-1.el5.i386 に必要とされています
ぬおー。片っ端から探していれちまえ。
# rpm -ivh libmapi-7.0.13-1.el5.i386.rpm php53-mapi-7.0.13-1.el5.i386.rpm エラー: 依存性の欠如: libboost_filesystem-mt.so.5 は libmapi-7.0.13-1.el5.i386 に必要とされています libboost_system-mt.so.5 は libmapi-7.0.13-1.el5.i386 に必要とされています libical.so.0 は libmapi-7.0.13-1.el5.i386 に必要とされています libicalss.so.0 は libmapi-7.0.13-1.el5.i386 に必要とされています libvmime.so.0 は libmapi-7.0.13-1.el5.i386 に必要とされています zarafa-client = 7.0.13-1.el5 は libmapi-7.0.13-1.el5.i386 に必要とされています
えー。zarafa-clientが出てきたってことは、結局zarafaから落とした方がいいの?
でもさっきからEPELのパッケージ使ってるし….よし、ポリシーを緩めてEPEL解禁!
# rpm -ivh epel-release-5-4.noarch.rpm # yum install php53-mapi Dependencies Resolved ======================================================================================================================== Package Arch Version Repository Size ======================================================================================================================== Installing: php53-mapi i386 7.0.13-1.el5 epel 217 k Installing for dependencies: boost141-filesystem i386 1.41.0-4.el5 epel 73 k boost141-system i386 1.41.0-4.el5 epel 25 k libgsasl i386 0.2.29-1.el5 epel 100 k libical i386 0.48-1.el5 epel 202 k libmapi i386 7.0.13-1.el5 epel 904 k libntlm i386 1.0-1.el5 epel 43 k libvmime i386 0.9.2-0.1.20110626svn.el5 epel 887 k zarafa-client i386 7.0.13-1.el5 epel 1.3 M zarafa-common i386 7.0.13-1.el5 epel 22 k Transaction Summary ======================================================================================================================== Install 10 Package(s) Upgrade 0 Package(s) Total download size: 3.7 M Is this ok [y/N]:
まぢで?そういうオチ?
とりあえず入れてみる…..入った。
気を取り直してapacheリロード。
# httpd -t Syntax OK # service httpd reload
とりあえず500はなくなった。
続いて、config.phpをいじって、imapバックエンドを使うように変更。
--- /usr/local/share/z-push/config.php (before) +++ /usr/local/share/z-push/config.php (after) @@ -45,7 +45,7 @@ * Default settings */ // Defines the default time zone, change e.g. to "Europe/London" if necessary - define('TIMEZONE', ''); + define('TIMEZONE', 'Asia/Tokyo'); // Defines the base path on the server define('BASE_PATH', dirname($_SERVER['SCRIPT_FILENAME']). '/'); @@ -90,7 +90,7 @@ define('LOGFILE', LOGFILEDIR . 'z-push.log'); define('LOGERRORFILE', LOGFILEDIR . 'z-push-error.log'); define('LOGLEVEL', LOGLEVEL_INFO); - define('LOGAUTHFAIL', false); + define('LOGAUTHFAIL', true); // To save e.g. WBXML data only for selected users, add the usernames to the array @@ -185,7 +185,7 @@ * Backend settings */ // the backend data provider - define('BACKEND_PROVIDER', ''); + define('BACKEND_PROVIDER', 'BackendIMAP'); /********************************************************************************** * Search provider settings
んで、imap側のconfig.phpもいじる。
--- /usr/local/share/z-push/backend/imap/config.php (before) +++ /usr/local/share/z-push/backend/imap/config.php (after) @@ -46,13 +46,13 @@ // ************************ // Defines the server to which we want to connect -define('IMAP_SERVER', 'localhost'); +define('IMAP_SERVER', '127.0.0.1'); // connecting to default port (143) -define('IMAP_PORT', 143); +define('IMAP_PORT', 993); // best cross-platform compatibility (see http://php.net/imap_open for options) -define('IMAP_OPTIONS', '/notls/norsh'); +define('IMAP_OPTIONS', '/tls/norsh'); // overwrite the "from" header if it isn't set when sending emails // options: 'username' - the username will be set (usefull if your login is equal to your emailaddress)
で、iPhone側でExchangeアカウントをセット。
やってみるが"Connection Serfer Failed."などと言って一歩も動かない。
アカウント追加時の認証チェックは通っていたぽいので、パスワード周りは間違っていないはず。。。
しかし動かず。
とりあえず、いろんなところのデバッグフラグをONにしてみる。
--- /usr/local/share/z-push/config.php (before) +++ /usr/local/share/z-push/config.php (after) @@ -89,7 +89,7 @@ define('LOGFILEDIR', '/var/log/z-push/'); define('LOGFILE', LOGFILEDIR . 'z-push.log'); define('LOGERRORFILE', LOGFILEDIR . 'z-push-error.log'); - define('LOGLEVEL', LOGLEVEL_INFO); + define('LOGLEVEL', LOGLEVEL_DEBUG); define('LOGAUTHFAIL', true);
--- /usr/local/share/z-push/config.php (before) +++ /usr/local/share/z-push/config.php (after) @@ -52,7 +52,7 @@ define('IMAP_PORT', 993); // best cross-platform compatibility (see http://php.net/imap_open for options) -define('IMAP_OPTIONS', '/tls/norsh'); +define('IMAP_OPTIONS', '/tls/norsh/debug'); // overwrite the "from" header if it isn't set when sending emails // options: 'username' - the username will be set (usefull if your login is equal to your emailaddress)
しかしまだ動かない。
webでアクセスしてみても、しばらく待ってから再度認証を求められ、その直前に下記のようなログが出る。
/usr/local/share/z-push-2.1.0-1750/backend/imap/imap.php:99 imap_open(): Couldn't open stream {127.0.0.1:993/imap/tls/norsh/debug} (2)
気づいた。オレオレ証明書じゃん。
というわけで、接続オプションを変更。
--- /usr/local/share/z-push/config.php (before) +++ /usr/local/share/z-push/config.php (after) @@ -52,7 +52,7 @@ define('IMAP_PORT', 993); // best cross-platform compatibility (see http://php.net/imap_open for options) -define('IMAP_OPTIONS', '/tls/norsh/debug'); +define('IMAP_OPTIONS', '/tls/norsh/novalidate-cert'); // overwrite the "from" header if it isn't set when sending emails // options: 'username' - the username will be set (usefull if your login is equal to your emailaddress)まだ動かない。
imap_open()でコケると言っているが、dovecotのログがぜんぜんにぎやかじゃない。どーゆーことだ???
ということは、認証かセッション確立でこけてると予想。
imap_open()を使って直接たたいてみる。
imap_open("{127.0.0.1/tls/norsh/novalidate-cert}INBOX", $username, $password);
しっかり60秒待ってからエラーが表示された。
うーん、セッション確立の影響だなぁ。
で、下記のように変えてみた。
--- /usr/local/share/z-push/config.php (before) +++ /usr/local/share/z-push/config.php (after) @@ -52,7 +52,7 @@ define('IMAP_PORT', 993); // best cross-platform compatibility (see http://php.net/imap_open for options) -define('IMAP_OPTIONS', '/tls/norsh/novalidate-cert'); +define('IMAP_OPTIONS', '/ssl/norsh/novalidate-cert'); // overwrite the "from" header if it isn't set when sending emails // options: 'username' - the username will be set (usefull if your login is equal to your emailaddress)
StartTLSによるSSL確立ではなく、最初からSSLで突っ込むようにしてみた。
お!動いた!!
というわけで、今回の反省。
いろんな環境を整理して調査にあたる必要がありますね。
- imapのSSL状態。 どっちが直接の原因となるかは分からないけど、iPhoneでUse SSLを有効にしてるため、もしくはdovecot.confで「protocols=imaps」としているため、のいずれかもしくは両方の理由により、imap_open()のフラグに「/ssl」が必要。「/tls」ではだめ。
- 証明書。 自前でやる場合はそんなにお金かけてられないので、往々にしてオレオレ証明書を利用することに。dovecotから見れば、z-pushは当然普通のクライアントなので、当然証明書はチェックされます。なので、人的介入無しに証明書エラーをくぐり抜ける必要があります。
- ログはよく観察すること! いろんなログ(今回の場合はapache/dovecot/z-push)を見ましたが、特定のログだけを見ていても気づかないことが多いです。それぞれのコンポーネントがどのように連携しているのか?イベントが発生したタイミングで、どのログが流れてどのログが流れないのか?このあたりをちゃんと考慮してログを見ると、どこの部分でエラーが発生しているかのアタリがつけやすくなります。