傀儡证书商店

Puppet certificate store

我有一个 Puppet Enterprise Master Server 2018.1.3,它应该通过 https 从 git-Repository 获取带有代码管理器的代码,其中 git 服务器的服务器证书由第三方 CA。

在正确配置所有 afaik 之后,我得到以下信息:

>  puppet-code deploy --dry-run
Dry-run deploying all environments.
Errors while collecting a list of environments to deploy (exit code: 1).
ERROR    -> Unable to determine current branches for Git source 'puppet' 
(/etc/puppetlabs/code-staging/environments)
Original exception:
The SSL certificate is invalid

直接执行r10k会产生类似的错误。这是有道理的,因为我还没有在任何地方安装第三方 CA 证书。

所以我想,r10k 最有可能运行 jruby 运行 java(我不知道 ruby),所以我将安装证书在 jvm 中:

keytool -import -file gitCA.cer -alias gitCA -keystore /opt/puppetlabs/server/apps/java/lib/jvm/java/jre/lib/security/cacerts -storepass changeit

但我仍然遇到同样的错误,也是在系统重启后,所以好的,这意味着 r10k 不使用 jruby 但 ruby,所以我将安装还有 OS 中的证书,将证书放在 /etc/pki/trust/anchors 下并调用 update-ca-certificates(在 SLES12 上)。之后,我可以使用 wget 访问 git-Repo-URL 而不会出现任何证书错误,因此证书已正确安装在 OS 中,但即使如此系统重启后,我收到与 r10k.

相同的错误

在对证书商店和 ruby 进行了大量的观察之后,我发现

export  SSL_CERT_FILE=<path_to_cert>

修复r10k:

的直接调用
> r10k deploy display --fetch                                         ---
:sources:
- :name: :puppet
 :basedir: "/etc/puppetlabs/code/environments"
 :remote: https://xxx@git.xxx/git/puppet
 :environments:
  - develop
  - master
  - production
  - puppet_test

puppet-code 仍然无法处理相同的错误消息。但是我想,显然我现在是 root 并且 puppet-code 是由用户 pe-puppet 执行的,所以我将导出命令放在 /etc/profile.local 文件中,所以它可以用于全部用户。

仍然无法正常工作。即使在系统重新启动并删除由用户 root 创建的 /opt/puppetlabs/server/data/puppetserver/r10k/ 并直接调用 r10k.

之后

第一个问题:为什么 r10k 有效,但 puppet-code 无效?

第二个问题:该证书的正确位置在哪里?

非常感谢
迈克尔

更新:27.AUG.2018

我试过这个:

sudo -H -u pe-puppet bash -c '/opt/puppetlabs/puppet/bin/r10k deploy display --fetch'

尽管我在 /etc/profile.local 文件中设置了 SSL_CERT_FILE 变量,但它不起作用。

但我通过在 /etc/environment 文件中设置变量使其工作。

puppet code 仍然无法正常工作。为什么?

所以,我成功了,但对解决方案不满意。

我在 /etc/puppetlabs/puppetserver/logback.xml 上打开调试日志记录,确认 puppet-code 确实在调用 r10k:

2018-08-27T14:54:24.149+02:00 DEBUG [qtp462609859-78] [p.c.core] Invoking shell: 
  /opt/puppetlabs/bin/r10k deploy --config /opt/puppetlabs/server/data/code-manager/r10k.yaml --verbose warn display --format=json --fetch
2018-08-27T14:54:24.913+02:00 ERROR [qtp462609859-78] [p.c.app] Errors while collecting a list of environments to deploy (exit code: 1). 
  ERROR   -> Unable to determine current branches for Git source 'puppet' (/etc/puppetlabs/code-staging/environments)
  Original exception:
  The SSL certificate is invalid

所以我用非常快速和肮脏的方式做到了:

cd /opt/puppetlabs/puppet/bin/
mv r10k r10k-bin
touch r10k
chmod +x r10k
vi r10k

#!/bin/bash
export SSL_CERT_FILE=<new_cert_path>
/opt/puppetlabs/puppet/bin/r10k-bin "$@"

现在可以使用了:

puppet:~ # puppet-code deploy --dry-run
Dry-run deploying all environments.
Found 5 environments.

但不开心,有什么更好的主意吗?

对于那些正在寻找此问题解决方案的人,请查看 Puppet Support Base 上的 post。

简单地说你有两个选择:

  1. 使用 Git 源而不是 HTTPS 源来引用 Puppetfile 中的存储库。此选项需要将 SSH 密钥添加到 Puppet master 和存储库。
  2. 将存储库的证书颁发机构 (CA) 证书添加到 /opt/puppetlabs/puppet/ssl/cert.pem.
  3. 中受信任的 CA 列表中

选项一:使用 Git 源而不是 HTTPS 源

要使用 Git 源从您的存储库部署代码,请在您的 Puppet master 上配置一个 SSH 私钥并在您的存储库上配置一个 public SSH 密钥:

在您的 Puppetfile 中,将对您的 Git 存储库的引用从 HTTPS 源更改为 Git 源:

例如,更改:

mod 'site_date', :git: 'https://example.com/user/site_data.git',

至:

mod 'site_data', :git: 'ssh://user@example.com:22/user/site_data.git',

配置您的 SSH 密钥。使用我们关于如何使用 PE 2018.1 的 SSH 私钥身份验证声明模块或数据内容的文档配置私钥。

注意:使用版本选择器为您的部署选择正确的文档版本。

配置 public 密钥的详细信息取决于 Git 存储库的配置方式。与您的 Git 存储库管理员联系。

选项二:添加受信任的 CA 证书 如果您无法指定 Git s 源,通过将 CA 证书添加到文件 /opt/puppetlabs/puppet/ssl/cert.pem.

,将您的存储库添加到代码管理器信任的 CA 列表中

将证书 (ca.pem) 文件传输到您的 CA 节点。

在 CA 节点上,将证书添加到代码管理器信任的 CA 列表中:cat ca.pem >> /opt/puppetlabs/puppet/ssl/cert.pem

代理运行不会恢复对 cert.pem 所做的更改,因为该文件不受 PE 管理,但升级到 PE 将覆盖该文件。升级 PE 后,必须再次将 CA 证书添加到 cert.pem。