来自https站点的Chef remote_file,带有自签名证书

时间:2015-06-08 06:40:04

标签: ssl chef

我想知道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给出了正确的答案。看他的评论。

4 个答案:

答案 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计算机上,解决方法如下。

  1. 将CA Auth证书保存在Base-64编码的X.509(.CER)中。
  2. 将证书放入食谱/文件目录
  3. 将证书复制到实例磁盘上(例如,在设置阶段使用配方)
cookbook_file 'C:\tmp\calive.cer' do
    source "calive.cer"
    rights :full_control, 'Everyone'
    action :create_if_missing
end
  1. 将您的CA Auth证书的内容添加到文件的末尾: C:\ opscode \ chef \ embedded \ ssl \ certs \ cacert.pem
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
  1. 执行远程文件复制
mypath = 'https://mysite.mydom.local/the_file'
mylocalfile = "c://mydir//the_file"
remote_file mylocalfile do
    source mypath
    action :create_if_missing
end