Comment corriger la mauvaise version du numéro SSL ?

J’ai constaté que mon Discourse ne peut pas générer de OneBox pour d’autres sites Web que YouTube. En consultant le journal, j’ai vu cette erreur :

Failed to onebox https://bilibili.com SSL_connect returned=1 errno=0 peeraddr=192.168.50.1:10808 state=error: wrong version number (OpenSSL::SSL::SSLError) [\"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/ssl_socket.rb:151:in 'OpenSSL::SSL::SSLSocket#connect_nonblock'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/ssl_socket.rb:151:in 'Excon::SSLSocket#initialize'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/connection.rb:487:in 'Class#new'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/connection.rb:487:in 'Excon::Connection#socket'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/connection.rb:120:in 'Excon::Connection#request_call'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/mock.rb:57:in 'Excon::Middleware::Mock#request_call'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/instrumentor.rb:34:in 'Excon::Middleware::Instrumentor#request_call'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/idempotent.rb:19:in 'Excon::Middleware::Idempotent#request_call'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/base.rb:22:in 'Excon::Middleware::Base#request_call'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/decompress.rb:14:in 'Excon::Middleware::Decompress#request_call'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/base.rb:22:in 'Excon::Middleware::Base#request_call'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/connection.rb:293:in 'Excon::Connection#request'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon.rb:252:in 'Excon.head'\", \"/home/mry/discourse/lib/final_destination.rb:268:in 'Kernel#public_send'\", \"/home/mry/discourse/lib/final_destination.rb:268:in 'FinalDestination#resolve'\", \"/home/mry/discourse/lib/oneboxer.rb:497:in 'block in Oneboxer.external_onebox'\", \"/home/mry/discourse/lib/cache.rb:93:in 'Cache#fetch'\", \"/home/mry/discourse/lib/oneboxer.rb:482:in 'Oneboxer.external_onebox'\", \"/home/mry/discourse/lib/oneboxer.rb:285:in 'Oneboxer.onebox_raw'\", \"/home/mry/discourse/lib/oneboxer.rb:96:in 'Oneboxer.onebox'\", \"(discourse):4:in '\u003cmain\u003e'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb/workspace.rb:101:in 'Kernel#eval'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb/workspace.rb:101:in 'IRB::WorkSpace#evaluate'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb/context.rb:591:in 'IRB::Context#evaluate_expression'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb/context.rb:557:in 'IRB::Context#evaluate'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:201:in 'block (2 levels) in IRB::Irb#eval_input'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:512:in 'IRB::Irb#signal_status'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:193:in 'block in IRB::Irb#eval_input'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:272:in 'block in IRB::Irb#each_top_level_statement'\", \"\u003cinternal:kernel\u003e:168:in 'Kernel#loop'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:269:in 'IRB::Irb#each_top_level_statement'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:192:in 'IRB::Irb#eval_input'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:173:in 'block in IRB::Irb#run'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:172:in 'Kernel#catch'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb.rb:172:in 'IRB::Irb#run'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/commands/console/irb_console.rb:113:in 'Rails::Console::IRBConsole#start'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/commands/console/console_command.rb:59:in 'Rails::Console#start'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/commands/console/console_command.rb:8:in 'Rails::Console.start'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/commands/console/console_command.rb:87:in 'Rails::Command::ConsoleCommand#perform'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/thor-1.4.0/lib/thor/command.rb:28:in 'Thor::Command#run'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/thor-1.4.0/lib/thor/invocation.rb:127:in 'Thor::Invocation#invoke_command'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/command/base.rb:178:in 'Rails::Command::Base#invoke_command'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/thor-1.4.0/lib/thor.rb:538:in 'Thor.dispatch'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/command/base.rb:73:in 'Rails::Command::Base.perform'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/command.rb:65:in 'block in Rails::Command.invoke'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/command.rb:143:in 'Rails::Command.with_argv'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/command.rb:63:in 'Rails::Command.invoke'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/railties-8.0.3/lib/rails/commands.rb:18:in '\u003cmain\u003e'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/3.4.0/bundled_gems.rb:82:in 'Kernel.require'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/3.4.0/bundled_gems.rb:82:in 'block (2 levels) in Kernel#replace_require'\", \"/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bootsnap-1.18.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in 'Kernel#require'\", \"bin/rails:18:in '\u003cmain\u003e'\"]\n```

J'ai testé l'invocation `Oneboxer.onebox('https://bilibili.com')` dans `rails c`, puis j'ai obtenu la même erreur.

Je ne sais pas pourquoi et je suis perplexe maintenant, car Discourse peut traiter les requêtes OAuth et AI ainsi que d'autres requêtes HTTP sans erreurs, cela ne se produit qu'avec OneBox, mais le OneBox YouTube peut être généré normalement.

Il utilise actuellement un serveur proxy et je suis sûr que ce n'est pas un problème de proxy. `curl`, `wget` et le module `httpx` en Python ont pu récupérer la réponse avec succès, mais `excon` en Ruby me donne `SSL: wrong version number`. Que dois-je faire pour résoudre ce problème ?

J'ai utilisé la version `3.0.13` d'OpenSSL, publiée en janvier 2024, lors de la compilation de l'interpréteur Ruby. Cette version est-elle trop ancienne ?

Supplément : Exécution de Excon.get dans rails c, j’ai obtenu la même chose. Peut-être est-ce un problème de la bibliothèque excon ?

discourse(prod)> Excon.get('https://bilibili.com')
(discourse):3:in '<main>': SSL_connect returned=1 errno=0 peeraddr=192.168.50.1:10808 state=error: wrong version number (OpenSSL::SSL::SSLError) (Excon::Error::Socket)
/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/ssl_socket.rb:151:in `OpenSSL::SSL::SSLSocket#connect_nonblock': SSL_connect returned=1 errno=0 peeraddr=192.168.50.1:10808 state=error: wrong version number (OpenSSL::SSL::SSLError)
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/ssl_socket.rb:151:in `Excon::SSLSocket#initialize'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/connection.rb:487:in `Class#new'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/connection.rb:487:in `Excon::Connection#socket'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/connection.rb:120:in `Excon::Connection#request_call'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/mock.rb:57:in `Excon::Middleware::Mock#request_call'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/instrumentor.rb:34:in `Excon::Middleware::Instrumentor#request_call'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/idempotent.rb:19:in `Excon::Middleware::Idempotent#request_call'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/base.rb:22:in `Excon::Middleware::Base#request_call'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/decompress.rb:14:in `Excon::Middleware::Decompress#request_call'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/middlewares/base.rb:22:in `Excon::Middleware::Base#request_call'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon/connection.rb:293:in `Excon::Connection#request'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/excon-1.2.5/lib/excon.rb:252:in `Excon.get'
        from (discourse):3:in `<main>'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb/workspace.rb:101:in `Kernel#eval'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb/workspace.rb:101:in `IRB::WorkSpace#evaluate'
        from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/irb-1.15.2/lib/irb/context.rb:591:in `IRB::Context#evaluate_expression'
        ... 28 levels...

essayez de remplacer discourse/config/initializers/013-excon_defaults.rb at main · discourse/discourse · GitHub

par

require "excon"
Excon::DEFAULTS[:include_default_port] = true

En raison d’une mauvaise configuration d’Excon, le numéro de port n’était pas transmis lors de l’utilisation d’un proxy HTTP. Par conséquent, le serveur proxy se connectait au serveur distant en utilisant le port 80, tandis qu’Excon tentait toujours de déchiffrer le contenu HTTP à l’aide de TLS.

1 « J'aime »

Bien ! Le onebox commence à bien fonctionner.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.