ConoHa VPS 上の CentOS 6.7 で動かしていた Hubot が、昨日から Slack に繋がらなくなってしまいました。
原因は openssl をアップデートしたことだったのですが、原因を突き止めるまでの経緯を書いておきます。
いつものように BOT にネタを仕込んで、Hubot を再起動したところ、BOT がオンラインになりません。
ログを見てみると、
INFO Connecting...
で止まってる。
この "Connecting" はどのコードが出してるのかなと思って調べてみたら、hubot-slack が使っている slack-client が出しているらしい。
Client.prototype.login = function() { this.logger.info('Connecting...'); return this._apiCall('rtm.start', { agent: 'node-slack' }, this._onLogin); };
コードを見てみると、"Connecting" をログに出力した後にrtm.startという API を叩いているようです。
もしかしてこれが失敗してるのかも?
rtm.startのフルパスはhttps://api.slack.com/api/rtm.startなので、これに対してパラメータをいろいろ変えながら POST をしてみましたが、レスポンスが返ってこない。
エラーが出るならまだしも、レスポンスが返ってこないというのはどういうことなんだろう?
そこで試しにhttps://api.slack.com/に対して GET でアクセスしてみることにしました。
$ curl -i https://api.slack.com/
が、こちらも反応無し。
どうやらこれは API の問題ではなく、api.slack.com との通信に失敗している?
試しに自宅の Fedora からも同じように試してみたところ、こちらはちゃんと HTML が返ってきました。
このサーバーだけの問題らしい。
curl にもっと詳細な情報を表示するオプションはないかなと思って、man を見てみたら、-v, --verboseというオプションがあったので、これを付けて実行。
$ curl -i -v https://api.slack.com/ * About to connect() to api.slack.com port 443 (#0) * Trying 52.22.222.210... connected * Connected to api.slack.com (52.22.222.210) port 443 (#0) * Initializing NSS with certpath: sql:/etc/pki/nssdb * CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none * NSS error -5990 * Closing connection #0 * SSL connect error curl: (35) SSL connect error
するとこんなエラーが出てきて、やっと原因らしきものを発見。
NSS は HTTPS で通信するために使われているようなのですが、最近どこかで見たような……
ちょうどその日、yum updateでアップデートしたばかりでした。
Jan 13 20:53:54 Updated: nss-sysinit-3.19.1-8.el6_7.x86_64 Jan 13 20:53:58 Updated: nss-3.19.1-8.el6_7.x86_64 Jan 13 20:54:00 Updated: openssl-1.0.1e-42.el6_7.2.x86_64 Jan 13 20:54:03 Updated: openssl-devel-1.0.1e-42.el6_7.2.x86_64 Jan 13 20:54:03 Updated: nss-tools-3.19.1-8.el6_7.x86_64 Jan 13 20:54:04 Updated: gnutls-2.8.5-19.el6_7.x86_64 Jan 13 20:54:04 Updated: openssl-1.0.1e-42.el6_7.2.i686
ほら。
じゃあこの nss をダウングレードしてみたらどうだろうと思い、以下を実行。
変化無し。
じゃあもしかして一緒にアップデートされた openssl ?
繋がった!
Hubot も再起動したらちゃんと繋がるようになりました。
openssl の最新バージョンがopenssl-1.0.1e-42.el6_7.2.i686で、ダウングレードされたバージョンがopenssl-1.0.1e-42.el6_7.1.i686。
この間に何かがあったんでしょうね。
その後 nss の方を最新のバージョンに戻しましたが、問題なく繋がっているので、こちらは関係なかったようです。
openssl なので、セキュリティ周りの修正のような気もしますが、1.0.1e-42 の部分に変わりはないので、そんなに大きな修正ではないと信じ、しばらく様子を見てみようと思います。