OpenSSL をアップデートしたら Hubot が Slack に繋がらなくなった

ConoHa VPS 上の CentOS 6.7 で動かしていた Hubot が、昨日から Slack に繋がらなくなってしまいました。
原因は openssl をアップデートしたことだったのですが、原因を突き止めるまでの経緯を書いておきます。

いつものように BOT にネタを仕込んで、Hubot を再起動したところ、BOT がオンラインになりません。
ログを見てみると、

INFO Connecting...

で止まってる。

この "Connecting" はどのコードが出してるのかなと思って調べてみたら、hubot-slack が使っている slack-client が出しているらしい。

node_modules/slack-client/src/client.js L63-68
  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でアップデートしたばかりでした。

/var/log/yum.log
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 をダウングレードしてみたらどうだろうと思い、以下を実行。

$ sudo yum downgrade nss nss-sysinit nss-tools

変化無し。

じゃあもしかして一緒にアップデートされた openssl ?

$ sudo yum downgrade openssl openssl-devel

繋がった!
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 の部分に変わりはないので、そんなに大きな修正ではないと信じ、しばらく様子を見てみようと思います。

コメントを残す