SSL_connect retourné=1 errno=0 peeraddr=162.243.189.2:443 état=erreur : vérification du certificat échouée (Incompatibilité de nom d'hôte)

Je manque d’espace dans mon Droplet Digital Ocean, j’ai donc voulu déplacer les fichiers téléchargés vers un Digital Ocean Space.

Voici ce que j’ai configuré…

  • s3 access key id - Copié depuis DO CP > API > Applications & API

  • s3 secret access key - Copié depuis DO CP > API > Applications & API

  • s3 region - Je ne suis pas sûr que cela ait de l’importance pour les DO Spaces, mais je l’ai laissé par défaut - US East (N. Virginia)

  • s3 upload bucket - Je ne suis pas sûr si je suis censé créer un dossier dans le Space ou non. J’ai essayé les deux…

    • uploads - qui ne nécessite PAS de dossier créé dans le Space au préalable
    • files - qui a un dossier créé dans le Space au préalable
  • s3 endpoint - C’est là que je pense avoir un problème. J’ai essayé les versions https de…

J’ai vu ceci…

…et ceci…

Mais mes paramètres ne s’affichent pas dans l’interface d’administration, donc je pense que cela n’est pas obsolète et qu’il s’agit simplement d’obtenir la bonne combinaison de paramètres.

J’ai vu ceci…

…mais la zone d’administration ne me permet pas de laisser “s3 upload bucket” vide, donc je n’étais pas sûr si c’était lié. Cela semblait également ne concerner que l’utilisation d’AWS S3. J’ai essayé de créer un dossier dans mon DO Space et d’utiliser ce nom de dossier. J’ai essayé d’utiliser un nom différent pour un dossier qui n’existait pas, au cas où il devrait en créer un. Rien de tout cela n’a fonctionné.

J’ai vu ceci…

…mais je suis loin d’être un expert, donc je l’ai évité.

À ce stade, je n’ai plus d’idées à essayer et je ne sais pas si je suis proche et qu’il me faut juste la bonne configuration de paramètres ou si je manque complètement quelque chose et que je ne suis pas du tout proche.

Toute aide serait grandement appréciée. Merci.

De plus, j’ai essayé les identifiants de l’API DO comme…

Je ne suis pas sûr à quoi cela est censé correspondre, donc je suis un peu perdu là aussi.

Non, ce n’est pas le cas. Bien que vous puissiez configurer les points d’accès S3 dans l’interface utilisateur, nous n’avons testé et validé qu’en utilisant les clones S3, comme l’offre Digital Ocean, lors de la configuration dans le fichier app.yml.

Le wiki Configurer un fournisseur de stockage d’objets compatible S3 pour les téléchargements a nécessité beaucoup de travail de la part de nombreuses personnes, je vous recommande donc de vous y tenir.

4 « J'aime »

Eh bien, Falco m’a devancé, mais voici ce que je disais…

Non. Vous devez suivre Configure an S3 compatible object storage provider for uploads et mettre les paramètres dans votre fichier app.yml.

Vous avez besoin d’un vrai CDN comme bunny.net. Je ne pense pas que cloudflare suffira.

1 « J'aime »

Merci.

Je ne vois pas de section dans app.yml pour les paramètres DISCOURSE_S3. Dois-je simplement créer une ligne pour chacun ? Ou est-ce ce que font les commandes sudo ?

Je ne suis pas tout à fait sûr de l’endroit où exécuter ou placer ces commandes sudo. Je ne sais pas s’il s’agit d’un élément de ligne de commande unique à ajouter ou si c’est quelque chose qui doit être inclus dans app.yml afin qu’il soit toujours pris en compte.

Les commandes sudo vont-elles dans la zone app.yml ou seulement les lignes de réglage DISCOURSE_S3 ?


Dois-je simplement laisser cela vide avec DO Spaces ? DISCOURSE_S3_REGION :


Dois-je avoir un CDN ? Nous avons très peu de trafic. Petit groupe. J’essaie vraiment de limiter les éléments mobiles si possible.

Ceci…

…va sous # plugins jusqu’ici dans la section…

hooks:

…après la section…

after_code: ?

1 « J'aime »

OK. J’ai ajouté le after_assets_precompile

Je l’ai reconstruit et je ne vois toujours pas de section S3.

Dois-je en créer une ?
Est-ce que l’endroit où je mets les paramètres a de l’importance ?

Comme indiqué dans le guide, ils doivent aller sous la section env:, avec les autres paramètres DISCOURSE_ :

2 « J'aime »

Existe-t-il une solution à ce problème ? J’ai obtenu la même erreur en essayant d’utiliser Oracle Cloud Storage.

J’ai suivi le wiki en configurant dans app.yml. J’ai essayé d’utiliser s3cmd manuellement pour une connexion correcte, bien sûr. Mais lors du téléchargement d’une image dans un post, j’ai obtenu le même message d’erreur.

Message (4 copies signalées)
Erreur de tâche : SSL_connect retourné=1 errno=0 peeraddr=134.70.128.1:443 état=erreur : échec de la vérification du certificat (Inadéquation du nom d'hôte)
Trace
/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/aws-sdk-core/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'

Merci d’avance !

PS. Pas seulement Oracle Cloud Service, mais aussi un autre fournisseur de services national.

Alors, peut-être que vous accédez au bucket avec le mauvais nom ?

Quel fournisseur de bucket utilisez-vous ?

Comme je l’ai dit plus haut : j’essaie avec Oracle Cloud Storage. Et j’ai vérifié manuellement avec l’outil s3cmd avec le même compte.

Et aucune façon de se tromper de nom, car il suffit de copier-coller.

Je vérifie le DNS du point d’accès 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

Et en utilisant l’adresse cible : objectstorage.ap-singapore-1.oci.oraclecloud.com au lieu du nom d’origine : axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com

Ensuite, j’obtiens exactement le même message d’erreur dans l’outil s3cmd que celui affiché par Discourse :

Veuillez patienter, tentative de lister tous les buckets...
ERREUR : Échec du test : [SSL: CERTIFICATE_VERIFY_FAILED] échec de la vérification du certificat SSL : le certificat n'est pas valide pour 'objectstorage.ap-singapore-1.oci.oraclecloud.com'. (_ssl.c:1007)

Je n’ai aucune expérience de ce problème. :pensive_face:

Le problème vient peut-être de ceci :

Y a-t-il un moyen de résoudre ce problème ? Merci !

Utilisez un nom qui correspond au certificat.

Après de nombreuses tentatives, j’obtiens toujours le même message d’erreur. J’ai vérifié manuellement le certificat et le nom d’hôte, utilisé le bon format pour obtenir le bon certificat visuellement, mais sans succès.

Mon endpoint : \u003cnamespace\u003e.compat.objectstorage.\u003cregion\u003e.oraclecloud.com
Le CN du certificat : *.compat.objectstorage.\u003cregion\u003e.oraclecloud.com

Je peux me connecter avec l’outil s3cmd. Mais je ne peux pas configurer le téléversement S3 pour discourse avec la même configuration.

Le message d’erreur : SSL_connect returned=1 errno=0 peeraddr=134.70.128.1:443 state=error: certificate verify failed (Hostname mismatch)

Je veux essayer une autre méthode en la définissant dans l’environnement ruby (après avoir cherché partout) :

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

Mais comment puis-je définir cela dans discourse ? S’il vous plaît !

C’est une mauvaise idée car cela saperait de nombreuses protections offertes par les certificats X509.

Pouvez-vous montrer quels sont vos paramètres non secrets ici ? Veuillez noter qu’Oracle Cloud n’est pas pris en charge, mais nous jetterons un coup d’œil rapide pour voir si quelque chose ne va pas manifestement.

Oui, vous avez raison quand vous l’éteignez. Je veux juste trouver la raison de faire une PR si c’est une erreur dans la bibliothèque Ruby.

Mes paramètres sont très simples, j’essaie juste de télécharger des images vers un stockage compatible 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>

Oracle Cloud Storage a un certain format pour l’adresse du point de terminaison. Mais quel que soit le format que j’ai essayé, le même message d’erreur que celui que j’ai montré ci-dessus.

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

Le format ci-dessus, j’ai vérifié le certificat et il est correct à mes yeux :

Comme je l’ai dit auparavant, j’ai utilisé ce paramètre pour me connecter normalement avec l’outil s3cmd. Merci beaucoup !

OK, j’ai ajouté un binding.pry au début de ssl_socket_connect et voici ce que je vois en essayant d’utiliser ces paramètres :

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

donc le nom d’hôte réel auquel on se connecte est bucketname.axhjdarc4cuy.compat.objectstorage.ap-singapore-1.oraclecloud.com, ce qui ne correspond pas à *.compat.objectstorage.ap-singapore-1.oraclecloud.com, donc l’erreur est correcte.

Malheureusement, OCI ne prend pas en charge ce style d’accès :

Utilisez l’accès basé sur les chemins dans votre application. L’accès de style hôte virtuel (accès à un compartiment en tant que {bucketnamespace}.compat.objectstorage.{region}.oraclecloud.com [sic]) n’est pas pris en charge.

Inversement, Discourse ne prend en charge que l’accès de style hôte virtuel ({bucketname}.{namespace}.compat.objectstorage.{region}.oraclecloud.com.).

Nous avons supprimé le paramètre qui aurait pu le faire fonctionner il y a quelque temps, car il n’était pas bien pris en charge (voir le message du commit).

Faire fonctionner cela ne sera pas simple et nécessitera un développement et des tests complexes pour ajouter cette prise en charge.

Ici résident les dragons.

(xref: S3 Path Style Access)

4 « J'aime »

Très clairement expliqué. Merci beaucoup !

1 « J'aime »

Merci, mais je n’ai jamais réussi à résoudre le problème.

J’ai trouvé ce à quoi il faisait référence, mais ensuite, lorsque je copie et colle du texte, il inverse la casse. J’abandonne et je n’y suis pas revenu. J’essaierai peut-être à nouveau l’année prochaine.

J’espérais que quelqu’un trouverait une solution entre-temps et documenterait mieux la configuration pour correspondre à mes plans.

Merci quand même.

J’avais ce problème et je l’ai résolu. Ma solution était que lorsque je l’ai configuré, mon serveur de messagerie n’était pas vérifié SSL, mais mon fournisseur de domaine m’a donné un serveur de messagerie vérifié SSL, alors je les ai remplacés.