2017-05-13 46 views
-2

我在我的食譜採用這種http_request塊:http_request放置請求的預期語法是什麼?

http_request 'some request' do 
    url 'https://'"#{node[:chef][:node_name]}"'/v1/xyz' 
    headers ({ 
    'AUTHORIZATION' => "BasiC#{Base64.encode64('#{node[\'user\']}:#{node[\'password\']')}", 
    }) 
    action :get 
end 

但是我得到這個錯誤,當我嘗試執行它:

[2017-05-12T21:39:04-04:00] ERROR: http_request[some request] (mi_activemq::default line 58) had an error: OpenSSL::SSL::SSLError: SSL Error connecting to https://... - SSL_connect returned=1 errno=0 state=error: certificate verify failed 

如果我硬編碼username:password此按預期工作:

'AUTHORIZATION' => "BasiC#{Base64.encode64('username:password')}", 
+0

請參閱「[問]」和「[mcve]」和Jon Skeet的「[寫出完美的問題](https://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/ )「和」[Stack Overflow用戶需要多少研究工作?](http://meta.stackoverflow.com/questions/261592)「。請在你的問題上加倍努力。 –

+0

希望現在很清楚 –

+0

你似乎有openssl的問題。確保您使用的是至少1.0.2版本,並且此命令「openssl s_client -connect yourdomain:443」可用。如果您連接的地址是www.example.com,請使用example.com替換yourdomain(不含www。) –

回答

1

您需要了解如何將值內插到字符串中。

node = { 
    chef: { 
    node_name: 'foo' 
    } 
} 

這列定義:這個哈希定義出發

'https://'"#{node[:chef][:node_name]}"'/v1/xyz' 
# => "https://foo/v1/xyz" 

紅寶石將相鄰的字符串連接成一個字符串:

'foo'"bar"'baz' # => "foobarbaz" 

但代碼是醜陋讀這麼唐除非你有很好的理由,否則不會這樣做。而不是簡單的把它寫:

'foobarbaz' # => "foobarbaz" 

或:

"foobarbaz" # => "foobarbaz" 

請記住,更多的迷惑你的代碼,就越難這將是你的,還是別人的,要弄清楚這是什麼意思的六個月。

因此,而不是你上面的字符串,使用:

"https://#{node[:chef][:node_name]}/v1/xyz" 
# => "https://foo/v1/xyz" 

你必須與你的代碼的另一個問題:

require 'base64' 
"BasiC#{Base64.encode64('#{node[\'user\']}:#{node[\'password\']')}" 
# > "Basic I3tub2RlWyd1c2VyJ119OiN7bm9kZVsncGFzc3dvcmQnXQ==\n" 

這是問題的癥結所在:

'#{node[\'user\']}:#{node[\'password\']' 
# => "\#{node['user']}:\#{node['password']" 

代碼運行時,傳遞給Base64.encode64的值是該字符串。您的變量不進行插值處理,所以你總是得到:

# > "Basic I3tub2RlWyd1c2VyJ119OiN7bm9kZVsncGFzc3dvcmQnXQ==\n" 

的結果字符串。它沒有你的用戶或密碼編碼。

潛在的第二個問題是您的node哈希可能沒有'user''password'鍵,但我們無法分辨,因爲您沒有給我們足夠的信息。

更清晰,更清潔的方式來調用encode64是:

encoded_user_password = Base64.encode64(
    node.values_at('user', 'password').join(':') 
) 

然後將其插值到字符串:

"BasiC#{encoded_user_password}" 

我建議你逐漸熟悉Ruby的URI類也,因爲它是構建和操作URI的首選方式。

+0

謝謝你的詳細解釋。它就像一個魅力! PS:是的,我是新來的紅寶石/廚師趕上了很多東西。 –

1

你有一個混亂的各種轉義字符去那裏,但錯誤是有關的名稱是錯誤的,無論是在t他證明或URL。

只要把用戶名/密碼的URL,

url "https://#{node['user']}:#{node['password']@#{node['fqdn']}/v1/xyz" 

其中node['fqdn']是在證書的名稱。