Docs header transparent bg

RubyGemsとBundlerのTLS/SSL問題のトラブルシューティング方法

SSL証明書やTLSバージョンに関連する問題が発生した場合、このガイドが役立ちます。このガイドでは、これらの問題の原因と解決方法を説明します。このガイドの多くの手順は、SSL証明書の問題とTLSバージョンの問題の両方の解決に役立ちます。

理由に興味がなく、できるだけ早く問題を解決したい場合は、SSLの問題に対する解決策に直接進むことができます。

目次

問題点

なぜcertificate verify failedが表示されるのですか?

RubyGemsからアップデートを取得しようとしたときに、次のSSLエラーが表示された場合:OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

このエラーは、コンピューターにRubyGems.orgの背後にあるサーバーが正しいものであることを検証するために必要なファイルがない場合に発生します。

最新バージョンのRubyGemsはこの問題を解決するはずなので、最新バージョンにアップデートすることをお勧めします。RubyGemsに最新バージョンへの自己アップデートを指示するには、gem update --systemを実行します。それでも解決しない場合は、以下の手動アップデート手順を試してください。

(「解決するはず」とはどういう意味ですか? 下記のこれらの証明書とは何ですか?RubyによるCA証明書の使用方法のセクションを参照して、根本的な問題をより深く理解してください。)

これらの証明書とは何ですか?

コンピューターがHTTPSを使用してサーバーと通信する際は常に、その接続の一部としてSSL証明書を使用します。証明書により、コンピューターはドメインの実際のサーバーと通信していることを認識し、コンピューターとサーバーが他のコンピューターが送受信される内容を知る必要なく完全にプライベートに通信できるようになります。

RubyGems.orgの証明書が正しいかどうかを確認するために、コンピューターは認証局(CA)の別の証明書を参照します。CA証明書バンドルには、Verisign、Globalsignなど、サーバーにSSL証明書を提供するすべての企業の証明書が含まれています。

各CAには、他の証明書の検証に使用される「ルート」証明書があります。CA証明書は、他の証明書を署名する証明書を署名し、証明書のグラフはツリーのように見え、「ルート」証明書がツリーのルートにあるため、「ルート」と呼ばれます。コンピューターは、多数のルート証明書からなる組み込みのCAバンドルを使用して、RubyGems.orgなどの特定のWebサイトによって提供されるSSL証明書を信頼するかどうかを判断します。

新しい企業がCAバンドルに追加されたり、既存の企業の証明書が期限切れになり、新しい証明書を配布する必要がある場合があります。ほとんどのWebサイトでは、Webブラウザが一般的なブラウザアップデートの一部としてCAバンドルを定期的に更新するため、これは大きな問題ではありません。

RubyによるCA証明書の使用方法

RubyGems.orgで使用されているSSL証明書は、比較的新しいルート証明書から派生しています。Ruby(そのためRubyGemsとBundler)には、Webサイトに接続するときに使用する定期的に更新されるCAバンドルがありません。通常、Rubyはオペレーティングシステム(OS)によって提供されるCAバンドルを使用します。古いOSでは、このCAバンドルは非常に古くなる可能性があります(10年前など)。これほど古いCAバンドルでは、RubyGems.orgの(比較的新しい)証明書を検証できないため、問題のエラーが発生する可能性があります:certificate verify failed

さらに複雑なことに、18~24か月前に発生した無関係の変更により、RubyGems.orgに対して新しいSSL証明書が発行されました。これは、接続の検証に必要な「ルート」証明書が変更されたことを意味します。そのため、以前はSSLの問題を解決するためにRubyGems/Bundlerをアップグレードしていた場合でも、再度アップグレードする必要があります。今回は、さらに新しい証明書を含むさらに新しいバージョンにアップグレードする必要があります。

証明書エラーのトラブルシューティング

自動SSLチェックの実行から始め、手順に従ってください。 BundlerのアップデートRubyGemsのアップデートRubyGems証明書の手動アップデート、または新しいOS証明書のインストールが必要になる場合があります。

なぜread server hello Aが表示されるのですか?

このエラーは、マシンがRubyGems.orgへの安全な接続を確立できなかったことを意味します。その問題の最も一般的な原因は、古いバージョンのOpenSSLを使用するRubyです。2012年3月12日にリリースされたOpenSSL 1.0.1は、2018年1月1日からRubyGems.orgに接続するために必要な最小バージョンです。

