2017-05-13 2 views
-2

내 요리 책이 http_request 블록을 사용하고 있습니다 :이 예상대로 작동 username:password를 하드 경우http_request put 요청에 대해 예상되는 구문은 무엇입니까?

[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 

을 : :이 오류 그러나

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 

내가 그것을 실행하려고 할 때

+0

"[ask]"와 "[mcve]"및 Jon Skeet의 "[완벽한 질문 작성] (https://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/)을 참조하십시오.) "및"[스택 오버플로 사용자에 대한 연구 노력이 얼마나 될까요?] (http://meta.stackoverflow.com/questions/261592) ". 질문에 더 많은 노력을 기울이십시오. –

+0

희망적입니다 지금 –

+0

openssl에 문제가있는 것 같습니다. 적어도 1.0.2 버전을 사용하고 있는지 확인하고 'openssl s_client -connect yourdomain : 443'명령이 작동하는지 확인하십시오. 연결하려는 주소가 www.example.com 인 경우 yourdomain을 example.com (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" 

더 혼란 코드가 기억, 열심히 당신을 위해있을거야, 또는 다른 사람, 파악하는 것은 그것이 무엇을 의미하는지 6 개월.

그래서, 대신 위의 문자열, 사용의 :

'#{node[\'user\']}:#{node[\'password\']' 
# => "\#{node['user']}:\#{node['password']" 
:이 문제의 핵심은

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

입니다 :

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

당신은 당신의 코드에 또 다른 문제가

코드가 실행되면 Base64.encode64에 전달 된 값이 해당 문자열입니다. 변수가 보간되지 않으므로 항상 결과 문자열에

# > "Basic I3tub2RlWyd1c2VyJ119OiN7bm9kZVsncGFzc3dvcmQnXQ==\n" 

을 얻습니다. 사용자 또는 암호가 인코딩되어 있지 않습니다.

두 번째 문제는 사용자의 node 해시에 'user' 또는 'password' 키가 없을 수 있지만 충분한 정보를 제공하지 않아서 알 수 없습니다.다음

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

문자열로 보간 :

encode64를 호출하기위한 명확하고 깨끗한 방법이 될 것입니다 그것의로

"BasiC#{encoded_user_password}" 

나는 또한 루비의 URI 클래스에 익숙해지고 권하고 싶습니다 URI를 만들고 조작하는 기본 방법.

+0

정교한 설명 Tin Man을 주셔서 감사합니다. 그것은 매력처럼 작동합니다! 추 신 : 예, 저는 루비를 처음 보았습니다/요리사가 많은 것을 따라 잡을 수있었습니다. –

1

당신은 여러 가지 이스케이프 문자가 혼란 스럽지만이 오류는 t 그는 인증서 또는 URL.

그냥 URL에 통과/node['fqdn']이 인증서의 이름입니다

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

을 사용자를 넣어.

관련 문제