SSL_connect restituito=1 errno=0 peeraddr=162.243.189.2:443 stato=errore: verifica certificato fallita (corrispondenza nome host errata)

Ho iniziato a esaurire lo spazio nel mio Digital Ocean Droplet, quindi ho voluto spostare i file caricati su uno spazio Digital Ocean.
Questo è ciò che ho configurato…

  • ID chiave di accesso s3 - Copiato da DO CP > API > Applicazioni e API

  • Chiave di accesso segreta s3 - Copiata da DO CP > API > Applicazioni e API

  • Regione s3 - Non sono sicuro che abbia importanza per gli spazi DO, ma l’ho lasciata predefinita - US East (N. Virginia)

  • Bucket di caricamento s3 - Non sono sicuro se devo creare una cartella nello spazio o meno. Ho provato entrambi…

    • uploads - che NON ha una cartella creata nello spazio in precedenza
    • files - che ha una cartella creata nello spazio in precedenza
  • Endpoint s3 - È qui che penso di sbagliare. Ho provato le versioni https di…

Ho visto questo…

…e questo…

Ma le mie impostazioni non vengono visualizzate nell’interfaccia di amministrazione, quindi penso che questo potrebbe non essere obsoleto e si tratta solo di ottenere la giusta combinazione di impostazioni.

Ho visto questo…

…ma l’area di amministrazione non mi permette di lasciare vuoto “bucket di caricamento s3”, quindi non ero sicuro se fosse correlato. Anche quello sembrava essere solo se si utilizza anche AWS S3. Ho provato a creare una cartella nel mio spazio DO e a utilizzare quel nome di cartella. Ho provato a usare un nome diverso di una cartella che non c’era, nel caso in cui dovesse crearla da sola. Niente di tutto ciò ha funzionato.

Ho visto questo…

…ma sono lontano dall’essere un esperto, quindi mi sono tenuto lontano da quello.

A questo punto ho esaurito le idee da provare e non sono sicuro se ci sono vicino e ho solo bisogno della giusta configurazione delle impostazioni o se mi manca completamente qualcosa e non ci sono nemmeno vicino.

Qualsiasi aiuto sarebbe molto apprezzato. Grazie.

Inoltre, ho provato le credenziali dell’API DO come…

Non sono sicuro a cosa dovrebbe corrispondere, quindi anche lì sono un po’ confuso.

No, non lo sono. Sebbene sia possibile configurare gli endpoint S3 nell’interfaccia utente, abbiamo testato e convalidato solo l’uso di cloni S3, come l’offerta di Digital Ocean, quando li si configura nel file app.yml.

La Configurazione di un provider di object storage compatibile con S3 per i caricamenti wiki ha richiesto molto lavoro da parte di molte persone, quindi ti consiglio di attenerti ad essa.

4 Mi Piace

Beh, Falco mi ha preceduto, ma ecco cosa stavo dicendo…

No. Devi seguire Configure an S3 compatible object storage provider for uploads e inserire le impostazioni nel tuo app.yml.

Hai bisogno di una vera CDN come bunny.net. Non credo che cloudflare possa farlo.

1 Mi Piace

Grazie.

Non vedo una sezione in app.yml per le impostazioni DISCOURSE_S3. Devo solo creare una riga per ciascuna? O è questo ciò che fanno i comandi sudo?

Non mi è del tutto chiaro dove eseguire o inserire questi comandi sudo. Non è chiaro se si tratti di un comando da riga di comando da aggiungere una tantum o se sia qualcosa che debba essere inserito in app.yml in modo che venga sempre considerato.

I comandi sudo vanno nell’area app.yml o solo nelle righe di impostazione DISCOURSE_S3?


Devo semplicemente lasciare vuoto questo campo con DO Spaces? DISCOURSE_S3_REGION:


Devo avere una CDN? Abbiamo un traffico molto basso. Piccolo gruppo. Sto davvero cercando di limitare le parti in movimento, se possibile.

Questo…

…va sotto # plugins fino a qui nell’…

hooks:

…area, dopo la sezione…

after_code:?

1 Mi Piace

OK. Ho aggiunto l’hook after_assets_precompile

L’ho ricostruito e non vedo ancora una sezione S3.

Devo crearne una?
Ha importanza dove metto le impostazioni?

Come detto nella guida, devono andare sotto la sezione env:, insieme ad altre impostazioni DISCOURSE_:

2 Mi Piace

C’è una soluzione per questo problema? Ho ricevuto lo stesso errore quando ho provato a usare Oracle Cloud Storage.

Ho seguito la wiki impostando in app.yml. Ho provato a usare s3cmd manuale per una connessione sicuramente corretta. Ma quando ho caricato un’immagine in un post, ho ricevuto lo stesso messaggio di errore.

