ONEBOX の Excon SSL 検証に関する問題

みなさん、こんにちは。

Discourse サーバーをセットアップし、テストを開始したところ、非常に良い出来です。ただ、onebox が機能しないという問題に直面しています。これは、excon gem の検証に失敗する SSL 検査フィルタが原因ではないかと考えています。カスタムルート証明書をダウンロードしてホストの /etc/ssl/certs に追加し、テストのためにコンテナ内にも追加しましたが、効果はありませんでした。URL を埋め込み用に貼り付けるたびに、/log/rails/production.log に以下のエラーが表示されます。

Failed to onebox [youtube url] SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certifciate) (OpenSSL::SSL::SSLError) Unable to verify certificate.

excon のデフォルトを変更して別の ssl_path を指すようにする必要があると記載されていますが、Discourse の更新を妨げずに安全に行う方法がわかりません。excon 内でカスタムルート証明書を有効とみなすにはどうすればよいか、ご助言いただけないでしょうか?app.yml に設定できる rails -r exec コマンドなどはありますか?

よろしくお願いいたします。

Glenn.

どの URL で問題が発生していますか?公式の Docker ベースの Discourse インストールを使用していますか?

デフォルトでは excon が独自の証明書バンドルをバンドルしている ようですが、他の人々も同様の問題に直面していたため、環境で設定できるように追加されたのでしょうか?証明書が正しく配置されていれば、システム側のものを使用します。

ハッシュリンクの動作にはそれが必要かもしれません。以下の手順を試して、問題が解決するか確認してください。

  • 以下の両方を行ってください:
    • カスタム証明書をコンテナ内の /etc/ssl/certs に追加する

    • ハッシュリンクを追加する:例

      ln -s my_custom_cert.pem /etc/ssl/certs/$(openssl x509 -hash -noout -in /etc/ssl/certs/my_custom_cert.pem).0
      

マイケル、ありがとう。

環境変数を設定し、ハッシュを作成しましたが、SSL エラーは目立たなくなりました。しかし、Onebox がまだ何も動作していません。私が何か間違っている可能性について、ジェフからアドバイスがあれば教えていただけますか?@codinghorror

ただし、コンテナ内で変更を加えても、再ビルド時に破棄されてしまうのではないかと心配しています。そのため、ここでの最適なアプローチがどうあるべきか確信が持てません。

グレン。

失敗がキャッシュされている可能性がありますが、一度に一つずつテストしてみましょう。

環境変数を追加する必要はありませんが、証明書を追加したかどうかを確認するには、例えば以下のように実行してみてください。

root:~# /var/discourse/launcher enter app
root@app:/var/www/discourse# rails console
[1] pry(main)>
Net::HTTP.get URI 'https://meta.discourse.org/about.json'

結果が得られれば(以前は得られなかった場合)、証明書が正しくインストールされたことを意味します。その後、コンテナ定義にコマンドを追加して、再ビルドのたびにその証明書をインストールし、永続化できるようにします。

マイケル、ありがとうございます。rails console コマンドは正常に動作し、リンクされた JSON ファイルをダウンロードできました。

以前は動作しなかったのかもしれませんが、以前はルート証明書を /etc/ssl/certs/ にインストールしましたが、それでも動作しませんでした。

コンテナ内で export SSL_CERT_DIR=“/etc/ssl/certs/” を実行したところ、SSL エラーは消えたようです。少なくとも、production.log には何も表示されなくなりました。

ありがとうございました、

グレン。

実は、問題の解決策が見つかったかもしれません。これは、おそらく企業のフィルタによる認証プロンプトです。コンソールで Net::HTTP.get を使用して YouTube の oEmbed URI から埋め込み JSON を取得しようとしたところ、代わりに認証用の HTML ドキュメントが返ってきました。そのため、それが現在の障壁になっていると考えています。マイケル、どうもありがとう。

シンボリックリンクも作成しましたか?それは非常に重要な部分です。

証明書を恒久的に配置するには、app.yml ファイルを編集して、hooks セクションを以下のように追加または変更してください。

hooks:
  before_code:
    - file:
        path: /etc/ssl/certs/custom-root.crt
        chmod: 644
        contents: |
          -----BEGIN CERTIFICATE-----
          …
          -----END CERTIFICATE-----
    - exec:
        cmd:
          - bash -c "ln -s custom-root.crt /etc/ssl/certs/$(openssl x509 -hash -noout -in /etc/ssl/certs/custom-root.crt).0"

ああ、おそらく app.yml ファイルに追加してそれを修正することはできないでしょう。