Problema di verifica SSL Excon per ONEBOX

Ciao a tutti,

Ho appena configurato e avviato i test su un server Discourse e finora è ottimo. Ho un problema in cui onebox non funziona a causa di ciò che credo sia un filtro di ispezione SSL che non riesce a verificare con il gem excon. Ho scaricato il certificato root personalizzato e lo ho aggiunto a /etc/ssl/certs sull’host, e persino all’interno del container (per testare), ma senza successo. Ricevo ancora l’errore qui sotto in /log/rails/production.log ogni volta che incollo un URL per l’incorporamento.

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) Impossibile verificare il certificato.

Viene menzionata la modifica delle impostazioni predefinite di excon per puntare a un diverso ssl_path, ma non sono sicuro di come farlo in modo sicuro consentendo comunque a Discourse di aggiornarsi. Qualcuno può consigliarmi come assicurarmi che un certificato root personalizzato sia considerato valido all’interno di excon? C’è un comando rails -r exec che posso inserire in app.yml?

Grazie mille,

Glenn.

Quale URL presenta il problema? Stai utilizzando l’installazione ufficiale di Discourse basata su Docker?

Sembra che di default excon includa il proprio bundle di certificati, ma dato che altre persone hanno riscontrato problemi simili, ha aggiunto la possibilità di configurarlo tramite variabili d’ambiente? In tal caso, utilizzerà quello di sistema se il certificato è correttamente posizionato.

Potrebbe essere necessario che il link hash funzioni. Puoi provare quanto segue per vedere se risolve il problema?

  • Fai entrambe le cose:
    • aggiungi il tuo certificato personalizzato a /etc/ssl/certs all’interno del contenitore

    • aggiungi il link hash: ad esempio

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

Grazie Michael,

Ho impostato la variabile d’ambiente e creato l’hash, e ora non vedo più errori SSL visibili, ma onebox non fa ancora nulla. Non so se Jeff abbia qualche consiglio su cosa potrei stare facendo di sbagliato? @codinghorror.

Sono preoccupato che le modifiche apportate all’interno del container vengano distrutte al prossimo rebuild, quindi non sono sicuro di qual sia il miglior approccio in questo caso.

Glenn.

Potrebbe aver memorizzato nella cache il fallimento, ma proviamo a testare una cosa alla volta.

Non dovresti aver bisogno di aggiungere la variabile d’ambiente, ma puoi verificare se l’aggiunta del certificato ha funzionato eseguendo, ad esempio:

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'

Se ottieni un risultato (e prima non lo avevi), significa che il certificato è stato installato correttamente. A quel punto puoi aggiungere comandi alla definizione del container per installare quel certificato ad ogni ricompilazione, in modo che rimanga persistente.

Grazie Michael, il comando rails console ha funzionato correttamente, è riuscito a scaricare il file JSON a cui hai fatto riferimento.

Non sono sicuro che non avrebbe funzionato in precedenza, ma avevo precedentemente installato il certificato root in /etc/ssl/certs/ e non funzionava comunque.

Ho eseguito export SSL_CERT_DIR=“/etc/ssl/certs/” nel contenitore e sembra che l’errore SSL sia scomparso dopo di ciò. Almeno non vedo più nulla nel production.log.

Grazie,

Glenn.

In realtà, penso di aver risolto il problema. Si tratta di una richiesta di autenticazione con il filtro aziendale, credo. Ho eseguito Net::HTTP.get nella console usando un URI oembed di YouTube per recuperare il JSON incorporato, ma invece mi è stato restituito un documento HTML di autenticazione. Quindi penso che sia questo ciò che sta creando ostacoli ora. Grazie mille, Michael.

Hai anche creato il collegamento simbolico? È una parte molto importante.

Per mantenere il certificato permanentemente in posizione, modifica il file app.yml aggiungendo o modificando una sezione hooks in modo simile a quanto segue:

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, probabilmente non c’è nulla che possiamo aggiungere al file app.yml per risolvere quel problema.