你好:我正在尝试在 Ubuntu 上配置 Puppet,但奇怪的是,我无法生成证书,因为我的服务器从未显示任何待处理的证书请求。
换句话说,在服务器上我运行 puppetmasterd,在客户端我能够连接到服务器,但客户端继续打印
notice: Did not receive certificate
warning: peer certificate won't be verified in this SSL session
但服务器永远看不到该请求
mrisher@lab2$ puppetca --list
[nothing shows up]
mrisher@lab2$ puppetca --sign clientname.domain.com
clientname.domain.com
err: Could not call sign: Could not find certificate request for clientname.domain.com
编辑:有人建议自动签名正在进行,但似乎不是这样。没有autosign.conf
文件,当我运行时,puppetmasterd --no-daemonize -d -v
每次客户端说通知时,我都会收到以下输出:信息:找不到“clientname.domain.com”的证书:未收到证书
我检查了服务器上的证书,似乎没有任何证书:
mrisher@lab2:~$ puppetca --list --all
mrisher@lab2:~$ sudo puppetca --list --all
+ lab2.domain.com // this is the server (master)
mrisher@lab2:~$ sudo puppetca --list
[blank line]
mrisher@lab2:~$
注意:这主要是运行 Ubuntu 的默认安装,如果这有任何线索的话。
谢谢你们提供的帮助。
编辑看起来这是由于puppetd
以不同用户身份运行不一致造成的。由于我不太理解守护进程的原因,puppet 将其一些设置(包括证书)存储在 ~/.puppet 中,而不是像 这样的中央目录中/var/lib/puppet
,因此,如果您以自己的身份进行测试,而不是以其他用户的身份进行测试,这一点很重要。sudo.
答案1
您的证书请求是否已到达服务器?(使用puppetmasterd --configprint ssldir
我$ssldir
在此处写的值)
下面$ssldir/ca
应该有一个像这样的目录结构:
private/
requests/
serial
signed/
在 下requests
,如果您的客户端请求确实成功了,您应该会看到一个名为 的文件clientname.domain.com.pem
。如果它在那里并且需要签名,您可以通过指定 直接将 puppetca 指向它puppetca --ssldir=/path/to/ssldir --sign clientname.domain.com
;如果它不在那里,客户端的 CSR 上传可能已失败。一个简单(且安全)的解决方法是puppetca --generate clientname.domain.com
在您的 puppetmaster 上使用 为客户端创建密钥对和签名证书。一个简单但不安全的解决方法是通过将“*.domain.com”放入 puppetmaster 的 autosign.conf 中来为您的域启用自动签名$confdir
。
答案2
如果启用了自动签名,您实际上会看到这种行为。您可以查看内容以/etc/puppet/autosign.conf
确切了解哪些域启用了此功能。例如,假设该文件包含以下内容:
*.example.com
192.168.0.0/24
这意味着来自 example.com 树下的主机名或 192.168.0.0/24 地址块的任何证书都将由 puppetca 签名,无需任何管理员交互。
您可以查看全部通过发出命令
/usr/sbin/puppetca --list --all
答案3
尝试排除 Puppet Master 证书名称不匹配的情况。
在代理节点上:
$ sudo puppetd --configprint server
在主服务器上:
$ sudo puppetca --print lab2.domain.com
...并在其转储的输出中查找以下几行:
...
Subject: CN={A hostname}
...
X509v3 Subject Alternative Name:
DNS:{a hostname}, DNS:{another hostname}, {etc.}
如果代理用于联系主服务器的主机名是主服务器的有效主机名,但不是在主 SSL 证书中的“主题通用名称”(certname)或“主题备用名称”(certdnsnames)字段中,您将陷入痛苦之中。
(如果这确实是问题所在,请将代理上的 puppet.conf 更改为指向 Puppet Master 的工作 certname 或 certdnsname,或者停止 Puppet Master,编辑 puppet.conf 以获取您想要的 certname 和 certdnsname,删除其 ssldir(puppetmaster --configprint ssldir
),然后重新启动 Master。)
答案4
我想插话解释一下我发现的一件事:假设它只工作了一半(客户端可以联系 puppet-master,但现在证书请求不再显示)。就我而言,它工作了一半,但后来,我甚至无法从客户端 SSH 到 puppet-master。奇怪。在这种情况下,我必须在客户端站点上浏览相同的 ssl 目录(上面)以删除客户端和 puppet-master 证书,并清除 puppet-master 的 ca 文件。在 puppet-master 上,我必须执行镜像操作,从所有目录中删除客户端证书的痕迹,以及 /var/lib/puppet/ssl/ca/inventory.txt 文件中的客户端列表。
完成上述操作并重新启动两者后,我就可以看到请求了。问题是,puppet-master 曾经在 /var/lib/puppet/ssl/ca 目录中的 inventory.txt 文件中列出客户端的有效证书,但我已清除或删除实际证书。我在 puppet-master 上的系统日志显示:“找不到主机的证书...”,这意味着它知道库存中有证书,但实际证书处于隐喻性的“待定”状态或只是丢失了。
因此,清除客户端的 ca 和 puppet-master 的旧证书。然后删除 inventory.txt 中的证书和证书列表,这样应该就可以了。