SSL_connect retornou=1 errno=0 peeraddr=162.243.189.2:443 state=erro: verificação de certificado falhou (Incompatibilidade de nome do host)

Estou ficando sem espaço no meu Digital Ocean Droplet, então queria mover os arquivos carregados para um Digital Ocean Space.
Isso é o que configurei…

Eu vi isso…

…e isso…

Mas minhas configurações não aparecem na interface de administração, então acho que isso pode não estar desatualizado e é apenas uma questão de acertar minha configuração de configurações.

Eu vi isso…

…mas a área de administração não me permite deixar “s3 upload bucket” vazio, então não tinha certeza se isso era relevante. Isso também parecia ser apenas se você estiver usando AWS S3 também. Tentei criar uma pasta no meu DO Space e usar esse nome de pasta. Tentei usar um nome diferente de uma pasta que não estava lá, caso precise criar a sua própria. Nada disso funcionou.

Eu vi isso…

…mas estou longe de ser um especialista, então evitei isso.

Neste ponto, estou sem ideias para tentar e não tenho certeza se estou perto e só preciso da configuração correta ou se estou completamente perdendo algo e nem perto.

Qualquer ajuda seria muito apreciada. Obrigado.

Além disso, tentei as credenciais da API do DO como…

Não tenho certeza com o que deveria corresponder, então também estou um pouco confuso quanto a isso.

Não, elas não aparecem. Embora você possa configurar os endpoints S3 na interface do usuário, nós apenas testamos e validamos o uso de clones S3, como a oferta da Digital Ocean, ao configurá-lo no arquivo app.yml.

A wiki Configurar um provedor de armazenamento de objetos compatível com S3 para uploads exigiu muito trabalho de muitas pessoas, então recomendo segui-la.

4 curtidas

Bem, o Falco se adiantou, mas aqui está o que eu estava dizendo…

Não. Você precisa seguir Configure an S3 compatible object storage provider for uploads e colocar as configurações no seu app.yml.

Você precisa de uma CDN real como a bunny.net. Não acho que a cloudflare sirva.

1 curtida

Obrigado.

Não vejo uma seção em app.yml para configurações DISCOURSE_S3. Devo apenas criar uma linha para cada uma? Ou é isso que os comandos sudo fazem?

Não está totalmente claro onde executar ou colocar esses comandos sudo. Não está claro se é um item de linha de comando único para adicioná-lo ou se é algo que precisa ir para app.yml para que seja sempre contabilizado.

Os comandos sudo vão na área app.yml ou apenas as linhas de configuração DISCOURSE_S3?


Devo apenas deixar isso em branco com DO Spaces? DISCOURSE_S3_REGION:


Preciso ter um CDN? Temos tráfego muito baixo. Grupo pequeno. Estou realmente tentando limitar as partes móveis, se possível.

Isto…

…vai abaixo de # plugins até aqui na…

hooks:

…área, depois da seção…

after_code:?

1 curtida

OK. Adicionei o after_assets_precompile

Recompilei e ainda não vejo uma seção de S3.

Eu apenas crio uma?
Importa onde coloco as configurações?

Como dito no guia, elas devem ir na seção env:, junto com outras configurações DISCOURSE_:

2 curtidas

Existe alguma solução para este problema? Recebi o mesmo erro ao tentar usar o Oracle Cloud Storage.

Segui a wiki configurando em app.yml. Tentei usar o s3cmd manualmente, com certeza para uma conexão correta. Mas ao fazer upload de uma imagem em uma postagem, recebi a mesma mensagem de erro.

