みなさん、こんにちは。
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.
gerhard
(Gerhard Schlager)
2019 年 9 月 17 日午後 12:25
2
どの URL で問題が発生していますか?公式の Docker ベースの Discourse インストールを使用していますか?
デフォルトでは excon が独自の証明書バンドルをバンドルしている ようですが、他の人々も同様の問題に直面していたため、環境で設定できるように追加されたのでしょうか?証明書が正しく配置されていれば、システム側のものを使用します。
ハッシュリンクの動作にはそれが必要かもしれません。以下の手順を試して、問題が解決するか確認してください。
マイケル、ありがとう。
環境変数を設定し、ハッシュを作成しましたが、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 ファイルに追加してそれを修正することはできないでしょう。