Excon SSL-Verifizierungsproblem für ONEBOX

Hallo zusammen,

ich habe gerade einen Discourse-Server eingerichtet und teste ihn derzeit – bisher läuft alles großartig. Allerdings habe ich ein Problem: Onebox funktioniert nicht, weil meiner Meinung nach ein SSL-Inspektionsfilter die Verifizierung mit dem excon-Gem nicht durchführt. Ich habe das benutzerdefinierte Root-Zertifikat heruntergeladen und sowohl auf dem Host unter /etc/ssl/certs als auch innerhalb des Containers (zum Testen) hinzugefügt, aber ohne Erfolg. Immer wenn ich eine URL zum Einbetten einfüge, erscheint im Logfile /log/rails/production.log weiterhin der folgende Fehler:

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

Es wird erwähnt, die excon-Defaults so zu ändern, dass sie auf einen anderen ssl_path verweisen, doch ich bin unsicher, wie ich das sicher umsetzen kann, ohne dass Discourse weiterhin Updates erhalten kann. Kann mir jemand raten, wie ich sicherstellen kann, dass ein benutzerdefiniertes Root-Zertifikat innerhalb von excon als gültig erkannt wird? Gibt es einen rails -r exec-Befehl, den ich in die app.yml einfügen könnte?

Vielen Dank im Voraus,

Glenn.

Welche URL zeigt das Problem? Verwendest du die offizielle Docker-basierte Installation von Discourse?

Es sieht so aus, als würde excon standardmäßig sein eigenes Zertifikatsbundle enthalten, aber da andere Nutzer ähnliche Probleme hatten, wurde die Möglichkeit hinzugefügt, dies über die Umgebung zu konfigurieren? Und wenn das Zertifikat korrekt installiert ist, wird das Systemzertifikat verwendet.

Möglicherweise muss der Hash-Link funktionieren. Können Sie Folgendes ausprobieren und prüfen, ob das Problem damit behoben ist?

  • Führen Sie beides aus:
    • Fügen Sie Ihr benutzerdefiniertes Zertifikat in /etc/ssl/certs innerhalb des Containers hinzu.

    • Fügen Sie den Hash-Link hinzu, z. B.

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

Danke, Michael,

Ich habe die Umgebungsvariable gesetzt und den Hash erstellt. Ich sehe jetzt keinen sichtbaren SSL-Fehler mehr, aber Onebox macht immer noch nichts. Weiß nicht, ob Jeff einen Rat hat, was ich falsch mache? @codinghorror.

Ich bin besorgt, dass Änderungen innerhalb des Containers beim Neuaufbau wieder verloren gehen. Daher bin ich mir nicht sicher, was hier der beste Ansatz ist.

Glenn.

Es könnte sein, dass der Fehler zwischengespeichert wurde, aber testen wir der Einfachheit halber immer nur eine Sache gleichzeitig.

Du solltest die Umgebungsvariable nicht hinzufügen müssen, aber du kannst prüfen, ob das Hinzufügen des Zertifikats funktioniert hat, indem du beispielsweise Folgendes ausführst:

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'

Wenn du ein Ergebnis erhältst (und vorher keines), bedeutet das, dass das Zertifikat ordnungsgemäß installiert ist. Anschließend kannst du Befehle zur Container-Definition hinzufügen, um das Zertifikat bei jedem Neuaufbau zu installieren, damit es erhalten bleibt.

Danke, Michael. Der Rails-Konsolenbefehl hat einwandfrei funktioniert; er kann die von dir verlinkte JSON-Datei herunterladen.

Ich bin mir nicht sicher, ob das zuvor nicht funktioniert hätte, aber ich hatte zuvor das Root-Zertifikat in /etc/ssl/certs/ installiert, und es funktionierte trotzdem nicht.

Ich habe im Container export SSL_CERT_DIR=“/etc/ssl/certs/” ausgeführt, und der SSL-Fehler scheint danach verschwunden zu sein. Zumindest sehe ich nichts mehr in der production.log.

Danke,

Glenn.

Eigentlich glaube ich, das Problem jetzt gelöst zu haben. Es handelt sich meiner Meinung nach um eine Authentifizierungsabfrage durch den Corporate-Filter. Ich habe im Konsolenfenster Net::HTTP.get mit einer YouTube-oEmbed-URI ausgeführt, um das Embedding-JSON abzurufen, und stattdessen wurde mir ein Authentifizierungs-HTML-Dokument zurückgegeben. Das ist also vermutlich das Hindernis, das uns derzeit im Weg steht. Vielen Dank, Michael.

Hast du auch den symbolischen Link erstellt? Das ist ein sehr wichtiger Schritt.

Um das Zertifikat dauerhaft zu installieren, solltest du die Datei app.yml anpassen und einen hooks-Abschnitt hinzufügen oder wie folgt ändern:

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"

Ah, dafür können wir wahrscheinlich nichts in die Datei app.yml einfügen, um das Problem zu beheben.