尝试让 WEBrick 接受 HTTPS 时出现“错误的 URI”

Posted

技术标签:

【中文标题】尝试让 WEBrick 接受 HTTPS 时出现“错误的 URI”【英文标题】:"Error bad URI" when trying to get WEBrick to accept HTTPS 【发布时间】:2013-01-05 22:04:14 【问题描述】:

所以我有一个简单的 Sinatra 网站:

# app.rb         
require 'sinatra'

get '/' do       
  'Hello world!' 
end              

我可以设置 rack 来通过 HTTP 提供服务:

# config.ru              
require './app'          
run Sinatra::Application 

# vim: ft=ruby           

当我浏览到 http://localhost:9292 时它工作正常:

% rackup
[2013-01-22 10:27:52] INFO  WEBrick 1.3.1
[2013-01-22 10:27:52] INFO  ruby 1.9.2 (2011-02-18) [x86_64-darwin10.7.4]
[2013-01-22 10:27:52] INFO  WEBrick::HTTPServer#start: pid=7525 port=9292
127.0.0.1 - - [22/Jan/2013 10:28:05] "GET / HTTP/1.1" 200 12 0.0177            
127.0.0.1 - - [22/Jan/2013 10:28:06] "GET /favicon.ico HTTP/1.1" 404 447 0.0007

我有generated a self-signed certificate,经过一番谷歌搜索后,我以为我找到了a way of setting up my rack file to use the cert and serve HTTPS:

# config.ru                                                                     
require './app'                                                                 
require 'webrick'                                                               

Rack::Server.start(                                                             
  :Port             => 9292,                                                    
  :Logger           => WEBrick::Log::new($stderr, WEBrick::Log::DEBUG),         
  :app              => Sinatra::Application,                                    
  :SSLEnable        => true,                                                    
  :SSLVerifyClient  => OpenSSL::SSL::VERIFY_NONE,                               
  :SSLPrivateKey    => OpenSSL::PKey::RSA.new( File.read "server.key" ),        
  :SSLCertificate   => OpenSSL::X509::Certificate.new( File.read "server.crt" ),
  :SSLCertName      => [["CN", WEBrick::Utils::getservername]]                  
)                                                                               

# vim: ft=ruby                                                                  

但是当我访问https://localhost:9292 我得到Error code: ssl_error_rx_record_too_long 而webrick 是......不开心:

% rackup
[2013-01-22 10:46:28] DEBUG TCPServer.new(0.0.0.0, 9292)
[2013-01-22 10:46:28] DEBUG TCPServer.new(::, 9292)
[2013-01-22 10:46:28] DEBUG Rack::Handler::WEBrick is mounted on /.
[2013-01-22 10:46:28] INFO  WEBrick::HTTPServer#start: pid=7660 port=9292
[2013-01-22 10:46:33] DEBUG accept: 127.0.0.1:62185
[2013-01-22 10:46:33] ERROR bad URI `?w~Rx03I?\x06?\x00\x00H\x00??'.
localhost - - [22/Jan/2013:10:46:33 EST] "\x16\x03\x01\x00?\x01\x00\x00?\x03\x01P??Y?KOƛ\x0Ew/yO;P\x1E\x13 ?w~Rx03I?\x06?\x00\x00H\x00??" 400 316
- -> ?w~Rx03I?\x06?\x00\x00H\x00??
[2013-01-22 10:46:33] DEBUG close: 127.0.0.1:62185

随意尝试一下,运行它所需的所有文件(config.ru、app.rb、server.crt、server.key)都在this gist。

所以我显然做错了什么。我该如何解决?

【问题讨论】:

我之前也试过这个,我放弃了。我很想看看你能不能找到让它工作的方法! 【参考方案1】:

你需要添加

require "webrick/https"

让它工作

【讨论】:

对我不起作用 - 我刚刚将它添加到 config.ru,现在 webrick 吐出 !! Invalid request 并且浏览器仍然显示 Error code: ssl_error_rx_record_too_long

以上是关于尝试让 WEBrick 接受 HTTPS 时出现“错误的 URI”的主要内容,如果未能解决你的问题,请参考以下文章

尝试接受具有大文件的模型时出现 .net API 错误

尝试集成捐赠按钮时出现无效的电子邮件地址错误?

配置 WEBrick 以使用自动生成的自签名 SSL/HTTPS 证书

接受 SDK 许可时出现“java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema”

尝试使用 next-connect 在 Next.js 中从 http://localhost:3000 重定向到 https://api.twitter.com 时出现 CORS 错误?

使用管道时出现属性绑定错误