Message (4 copies reported)
Job exception: SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)
Backtrace
/usr/local/lib/ruby/3.2.0/net/protocol.rb:46:in `connect_nonblock'
/usr/local/lib/ruby/3.2.0/net/protocol.rb:46:in `ssl_socket_connect'
/usr/local/lib/ruby/3.2.0/net/http.rb:1342:in `connect'
/usr/local/lib/ruby/3.2.0/net/http.rb:1248:in `do_start'
/usr/local/lib/ruby/3.2.0/net/http.rb:1243:in `start'
/usr/local/lib/ruby/3.2.0/delegate.rb:87:in `method_missing'
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/connection_pool.rb:307:in `start_session' 
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/connection_pool.rb:100:in `session_for' 
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:128:in `session' 
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:76:in `transmit' 
aws-sdk-core-3.130.2/lib/seahorse/client/net_http/handler.rb:50:in `call' 
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/content_length.rb:24:in `call' 
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:85:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:132:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:63:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_host_id.rb:17:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/xml/error_handler.rb:10:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/transfer_encoding.rb:26:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/helpful_socket_errors.rb:12:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/s3_signer.rb:110:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/redirects.rb:20:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:360:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:394:in `retry_request' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:382:in `retry_if_possible' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/retry_errors.rb:371:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/http_checksum.rb:19:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/endpoint_pattern.rb:30:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:67:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:136:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/bucket_dns.rb:35:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:41:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/expect_100_continue.rb:22:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb:26:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/arn.rb:62:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/rest/handler.rb:10:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/recursion_detection.rb:18:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/user_agent.rb:13:in `call' 
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/endpoint.rb:47:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_validator.rb:26:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/arn.rb:88:in `call' 
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/raise_response_errors.rb:16:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:27:in `call' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:56:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call' 
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:71:in `call' 
aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call' 
aws-sdk-core-3.130.2/lib/seahorse/client/plugins/response_target.rb:24:in `call' 
aws-sdk-core-3.130.2/lib/seahorse/client/request.rb:72:in `send_request' 
aws-sdk-s3-1.114.0/lib/aws-sdk-s3/client.rb:10921:in `put_bucket_policy' 
/var/www/discourse/lib/s3_inventory.rb:183:in `update_bucket_policy' 
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:16:in `block in execute' 
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:14:in `each' 
/var/www/discourse/app/jobs/regular/update_s3_inventory.rb:14:in `execute' 
/var/www/discourse/app/jobs/base.rb:292:in `block (2 levels) in perform' 
rails_multisite-5.0.0/lib/rails_multisite/connection_management.rb:82:in `with_connection'
/var/www/discourse/app/jobs/base.rb:279:in `block in perform' 
/var/www/discourse/app/jobs/base.rb:275:in `each' 
/var/www/discourse/app/jobs/base.rb:275:in `perform' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in `execute_job' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in `block (2 levels) in process' 
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:177:in `block in invoke' 
/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call' 
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:179:in `block in invoke' 
sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:182:in `invoke' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in `block in process' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch' 
sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in `local' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch' 
sidekiq-6.5.12/lib/sidekiq.rb:44:in `block in <module:Sidekiq>' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in `stats' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch' 
sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in `call' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch' 
sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in `global' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in `block in dispatch' 
sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in `prepare' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in `dispatch' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in `process' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in `process_one' 
sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in `run' 
sidekiq-6.5.12/lib/sidekiq/component.rb:8:in `watchdog' 
sidekiq-6.5.12/lib/sidekiq/component.rb:17:in `block in safe_thread' 

Obrigado desde já!

PS. Não apenas o Oracle Cloud Service, mas também outro provedor de serviços nacional.

Então talvez você esteja acessando o bucket com o nome errado?

Qual provedor de bucket você está usando?

Como mencionei acima: Estou tentando com o Oracle Cloud Storage. E verifiquei manualmente com a ferramenta s3cmd usando a mesma conta.

E não há como errar o nome, pois é apenas copiar e colar.

Verifico o DNS do Endpoint S3:

dig axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com

;; <<>> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <<>> axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63008
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com. IN A

;; ANSWER SECTION:
axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com. 258 IN CNAME compat.objectstorage.ap-singapore-1.oci.oraclecloud.com.
compat.objectstorage.ap-singapore-1.oci.oraclecloud.com. 258 IN	CNAME objectstorage.ap-singapore-1.oci.oraclecloud.com.
objectstorage.ap-singapore-1.oci.oraclecloud.com. 174 IN A 134.70.128.1

;; AUTHORITY SECTION:
ap-singapore-1.oci.oraclecloud.com. 258	IN SOA	ns1.p200.dns.oraclecloud.net. hostmaster.ap-singapore-1.oci.oraclecloud.com. 682052 3600 900 31536000 1800

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Nov 04 18:58:03 +07 2023
;; MSG SIZE  rcvd: 252

E usando o endereço de destino: objectstorage.ap-singapore-1.oci.oraclecloud.com em vez do nome original: axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com

Então obtive a mensagem de erro exata na ferramenta s3cmd como o Discourse mostra:

Aguarde, tentando listar todos os buckets...
ERRO: Teste falhou: [SSL: CERTIFICATE_VERIFY_FAILED] falha na verificação do certificado: incompatibilidade de nome do host, o certificado não é válido para 'objectstorage.ap-singapore-1.oci.oraclecloud.com'. (_ssl.c:1007)

Não tenho experiência com este problema. :frowning:

Então o problema talvez seja este:

Existe alguma maneira de corrigir este problema? Obrigado!

Use um nome que corresponda ao certificado.

Após muitas tentativas, ainda recebo a mesma mensagem de erro. Verifiquei manualmente o certificado e o nome do host, usei o formato correto para obter o certificado certo visualmente, mas sem sucesso.

Meu endpoint: .<região>.compat.objectstorage.oraclecloud.com
O CN do certificado: *.compat.objectstorage.<região>.oraclecloud.com

