我想知道Chef是否可以使用remote_file
资源形成使用自签名证书的https源。它似乎无法做到。文档未提及证书并提供禁用SSL检查的配置。
如果您的网站包含带自签名证书的https,则可以使用
的配方复制remote_file "/tmp/image.png" do
source "https://mywebsite.com/image.png"
end
您当然可以使用knife
来获取目标节点上的证书,例如,如下所示
vagrant @ devops:〜$ knife ssl fetch https://mywebsite.com/
警告:未找到刀配置文件
警告:mywebsite.com上的证书将被提取并放入您的trusted_cert目录(/home/vagrant/.chef/trusted_certs)。
刀无法验证这些是正确的证书。你应该 下载后验证这些证书的真实性。
这似乎做不了多少事情。厨师将继续显示消息
==>默认值:[2015-06-08T06:30:33 + 00:00]错误:remote_file [/tmp/image.png](jenkins :: remote_file_test第1行)出错:OpenSSL :: SSL :: SSLError:SSL_connect返回= 1 errno = 0 state = SSLv3读取服务器证书B:证书验证失败
也许这是一个错误?似乎Chef忽略了可靠的证书。
有解决方法吗?我们可以让厨师以某种方式信任证书吗?
更新 Tensibai给出了正确的答案。看他的评论。
答案 0 :(得分:2)
根据tensibai的技术(原始问题中的评论)我有以下一些配方来安装证书:
shopt -s nullglob
while read -r file; do
cat "$file"
done < <(grep -l "search-pattern" *) > /path/to/newfile
我将pem下载并存储在一个单独的文件中,并在将来触发该操作。我想我应该检查cacert.pem,但如果证书不止一次附加,似乎没有什么问题。
最终,我需要为我的内部工具服务器获得一些证书 - 但组织规模很小,并且没有明确指出我们将在6个月内的内容和位置。对于我的短期需求,这个解决方案很好(不理想)(我们在此处100%落后于防火墙)。
答案 1 :(得分:1)
我使用certificate
食谱来安装我自己签名的证书。所以我的解决方案基于此。在我的食谱中,我使用certificate_manage
来安装存储在加密数据包中的证书。
cert_resource = certificate_manage node['hostname'] do
action :create
ignore_missing false
end
然后我可以使用
之类的内容将证书添加到cacert.pem
ruby_block 'add_self_signed_certificate_to_cacert' do
block do
cert_file_path = ::File.join(cert_resource.cert_path, 'certs', cert_resource.cert_file)
cacert = ::File.read('/opt/chef/embedded/ssl/certs/cacert.pem')
pem = ::File.read(::File.join(cert_resource.cert_path, 'certs',cert_resource.cert_file))
unless cacert.include? pem
File.open('/opt/chef/embedded/ssl/certs/cacert.pem', 'w') {|f| f.write(cacert + "\n" + pem) }
end
end
end
答案 2 :(得分:1)
从厨师12开始,放置ca证书文件的位置在/etc/chef/trusted_certs
。将文件放在那里将解决此问题。
答案 3 :(得分:0)
感谢您知道该解决方案。
在AWS OpsWorks上,尝试从由内部CA Authority签名的远程https源下载文件时遇到了同样的问题。
在Windows计算机上,解决方法如下。
cookbook_file 'C:\tmp\calive.cer' do
source "calive.cer"
rights :full_control, 'Everyone'
action :create_if_missing
end
ruby_block 'install_cert' do
block do
filemyca = File.open("c:\\tmp\\calive.cer").readlines
open("C:\\opscode\\chef\\embedded\\ssl\\certs\\cacert.pem", 'a') do |f|
f.puts ""
f.puts "My Internel CA Auth Cert"
f.puts "==========================================="
f.puts filemyca
end
end
action :run
end
mypath = 'https://mysite.mydom.local/the_file'
mylocalfile = "c://mydir//the_file"
remote_file mylocalfile do
source mypath
action :create_if_missing
end