Problema de verificação SSL do Excon para ONEBOX

Olá a todos,

Acabei de configurar e começar a testar um servidor Discourse e, até agora, está ótimo. Estou com um problema em que o onebox falha devido ao que acredito ser um filtro de inspeção SSL que não consegue ser verificado pelo gem excon. Baixei o certificado raiz personalizado e o adicionei em /etc/ssl/certs no host, e até mesmo dentro do container (para teste), sem sucesso. Ainda recebo o erro abaixo em /log/rails/production.log sempre que coloco uma URL para incorporação.

Falha ao onebox [youtube url] SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) (OpenSSL::SSL::SSLError) Não foi possível verificar o certificado.

Menciona a necessidade de alterar os padrões do excon para apontar para um ssl_path diferente, mas não tenho certeza de como fazer isso com segurança e ainda permitir que o Discourse atualize. Alguém pode me orientar sobre como garantir que um certificado raiz personalizado seja considerado válido dentro do excon? Existe algum comando rails -r exec que eu possa colocar no app.yml?

Muito obrigado,

Glenn.

Qual URL está apresentando o problema? Você está usando a instalação oficial do Discourse baseada em Docker?

Parece que, por padrão, o excon inclui seu próprio pacote de certificados, mas como outras pessoas tiveram problemas semelhantes, ele adicionou a capacidade de configurá-lo no ambiente? E ele usará o do sistema se o certificado estiver configurado corretamente.

Pode ser necessário que o link hash funcione. Você pode tentar o seguinte e ver se isso resolve o problema?

  • faça ambos:
    • adicione seu certificado personalizado a /etc/ssl/certs dentro do container

    • adicione o link hash: por exemplo,

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

Obrigado, Michael,

Configurei a variável de ambiente e criei o hash, e agora não estou vendo mais um erro de SSL visível, mas o onebox ainda não está fazendo nada. Não sei se o Jeff tem algum conselho sobre o que eu possa estar fazendo de errado? @codinghorror.

Estou preocupado que fazer alterações dentro do container apenas seja destruído ao ser reconstruído, então não tenho certeza qual é a melhor abordagem aqui.

Glenn.

Pode ser que ele tenha armazenado em cache a falha, mas vamos testar uma coisa de cada vez.

Você não deve precisar adicionar a variável de ambiente, mas pode verificar se a adição do certificado funcionou fazendo, por exemplo:

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 você obtiver um resultado (e não obtivesse antes), isso significa que o certificado está instalado corretamente. Em seguida, você pode adicionar comandos à definição do contêiner para instalar esse certificado a cada reconstrução, para que ele persista.

Obrigado, Michael. O comando do console do Rails funcionou perfeitamente; ele conseguiu baixar o arquivo JSON que você vinculou.

Não tenho certeza se isso não funcionaria anteriormente, mas eu havia instalado anteriormente o certificado raiz em /etc/ssl/certs/ e ainda assim não estava funcionando.

Executei export SSL_CERT_DIR=“/etc/ssl/certs/” no contêiner e o erro de SSL parece ter desaparecido após isso. Pelo menos, não estou mais vendo nada no production.log.

Obrigado,

Glenn.

Na verdade, acho que consegui resolver o problema agora. É um prompt de autenticação com o filtro corporativo, acredito. Fiz o Net::HTTP.get no console usando uma URI oembed do YouTube para recuperar o JSON incorporado, mas, em vez disso, recebi de volta um documento HTML de autenticação. Então, acho que é isso que está atrapalhando agora. Muito obrigado, Michael.

Você também criou o link simbólico? Essa é uma parte muito importante.

Para deixar o certificado permanentemente em vigor, você deve editar o arquivo app.yml, adicionando ou modificando uma seção hooks para algo como o seguinte:

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, provavelmente não há nada que possamos adicionar ao arquivo app.yml para corrigir isso.