🍣

rubygems.orgにSSL接続できなくなった(macos)

2023/01/25に公開

TL;DR

  • rubygems.orgにSSL接続できず、ブラウザからのアクセス、gem installコマンドが通らない状態だった
  • /private/etc/hostsファイルにrubygems.orgに対応するIPアドレスが記載されており、それをコメントアウトすることで解決

経緯や調査録

docker conpose buildの処理中でgem installを行うようにしており、その中でSSLエラーが発生していました。

(中略)
------                              
 > [19/21] RUN gem install bundler -v="2.0.2":
#23 0.504 ERROR:  SSL verification error at depth 0: ok (0)
#23 0.519 ERROR:  SSL verification error at depth 0: ok (0)
#23 0.530 ERROR:  SSL verification error at depth 0: ok (0)
#23 0.532 ERROR:  Could not find a valid gem 'bundler' (= 2.0.2), here is why:
#23 0.532           Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=error: certificate verify failed (certificate rejected) (https://rubygems.org/specs.4.8.gz)
#23 0.546 ERROR:  SSL verification error at depth 0: ok (0)
#23 0.561 ERROR:  SSL verification error at depth 0: ok (0)
------

docker依存のエラーかもしれないと思い、ローカルでruby環境を作成し、同じようにgem installコマンドを使ったが同様のエラーが出る。
こうなると、dockerじゃなくて自分のPCがおかしい可能性が高いかなと思いました。

この辺りでようやく気付きましたが、ブラウザからhttps://rubygems.org/ にアクセスすると、SSLエラーが出るようになってました。

chromeのエラーコードだけど、NET::ERR_CERT_COMMON_NAME_INVALIDというエラーらしい。
CNとアクセスするドメインの名前が一致していないっぽいということだけわかりましたが、原因不明。

次に証明書を見てみる

うーん、わからん。
該当する証明書をダウンロードしてキーチェーンに登録したりしても解決しませんでした。

ここで別端末からアクセスするとどうなるのか試してみると、正常にアクセスすることができて、さらにサーバー証明書も先程のものとは違うということが判明。
エラーが出ている端末の別ユーザーでもアクセスしてみても、正常にアクセスすることができて、サーバー証明書も別端末のものと同じものが用いられていました。
これらのことから自分の端末のエラーが出ているユーザーの証明書かネットワークの設定辺りがおかしいのかなと推測するも、これ以上の情報は見つからずでした...。

ちなみに公式のトラブルシューティングにSSL/TLS周りについてのページがあり、 そこに書いてあることを色々試してみたけど解決しませんでした。(すべては試せていない)
https://bundler.io/guides/rubygems_tls_ssl_troubleshooting_guide.html
その中で、SSL接続状況をチェックするスクリプトがあったので、参考に実行結果を載せておきます。rubyなどの環境の情報もちょうどいいのでこちらでの記載としておきます。
curl -Lks 'https://git.io/rg-ssl' | ruby

root@39278a4da6ff:/app# curl -Lks 'https://git.io/rg-ssl' | ruby
Here's your Ruby and OpenSSL environment:

Ruby:           2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux]
RubyGems:       3.0.3
Bundler:        1.17.2
Compiled with:  OpenSSL 1.1.0j  20 Nov 2018
Loaded version: OpenSSL 1.1.0l  10 Sep 2019
SSL_CERT_FILE:  /usr/lib/ssl/cert.pem
SSL_CERT_DIR:   /usr/lib/ssl/certs

With that out of the way, let's see if you can connect to rubygems.org...

Bundler connection to rubygems.org:       failed  ❌  (certificate verification)
ERROR:  SSL verification error at depth 0: ok (0)
RubyGems connection to rubygems.org:      failed  ❌  (certificate verification)
Ruby net/http connection to rubygems.org: failed  ❌

Unfortunately, this Ruby can't connect to rubygems.org. 😡
Your Ruby can't connect to rubygems.org because you are missing the certificate files OpenSSL needs to verify you are connecting to the genuine rubygems.org servers.

そうこうしてググるのもそろそろ限界が見えてきたなあというところで、ふとtwitterで同じケースの人がいないか調べてみると、それっぽいのが見つかりました!
(ツイートは公開されているとはいえ、迷惑かもしれないので該当のツイートは伏せておきます)

ツイートによると、hostsファイルの設定がおかしくなっているとかなんとか。

僕も/private/etc/hostsファイルを見てみると、身に覚えがないrubygems.orgの設定が...!
こちらをコメントアウトすることで、無事すべてのSSLアクセスができるようになりました。

どうしてこのような設定になったのか全く身に覚えがないですが、これですべて解決したのでした。めでたしめでたし。

Discussion