そのバージョンが必要な理由を理解するには、読み進めてください。OpenSSLと/またはRubyをアップデートして問題を解決する方法の手順については、トラブルシューティングセクションに進んでください。

SSLとTLSプロトコルバージョン

インターネット上の安全な接続はHTTPS(HTTPの安全なバージョン)を使用します。そのセキュリティは、当初はSecure Sockets Layerの略語であるSSLによって提供されていました。時が経つにつれて、研究者たちはSSLの欠陥を発見し、ネットワーク開発者は変更と修正で対応しました。SSL 3.0の後、それはTLS、またはTransport Layer Securityに置き換えられました。

時が経つにつれて、TLSも改訂されました。2011年に最初に定義され、2012年からOpenSSLでサポートされているTLSバージョン1.2は、現在の標準です。2017年、TLS 1.2より古いすべてのバージョンのSSLとTLSには、意図的なまたは知識のある敵によって悪用される可能性のある重大な欠陥があることが判明しました。その結果、セキュリティのベストプラクティスでは、すべてのバージョンのSSLとTLSバージョン1.0および1.1を積極的にブロックすることを推奨しています。

TLS 1.0と1.1は非推奨です

RubyGems.orgは、Fastlyと呼ばれるサードパーティのCDNプロバイダーを使用しており、世界中のユーザーが非常に迅速にgemをダウンロードできます。