Messaggio (4 copie segnalate)
Eccezione del job: 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' 

Grazie in anticipo!

PS. Non solo Oracle Cloud Service, ma anche un altro fornitore di servizi nazionale.

Forse stai accedendo al bucket con il nome sbagliato?

Quale provider di bucket stai utilizzando?

Come ho detto sopra: ci sto provando con Oracle Cloud Storage. E ho verificato manualmente con lo strumento s3cmd con lo stesso account.

E non c’è modo di sbagliare il nome, perché basta copiare e incollare.

Controllo il DNS dell’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 l’indirizzo di destinazione: objectstorage.ap-singapore-1.oci.oraclecloud.com invece del nome originale: axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com

Quindi ottengo esattamente il messaggio di errore nello strumento s3cmd come mostra Discourse:

Please wait, attempting to list all buckets...
ERROR: Test failed: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'objectstorage.ap-singapore-1.oci.oraclecloud.com'. (_ssl.c:1007)

Non ho alcuna esperienza su questo problema. :frowning:

Quindi il problema potrebbe derivare da questo:

C’è un modo per risolvere questo problema? Grazie!

Usa un nome che corrisponda al certificato.

Dopo molti tentativi, ricevo ancora lo stesso messaggio di errore. Ho controllato manualmente il certificato e l’hostname, ho usato il formato corretto per ottenere il certificato giusto visivamente, ma senza successo.

Il mio endpoint: ..compat.objectstorage.oraclecloud.com
Il CN del certificato: *.compat.objectstorage..oraclecloud.com

Posso connettermi con lo strumento s3cmd. Ma non riesco a configurare l’upload S3 per discourse con la stessa configurazione.

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

Voglio provare un altro modo impostando nell’ambiente ruby (dopo aver cercato ovunque):

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

Ma come posso impostarlo in discourse? Per favore!

Questa è una pessima idea poiché minerà molte delle protezioni fornite dai certificati X509.

Puoi mostrarmi quali sono le tue impostazioni non segrete qui? Nota bene Oracle Cloud non è supportato, ma daremo comunque una rapida occhiata per vedere se c’è qualcosa di palesemente sbagliato.

Sì, hai ragione quando lo disattivi. Voglio solo trovare il motivo per fare una PR se questo è un errore nella libreria ruby.

Le mie impostazioni sono molto semplici, provo solo a caricare immagini su uno storage compatibile con S3.

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

Oracle Cloud Storage ha un formato per l’indirizzo dell’endpoint. Ma qualunque formato io provi, lo stesso messaggio di errore che ho mostrato sopra.

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

Il formato sopra, ho controllato il certificato ed è corretto ai miei occhi:

Come ho detto prima, ho usato questa impostazione per connettermi normalmente con lo strumento s3cmd. Grazie mille!

OK, ho aggiunto un binding.pry all’inizio di ssl_socket_connect e quello che vedo quando provo a usare queste impostazioni è:

→ 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"

quindi l’effettivo hostname a cui ci si sta connettendo è bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com, che non corrisponde a *.compat.objectstorage.ap-singapore-1.oraclecloud.com, quindi l’errore è corretto.

Sfortunatamente OCI non supporta questo stile di accesso:

Utilizza l’accesso basato su percorsi nella tua applicazione. L’accesso in stile virtual host (accesso a un bucket come {bucketnamespace}.compat.objectstorage.{region}.oraclecloud.com [sic]) non è supportato.

Al contrario, Discourse supporta solo l’accesso in stile virtual host ({bucketname}.{namespace}.compat.objectstorage.{region}.oraclecloud.com.).

Abbiamo rimosso l’impostazione che potrebbe averlo fatto funzionare un po’ di tempo fa poiché non era ben supportata (vedi il messaggio del commit).

Far funzionare questo non sarà semplice e richiederà uno sviluppo e test complessi per aggiungere questo supporto.

Qui ci sono draghi.

(xref: S3 Path Style Access)

4 Mi Piace

Spiega molto chiaramente. Grazie mille!

1 Mi Piace

Grazie, ma non sono mai riuscito a risolverlo.

Ho trovato quello a cui si riferiva, ma poi quando copio e incollo il testo, inverte il maiuscolo/minuscolo. Mi arrendo e non ci sono più tornato. Potrei riprovare l’anno prossimo.

Speravo che qualcuno lo risolvesse nel frattempo e documentasse meglio la configurazione per adattarla ai miei piani.

Grazie comunque.

Ho riscontrato questo problema e l’ho risolto. La mia soluzione è stata che, al momento della configurazione, il mio server di posta non era verificato SSL, ma il mio provider di dominio mi ha fornito un server di posta verificato SSL, quindi li ho sostituiti.