Ssl 来自https站点的具有自签名证书的Chef远程\u文件

Ssl 来自https站点的具有自签名证书的Chef远程\u文件,ssl,chef-infra,Ssl,Chef Infra,我想知道Chef是否可以从使用自签名证书的https源中使用远程\u文件资源。它似乎不能。文档中没有提到证书,并提供了禁用SSL检查的配置 如果您有一个带有自签名证书的https站点,例如,可以使用具有 remote_file "/tmp/image.png" do source "https://mywebsite.com/image.png" end 当然,您可以使用knife在目标节点上获取证书,例如如下所示 vagrant@devops:~$ssl获取 警告:未找到刀配置文件 警告

我想知道Chef是否可以从使用自签名证书的https源中使用
远程\u文件
资源。它似乎不能。文档中没有提到证书,并提供了禁用SSL检查的配置

如果您有一个带有自签名证书的https站点,例如,可以使用具有

remote_file "/tmp/image.png" do
  source "https://mywebsite.com/image.png"
end
当然,您可以使用
knife
在目标节点上获取证书,例如如下所示

vagrant@devops:~$ssl获取
警告:未找到刀配置文件
警告:mywebsite.com上的证书将被提取并放置在您的trusted_cert目录(/home/vagrant/.chef/trusted_certs)中。
刀具无法验证这些证书是否正确。你应该 下载后验证这些证书的真实性

这似乎没什么作用。厨师长将继续显示消息

==>默认值:[2015-06-08T06:30:33+00:00]错误:远程\u文件[/tmp/image.png](jenkins::远程\u文件\u测试行1)出现错误:OpenSSL::SSL::SSLError:SSL\u connect返回=1 errno=0 state=SSLv3读取服务器证书B:证书验证失败

也许这是一只虫子?厨师似乎忽略了受信任的证书

有解决办法吗?我们能让厨师相信证书吗

更新 Tensibai给出了正确的答案。参见他的评论。

根据tensibai的技术(在原始问题中的评论),我有以下安装证书的方法:

bash 'pull certificate from gitlab' do
  code <<-EOH
    openssl s_client -connect hqdevgit01.my.lan:443 -showcerts | openssl x509 -outform PEM > /opt/chef/embedded/ssl/certs/gitlab.pem
    cat /opt/chef/embedded/ssl/certs/gitlab.pem >> /opt/chef/embedded/ssl/certs/cacert.pem
  EOH
  not_if { ::File.exists?('/opt/chef/embedded/ssl/certs/gitlab.pem') }
end
bash'pull certificate from gitlab'do
代码>/opt/chef/embedded/ssl/certs/cacert.pem
EOH
如果{::File.exists?('/opt/chef/embedded/ssl/certs/gitlab.pem')不存在
结束
我下载pem并将其存储在一个单独的文件中,并在将来触发该存在的操作。我想我应该检查cacert.pem,但是如果证书被多次附加,似乎没有什么问题


最终,我需要为我的内部工具服务器获得一些证书——但公司规模很小,没有明确的迹象表明我们将在6个月内达到什么样的水平。这个解决方案很好(不理想)满足了我的短期需求(我们在这里100%落后于防火墙)。

我使用
证书
食谱来安装我的自签名证书。所以我的解决方案就是基于这个。在我的配方中,我使用
certificate\u 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

自chef 12起,放置ca证书文件的位置为
/etc/chef/trusted_certs
。将您的文件放在那里将解决此问题。

感谢您提供解决方案

在AWS OpsWorks上,我在尝试从内部CA机构签名的远程https源下载文件时遇到了相同的问题

在Windows计算机上,解决方法如下

  • 将CA身份验证证书保存在Base-64编码的X.509(.CER)中
  • 将证书放入cookbook/files目录
  • 复制实例磁盘上的证书(例如,在安装阶段使用配方)
  • 将CA认证证书的内容添加到文件末尾: C:\opscode\chef\embedded\ssl\certs\cacert.pem
  • 执行远程文件拷贝

  • /etc/chef/client.rb中,您可以完全禁用它。看起来,可信证书存储只用于连接到chef服务器,我现在也验证了这一点。现在,除了全局禁用验证之外,我看不到其他方法。也许其他人有更好的答案。您可以从chef安装中获取cacert.pem文件,将您自己的自签名/内部CA证书插入该文件,然后使用cookbook将其部署到节点。一旦证书位于cacert.pem(in/opt/chef/embedded/ssl/certs)中,ssl验证就会工作。我更改了
    client.rb
    ,但消息仍然存在。这似乎不是一个解决办法。我没有CA证书,因为我是自签名的。没有具有自签名证书的CA。或者我应该将我的证书pem文件放在这个文件中?我是否可以将其“cat”附加到
    cacert.pem
    ?@on否是,自签名证书可以被视为CA(因为它是顶级证书)。是的,如果它是base64编码的,那么您可以
    cat self-signed.pem>>cacert.pem
    这在95%的情况下都是正确的,但是当您使用系统openssl库调用某个东西时,将适当的CA证书放在一个包中并导出SSL_CERT_文件将挽救您的生命(Chef很乐意使用自己的cacert.pem导出这个变量).Windows land的那个位置在哪里?
    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