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バンドルを定期的に更新するため、これは大きな問題ではありません。
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をアップデートして問題を解決する方法の手順については、トラブルシューティングセクションに進んでください。
インターネット上の安全な接続は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を積極的にブロックすることを推奨しています。
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証明書の問題によるものか、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にアップデートします。
gem install bundler
自己アップデートコマンドを使用してRubyGemsをアップグレードできる場合があります。
gem update --system
そのコマンドが失敗した場合は、最新版のRubyGemsを自分でダウンロードしてインストールしてみてください。この例では、RubyGems 2.7.6をダウンロードしてインストールします。お読みになっている時点で最新バージョンのRubyGemsが変更されている場合は、2.7.6
が表示されている場所をすべてダウンロードしたRubyGemsのバージョンに変更する必要があります。
cd ~/Downloads
です。Windowsでは、cd C:\Users\%USERNAME%\Downloads
です。gem install --local rubygems-update-2.7.6.gem
を実行して、ダウンロードしたRubyGemsアップグレードgemをインストールします。update_rubygems
を実行します。完了です!gem --version
を実行して、最新バージョンのRubyGemsを使用していることを確認します。
システムクロックが過去または未来の時刻に設定されている場合、マシンはRubyGems.orgへの安全な接続を確立できません。この問題を解決するには、システムクロックを現在時刻に設定する必要があります。Linuxでは、sudo ntpdate ntp.ubuntu.com
を実行してシステムクロックをアップデートできます。
システムクロックをアップデートするためのその他の解決策を以下に示します。
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の更新」セクションで手順を確認できます。それでもうまくいかない場合は、このガイドに従い続けてください。
この解決策は、HomebrewでインストールされたOpenSSLのバージョンが、Rubyが正しい証明書を見つける機能を妨げている場合に有効な場合があります。場合によっては、すべてをアンインストールして最初からやり直すだけで問題が解決することがあります。
まず、RVMを削除します。以下のコマンドを実行して削除できます。
$ rvm implode
次に、HomebrewからOpenSSLを削除します。(--force
を使用すると、インストールされているすべてのバージョンのOpenSSLが確実に削除されます)
$ brew uninstall openssl --force
これで、前の手順に従ってRVMを再インストールできます。
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の更新とトラブルシューティングガイドに記載されている手順に従ってください。
macOS 10.13 High Sierraには、TLSv1.2と互換性のあるデフォルトのRubyが付属しています。
現在のmacOSのバージョンを確認するには、Appleメニューから「このMacについて」を選択します。「macOS High Sierra」以外が表示される場合は、最新のmacOSにアップグレードする必要があります(または、次の手順に従ってHomebrewで新しいバージョンのRubyをインストールする必要があります)。
High Sierraにアップグレードするには
注記: Homebrewで新しいバージョンのRubyをインストールするには、まずHomebrewがインストールされていることを確認します。brew
コマンドが存在しない場合は、https://brew.shのインストール手順に従ってから、これらの手順に戻ってください。
brew update
を実行します。brew install ruby
を実行します。brew upgrade ruby
を実行して最新バージョンにアップグレードします。apt-get
でインストール注記: apt
でRubyを削除するには、インストールされているRubyのバージョンを確認する必要があります。apt
はRuby v2.3.1をインストールします。
アンインストールするには、ここに記載されている手順に従います。(これらの手順はUbuntuとDebianの両方で機能します。)
Rubyを正常にアンインストールしたら、以下を実行して再インストールします。
$ sudo apt-get install ruby
dnf
でインストール注記: 最新バージョンのFedoraはパッケージマネージャーとしてdnf
を使用しますが、古いバージョンは代わりにyum
を使用します。dnf: command not found
というエラーメッセージが表示された場合は、これらの手順のdnf
をyum
に置き換えてください。
まず、以下を実行してRubyをアンインストールします。
$ dnf remove ruby
そして再インストールします(このコマンドはRuby 2.3をインストールします)。
$ dnf install ruby
yum
でインストールCentOSでのRubyのアップグレードに関するこれらの手順に従ってください。(OpenSSLのトラブルシューティングに関する手順も含まれています。)
コントロールパネルから、「プログラム」でRubyインストーラーを見つけます。フォルダをクリックし、「Rubyのアンインストール」をもう一度クリックします。RubyInstallerでRubyとRuby DevKitをダウンロードして再インストールします。
自動SSLチェックを再実行して、問題がSSLの問題なのかTLSの問題なのかを確認します。上記の手順に従ってもまだ問題が発生する場合は、次の手順については以下の問題の作成セクションを参照してください。
これらの手順のどれも問題を解決しなかった場合は、次に問題を報告します。
(エラーがgem install
から発生した場合は、RubyGemsの問題トラッカーで問題を作成します。bundle install
から発生した場合は、Bundlerの問題トラッカーで問題を作成します。)
以下の情報を含めてください。
gem env
を実行した出力bundle env
を実行した出力ruby -ropenssl -e 'puts OpenSSL::OPENSSL_LIBRARY_VERSION'
を実行した出力ここにリストされていない解決策を見つけた場合は、プルリクエストを送信してあなたの解決策をこのガイドに追加してください!