【问题标题】:Chef remote_file from https site with self signed certificate来自 https 站点的具有自签名证书的 Chef remote_file
【发布时间】:2015-06-08 06:40:03
【问题描述】:

我想知道 Chef 是否可以从使用自签名证书的 https 源中使用 remote_file 资源。好像没办法。文档未提及证书并提供禁用 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)中。
Knife 无法验证这些证书是否正确。你应该 下载后验证这些证书的真实性。

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

==> 默认值:[2015-06-08T06:30:33+00:00] 错误:remote_file[/tmp/image.png](jenkins::remote_file_test 第 1 行)有一个错误:OpenSSL::SSL ::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

也许这是一个错误?似乎 Chef 忽略了受信任的证书。

有解决办法吗?我们可以让 Chef 以某种方式信任证书吗?

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

【问题讨论】:

  • ssl_verify_mode = :verify_none in /etc/chef/client.rb 将允许您完全禁用它。看来,受信任的证书存储仅用于连接到厨师服务器,也是我现在验证的。现在,除了全局禁用验证之外,我没有看到其他方法。也许其他人有更好的答案。
  • 您可以从 Chef 安装中获取 cacert.pem 文件,将您自己的自签名/内部 CA 证书插入此文件,然后使用说明书将其部署到您的节点。一旦证书在 cacert.pem(在 /opt/chef/embedded/ssl/certs 中),ssl 验证将起作用。
  • 我更改了client.rb,但消息仍然存在。这似乎不是一种解决方法。
  • 我没有 CA 证书,因为我是自签名的。没有带有自签名证书的 CA。或者我应该把我的证书 pem 文件放在这个文件中吗?我可以将它“猫”附加到cacert.pem 吗?
  • @Onno 是的,自签名证书可以被视为 CA(因为它是顶级证书)。是的,如果它是 base64 编码的,你可以cat self-signed.pem >> cacert.pem

标签: ssl chef-infra


【解决方案1】:

根据 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

我下载 pem 并将其存储在一个单独的文件中,并在将来触发该存在的操作。我想我应该检查一下 cacert.pem,但如果证书被附加多次似乎没有太大问题。

最终,我需要为我的内部工具服务器获取一些证书 - 但该组织规模很小,并且没有明确的迹象表明我们将在 6 个月内完成什么以及在哪里。这个解决方案对我的短期需求很好(不是理想的)(我们在这里 100% 位于防火墙后面)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      从厨师 12 开始,放置您的 ca 证书文件的位置在 /etc/chef/trusted_certs。把你的文件放在那里可以解决这个问题。

      【讨论】:

      • 95% 的情况都是如此,但是当您使用系统 openssl lib 调用某些东西时,在捆绑包中拥有适当的 CA 证书并导出 SSL_CERT_FILE 将挽救您的生命(而且 Chef 已经足够好了用它自己的 cacert.pem 导出这个变量)。
      • Windows 领域的那个位置在哪里?
      【解决方案4】:

      感谢 onknows 提供解决方案。

      在 AWS OpsWorks 上,当我尝试从由内部 CA 授权签署的远程 https 源下载文件时遇到了同样的问题。

      在 Windows 机器上,解决方法如下。

      1. 将 CA Auth 证书保存在 Base-64 编码的 X.509 (.CER) 中。
      2. 将证书放在cookbook/files目录中
      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
      

      【讨论】:

        猜你喜欢
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 2020-04-24
        • 2014-06-22
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        相关资源
        最近更新 更多