よく調べたところ、うまくいくように見えても、私には役に立たない解決策がいくつか見つかりました...
たとえば、次のスクリプトがあります。
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を書き込むと、問題なくWebサイトにアクセスできます。
https://my_user:[email protected]/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でエンコードする必要がありますか?
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
は、パスワード "secret"のhtpasswd -c .htpasswd matt
で生成された1つのライナーです。コードを実行すると、「200 OK」とindex.htmlのコンテンツが表示されます。 request.basic_auth
行を削除すると、401エラーが発生します。
UPDATE:
コメントの@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 に従って)最初の2つはクライアントモードで使用されます。
したがって、本番環境ではVERIFY_PEER
を使用する必要があります。これは デフォルト btwなので、完全にスキップできます。