昨年、Fastlyは、PCI Security Standard Councilによって公開された命令に従って、TLSバージョン1.0と1.1を非推奨にすることを発表しました。(Fastlyのブログ投稿で詳細をご覧ください。

その結果、RubyGems.orgは2018年1月以降、最低限TLSv1.2を必要とします。これは、RubyGems.orgとgemコマンドが、TLS 1.2をサポートしていないRubyとOpenSSLのバージョンをサポートしなくなることを意味します。

プロトコルエラーのトラブルシューティング

プロトコル接続エラーのトラブルシューティングを行うには、自動SSLチェックの実行から始め、手順に従ってください。BundlerのアップデートRubyGemsのアップデート、またはRubyの再インストールが必要になる場合があります(再インストール手順はバージョンマネージャーまたはパッケージマネージャーで確認できます)。

解決策

自動SSLチェック

まず、このスクリプトを実行して、エラーがSSL証明書の問題によるものか、TLSバージョンの問題によるものかをチェックします。

このコマンドを使用してスクリプトをすぐに実行できます(Windows 10でも)。

$ curl -Lks 'https://git.io/rg-ssl' | ruby

出力に「証明書がないため、Rubyはrubygems.orgに接続できません」と表示された場合は、証明書の検証エラーが発生しており、証明書をアップデートする必要があります。

代わりに「OpenSSLのバージョンが古すぎるため、Rubyはrubygems.orgに接続できません」と表示された場合は、OpenSSLのバージョンが古く、TLSv1.2と互換性がないため、OpenSSLをアップグレードするか、新しいバージョンのSSLを使用するようにRubyを再コンパイルする必要があります。

このガイドの手順は、両方の問題のトラブルシューティングに役立ちます。

Bundlerのアップデート

次のコマンドを実行して、最新バージョンのBundlerにアップデートします。

gem install bundler

RubyGemsのアップデート

自己アップデートコマンドを使用してRubyGemsをアップグレードできる場合があります。

gem update --system

そのコマンドが失敗した場合は、最新版のRubyGemsを自分でダウンロードしてインストールしてみてください。この例では、RubyGems 2.7.6をダウンロードしてインストールします。お読みになっている時点で最新バージョンのRubyGemsが変更されている場合は、2.7.6が表示されている場所をすべてダウンロードしたRubyGemsのバージョンに変更する必要があります。

  1. Webブラウザを使用して、RubyGemsのダウンロードページにアクセスし、最新版のrubygemsのgemバージョンをダウンロードします。
  2. gemをダウンロードしたら、macOSではTerminal.appを、WindowsではRubyを使用するコマンドプロンプトを開きます。
  3. ダウンロードフォルダーにディレクトリを変更します。macOSでは、コマンドはcd ~/Downloadsです。Windowsでは、cd C:\Users\%USERNAME%\Downloadsです。
  4. gem install --local rubygems-update-2.7.6.gemを実行して、ダウンロードしたRubyGemsアップグレードgemをインストールします。
  5. アップグレードコマンドupdate_rubygemsを実行します。

完了です!gem --versionを実行して、最新バージョンのRubyGemsを使用していることを確認します。

システムクロックのアップデート

システムクロックが過去または未来の時刻に設定されている場合、マシンはRubyGems.orgへの安全な接続を確立できません。この問題を解決するには、システムクロックを現在時刻に設定する必要があります。Linuxでは、sudo ntpdate ntp.ubuntu.comを実行してシステムクロックをアップデートできます。

システムクロックをアップデートするためのその他の解決策を以下に示します。

CA証明書のアップデート

新しいRubyGems証明書のインストール

RubyGemsをアップデートできない場合は、RubyGemsに必要な証明書を手動で追加できます。十分に新しいバージョンのRubyGems(バージョン2.1.x以上)があり、「ベンダー」証明書を使用でき、証明書を正常にインストールした場合、RubyGemsのバージョンをアップグレードしなくても機能します。

警告:これらの手順では新しい証明書のみが追加されます。Rubyはそのまま残されます。RubyバージョンがTLSv1.2を使用できることを確認するには、スニペットを再度実行します。そうでない場合は、このガイドの別の説明に従ってRubyもアップグレードしてください。

手順1:新しい信頼証明書を取得する

このリンクから.pemファイルをダウンロードします:GlobalSignRootCA.pem

次に、ダウンロードしたファイルを見つけ、ファイル名が.pemで終わっていることを確認します。(注記:一部のブラウザでは拡張子が.txtに変更され、動作しなくなります。そのため、ダウンロードしたファイルの拡張子が.pemであることを確認することが重要です。)

手順2:インストールしたRubyGems証明書ディレクトリを見つける

次に、.pemファイルをそこに追加するために、Rubyをインストールしたディレクトリを見つけます。

Windowsの場合:

コマンドラインを開き、次のコマンドを入力します。

C:\>gem which rubygems

次のような出力が表示されます。

C:/Ruby21/lib/ruby/2.1.0/rubygems.rb

目的のディレクトリを表示するウィンドウを開くには、同じウィンドウでファイル拡張子までのパスを入力します(ただし、バックスラッシュを使用します)。例えば、上記の出力に基づくと、以下のコマンドを実行します。

C:\>start C:\Ruby21\lib\ruby\2.1.0\rubygems

これにより、Explorerウィンドウが開き、RubyGemsがインストールされているディレクトリが表示されます。

macOSの場合:

ターミナルを開き、以下のコマンドを実行します。

$ gem which rubygems

次のような出力が表示されます。

/opt/rubies/2.4.1/lib/ruby/2.4.0/rubygems.rb

目的のディレクトリを表示するウィンドウを開くには、出力されたパス(末尾の“.rb”を除く)に対してopenコマンドを使用します。以下のように。

$ open /opt/rubies/2.4.1/lib/ruby/2.4.0/rubygems

Finderウィンドウが開き、RubyGemsがインストールされているディレクトリが表示されます。

ステップ3: 新しい信頼できる証明書をコピー

ウィンドウで、ssl_certsディレクトリを開きます。AddTrustExternalCARoot.pemなどの他の.pemファイルを探します(rubygems.orgなどのサブディレクトリにある場合があります)。そして、あなたのファイルをそれらのファイルの横にドラッグします。

これが完了すると、最上部にある手順に従ってRubyGemsを自動的に更新できるはずです。「RubyGemsの更新」セクションで手順を確認できます。それでもうまくいかない場合は、このガイドに従い続けてください。

新しいOS証明書のインストール

この解決策は、HomebrewでインストールされたOpenSSLのバージョンが、Rubyが正しい証明書を見つける機能を妨げている場合に有効な場合があります。場合によっては、すべてをアンインストールして最初からやり直すだけで問題が解決することがあります。

まず、RVMを削除します。以下のコマンドを実行して削除できます。

$ rvm implode

次に、HomebrewからOpenSSLを削除します。(--forceを使用すると、インストールされているすべてのバージョンのOpenSSLが確実に削除されます)

$ brew uninstall openssl --force

これで、前の手順に従ってRVMを再インストールできます。

バージョンマネージャーからのRubyの再インストール

rvmでインストール

注記: RVMでSSL証明書を更新しても機能しない場合に、この解決策を試してください。RVMでインストールされたRubyが、証明書が更新された後でも正しい証明書を見つけられない場合は、RVMを再インストールしてからRubyのバージョンを再インストールすることで解決できる場合があります。

RVMを削除して再インストールするには、以下のコマンドを実行します。

$ rvm implode $ \curl -sSL https://get.rvm.io | bash -s stable

次に、事前にコンパイルされたバイナリを使用しないようにRVMに指示して、Rubyを再インストールします。(残念ながら、時間がかかりますが、SSLの問題が解決するはずです。)

このコマンドはRuby 2.2.3をインストールします。必要なRubyのバージョンに合わせてコマンドを調整してください。

$ rvm install 2.2.3 --disable-binary

ruby-buildまたはrbenv installでインストール

rbenvによるruby-buildの更新とトラブルシューティングガイドに記載されている手順に従ってください。

OSパッケージマネージャーからのRubyの再インストール

macOS:組み込みRuby

macOS 10.13 High Sierraには、TLSv1.2と互換性のあるデフォルトのRubyが付属しています。

現在のmacOSのバージョンを確認するには、Appleメニューから「このMacについて」を選択します。「macOS High Sierra」以外が表示される場合は、最新のmacOSにアップグレードする必要があります(または、次の手順に従ってHomebrewで新しいバージョンのRubyをインストールする必要があります)。

High Sierraにアップグレードするには

    1. App Storeアプリケーションを開きます。
    1. 「アップデート」タブを選択します。
    1. 「macOS High Sierra」の「インストール」ボタンをクリックします。

macOS:Homebrewでインストール

注記: Homebrewで新しいバージョンのRubyをインストールするには、まずHomebrewがインストールされていることを確認します。brewコマンドが存在しない場合は、https://brew.shのインストール手順に従ってから、これらの手順に戻ってください。

    1. brew updateを実行します。
    1. brew install rubyを実行します。
    1. Rubyが既にインストールされている場合は、brew upgrade rubyを実行して最新バージョンにアップグレードします。

DebianまたはUbuntu 16.04:apt-getでインストール

注記: aptでRubyを削除するには、インストールされているRubyのバージョンを確認する必要があります。aptはRuby v2.3.1をインストールします。

アンインストールするには、ここに記載されている手順に従います。(これらの手順はUbuntuとDebianの両方で機能します。)

Rubyを正常にアンインストールしたら、以下を実行して再インストールします。

$ sudo apt-get install ruby

Fedora:dnfでインストール

注記: 最新バージョンのFedoraはパッケージマネージャーとしてdnfを使用しますが、古いバージョンは代わりにyumを使用します。dnf: command not foundというエラーメッセージが表示された場合は、これらの手順のdnfyumに置き換えてください。

まず、以下を実行してRubyをアンインストールします。

$ dnf remove ruby

そして再インストールします(このコマンドはRuby 2.3をインストールします)。

$ dnf install ruby

RHELまたはCentOS:yumでインストール

CentOSでのRubyのアップグレードに関するこれらの手順に従ってください。(OpenSSLのトラブルシューティングに関する手順も含まれています。)

Windows:Ruby Installerでインストール

コントロールパネルから、「プログラム」でRubyインストーラーを見つけます。フォルダをクリックし、「Rubyのアンインストール」をもう一度クリックします。RubyInstallerでRubyとRuby DevKitをダウンロードして再インストールします。

追加のヘルプ

別の自動SSLチェックの実行

自動SSLチェックを再実行して、問題がSSLの問題なのかTLSの問題なのかを確認します。上記の手順に従ってもまだ問題が発生する場合は、次の手順については以下の問題の作成セクションを参照してください。

問題の作成

これらの手順のどれも問題を解決しなかった場合は、次に問題を報告します。

(エラーがgem installから発生した場合は、RubyGemsの問題トラッカーで問題を作成します。bundle installから発生した場合は、Bundlerの問題トラッカーで問題を作成します。)

以下の情報を含めてください。

  • gem envを実行した出力
  • bundle envを実行した出力
  • ruby -ropenssl -e 'puts OpenSSL::OPENSSL_LIBRARY_VERSION'を実行した出力
  • 使用しているRubyバージョンマネージャー(もしあれば)
  • OSとOSのバージョン
  • パッケージマネージャーの名前とバージョン(該当する場合)

このガイドへの貢献

ここにリストされていない解決策を見つけた場合は、プルリクエストを送信してあなたの解決策をこのガイドに追加してください!

エラーを見つけた場合や、何かが不足していることに気づいた場合は、GitHubでこのドキュメントを編集してください。