Проблема проверки SSL в Excon для ONEBOX

Всем привет,

Я только что настроил и начал тестировать сервер Discourse, и пока всё отлично. У меня возникла проблема: onebox не работает, вероятно, из-за фильтра SSL-инспекции, который не может пройти проверку с использованием библиотеки excon. Я загрузил пользовательский корневой сертификат и добавил его в /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? Существует ли команда rails -r exec, которую можно добавить в app.yml?

Большое спасибо,

Гленн.

Какой URL показывает проблему? Вы используете официальную установку Discourse на основе Docker?

Похоже, что по умолчанию 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 в консоли, используя URI youtube oembed для получения 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, чтобы исправить это.