看了很多之后,我发现了一些似乎有效的解决方案,但不适合我...
例如,我有这个脚本:
require 'net/http'
require "net/https"
@http=Net::HTTP.new('www.xxxxxxx.net', 443)
@http.use_ssl = true
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
@http.start() {|http|
req = Net::HTTP::Get.new('/gb/PastSetupsXLS.asp?SR=31,6')
req.basic_auth 'my_user', 'my_password'
response = http.request(req)
print response.body
}
当我运行它时,它会给我一个请求身份验证的页面,但如果我在浏览器中编写以下URL,我会毫无问题地进入网站:
https://my_user:my_password@www.xxxxxxx.net/gb/PastSetupsXLS.asp?SR=31,6
我也试过open-uri:
module OpenSSL
module SSL
remove_const :VERIFY_PEER
end
end
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
def download(full_url, to_here)
writeOut = open(to_here, "wb")
writeOut.write(open(full_url, :http_basic_authentication=>["my_user", "my_password"]).read)
writeOut.close
end
download('https://www.xxxxxxx.net/gb/PastSetupsXLS.asp?SR=31,6', "target_file.html")
但结果是一样的,该网站要求用户身份验证。 我做错了什么提示?我必须在Base 64中编码密码吗?
答案 0 :(得分:39)
我根据Net::HTTP docs中给出的示例编写了一段代码,并在我当地的WAMP服务器上进行了测试 - 它工作正常。这就是我所拥有的:
require 'net/http'
require 'openssl'
uri = URI('https://localhost/')
Net::HTTP.start(uri.host, uri.port,
:use_ssl => uri.scheme == 'https',
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
request = Net::HTTP::Get.new uri.request_uri
request.basic_auth 'matt', 'secret'
response = http.request request # Net::HTTPResponse object
puts response
puts response.body
end
我的.htaccess
文件如下所示:
AuthName "Authorization required"
AuthUserFile c:/wamp/www/ssl/.htpasswd
AuthType basic
Require valid-user
我的.htpasswd
只是使用htpasswd -c .htpasswd matt
密码“秘密”生成的单行内容。当我运行我的代码时,我得到“200 OK”和index.html的内容。如果我删除request.basic_auth
行,则会收到401错误。
<强>更新强>
正如@stereoscott在评论中指出的那样,我在示例中使用的:verify_mode
值(OpenSSL::SSL::VERIFY_NONE
)对于生产来说是不安全的。
OpenSSL::SSL::SSLContext文档中列出的所有可用选项均为:VERIFY_NONE,VERIFY_PEER,VERIFY_CLIENT_ONCE,VERIFY_FAIL_IF_NO_PEER_CERT,其中(根据OpenSSL docs)仅在客户端模式中使用前两个选项。
所以VERIFY_PEER
应该用于生产,is the default顺便说一句,所以你可以完全跳过它。