Eu consegui me conectar com a ferramenta s3cmd. Mas não consegui configurar o upload S3 para o Discourse com a mesma configuração.

A mensagem de erro: SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)

Quero tentar outra maneira definindo no ambiente ruby (depois de procurar em todo lugar):

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

Mas como posso definir isso no Discourse? Por favor!

Esta é uma má ideia, pois minará muitas proteções que os certificados X509 fornecem.

Você pode mostrar quais são suas configurações não secretas aqui? Por favor, note que o Oracle Cloud não é suportado, mas ainda daremos uma olhada rápida para ver se algo está obviamente errado.

Sim, você está certo ao desligá-lo. Eu só quero encontrar o motivo para fazer um PR se este for um erro na biblioteca ruby.

Minhas configurações são muito simples, apenas tento fazer upload de imagens para armazenamento compatível com S3.

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: <region>
  DISCOURSE_S3_ENDPOINT: https://<namespace>.compat.objectstorage.<region>.oraclecloud.com
  DISCOURSE_S3_ACCESS_KEY_ID: <access_key_id>
  DISCOURSE_S3_SECRET_ACCESS_KEY: <access_key>
  DISCOURSE_S3_BUCKET: <bucket_name>

O Oracle Cloud Storage tem um formato para o endereço do endpoint. Mas qualquer que seja o formato que eu tentei, a mesma mensagem de erro que mostrei acima.

SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)

O formato acima, eu verifiquei o certificado e ele está correto aos meus olhos:

Como eu disse antes, usei essa configuração para me conectar com a ferramenta s3cmd normalmente. Muito obrigado!

OK, adicionei um binding.pry no início de ssl_socket_connect e o que vejo ao tentar usar essas configurações é:

→ DISCOURSE_USE_S3=true DISCOURSE_S3_REGION=ap-singapore-1 DISCOURSE_S3_ENDPOINT=https://axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com DISCOURSE_S3_ACCESS_KEY_ID=foo DISCOURSE_S3_SECRET_ACCESS_KEY=bar DISCOURSE_S3_BUCKET=bucketname bin/rails c
Loading development environment (Rails 7.0.7)
[1] pry(main)> s3 = S3Helper.build_from_config; s3.list

From: /home/michael/.rvm/gems/ruby-3.2.2@discourse/gems/net-protocol-0.2.2/lib/net/protocol.rb:42 Net::Protocol#ssl_socket_connect:

    40: def ssl_socket_connect(s, timeout)
    41:   binding.pry
 => 42:   if timeout
    43:     while true
    44:       raise Net::OpenTimeout if timeout <= 0
    45:       start = Process.clock_gettime Process::CLOCK_MONOTONIC
    46:       # to_io is required because SSLSocket doesn't have wait_readable yet
    47:       case s.connect_nonblock(exception: false)
    48:       when :wait_readable; s.to_io.wait_readable(timeout)
    49:       when :wait_writable; s.to_io.wait_writable(timeout)
    50:       else; break
    51:       end
    52:       timeout -= Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
    53:     end
    54:   else
    55:     s.connect
    56:   end
    57: end

[1] pry(#<Net::HTTP>> s.hostname
=> "bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com"

portanto, o hostname real para o qual a conexão está sendo feita é bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com, que não corresponde a *.compat.objectstorage.ap-singapore-1.oraclecloud.com, então o erro está correto.

Infelizmente, o OCI não suporta este estilo de acesso:

Use o acesso baseado em caminho em seu aplicativo. O acesso no estilo de host virtual (acessando um bucket como {bucketnamespace}.compat.objectstorage.{region}.oraclecloud.com [sic]) não é suportado.

Por outro lado, o Discourse só suporta acesso no estilo de host virtual ({bucketname}.{namespace}.compat.objectstorage.{region}.oraclecloud.com.).

Nós removemos a configuração que poderia ter feito funcionar há algum tempo, pois não era bem suportada (veja a mensagem do commit).

Fazer isso funcionar não será simples e exigirá desenvolvimento e testes complexos para adicionar esse suporte.

Aqui jazem dragões.

(xref: S3 Path Style Access)

4 curtidas

Explica muito claramente. Muito obrigado!

1 curtida

Obrigado, mas nunca consegui resolver.

Encontrei o que ele estava se referindo, mas quando copio e colo texto, ele inverte o caso. Desisto e não voltei a isso. Talvez tente novamente no ano que vem.

Eu esperava que alguém descobrisse nesse meio tempo e documentasse melhor a configuração para corresponder aos meus planos.

Obrigado de qualquer forma.

Eu estava tendo esse problema e o corrigi. Minha solução foi que, quando configurei, meu servidor de e-mail não era verificado por SSL, mas meu provedor de domínio me deu um servidor de e-mail verificado por SSL, então eu os substituí.