如何在Chef中包含内部CA证书以验证SSL交换

105次阅读
没有评论

问题描述

在使用Chef时遇到了SSL验证错误,原因是Chef不知道他的CA证书。用户想知道如何让Chef知道他的CA证书以进行有效的SSL交换。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Chef中,有几种方法可以实现这个目标:
1. Chef有一个trusted_dir,允许将证书添加到受信任列表中。文档中有很多关于它的详细信息。将您的CA证书添加到此目录中将解决问题。knife也有类似的功能,但路径略有不同,可以参考knife文档
2. Chef在/opt/chef/embedded/ssl/certs/cacert.pem中使用自己的CA证书列表。您可以将您的CA证书添加到此列表的末尾以信任它。
第二种方法的优点是允许您导出环境变量SSL_CERT_FILE,指向Chef的cacert.pem,以便大多数使用openssl库的工具都能知道您的CA证书。
对于Chef服务器上的自签名证书(或作为配方中的目标使用的其他服务器),knife ssl_fetch将允许所有knife命令正常工作。
要将服务器证书添加到cacert.pem中,可以使用以下命令:

# 对于自签名CA证书
openssl s_client -showcerts -connect <YOUR_CHEF_SERVER>:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >> /opt/chefdk/embedded/ssl/certs/cacert.pem
# 对于内部CA签名的证书
openssl s_client -showcerts -verify 5 -connect <YOUR_CHEF_SERVER>:443 </dev/null 2>/dev/null | awk '/BEGIN/,/END/{if(/BEGIN/){a++}; certs[a]=(certs[a] "\n" $0)}; END {print certs[a]}' >> /opt/chefdk/embedded/ssl/certs/cacert.pem
export SSL_CERT_FILE=/opt/chefdk/embedded/ssl/certs/cacert.pem

在上面的示例中,我们使用openssl命令将服务器证书添加到cacert.pem文件中。请根据实际情况修改命令中的路径。对于Windows系统,将路径更改为c:\opscode\。要导出环境变量,请在命令中使用set SSL_CERT_FILE=...(使用/P将其永久添加到环境变量)。

方案2

使用脚本或工具来管理证书可能会增加复杂性,并且需要确保正确设置了CA证书的路径。
另一种方法是编写脚本或使用工具来控制证书的使用。您可以使用docker run命令手动控制证书的使用,或者使用一些第三方工具来管理证书的路径。
以下是一个示例,展示了如何将内部证书复制到目标机器上的正确位置:
1. 将您的证书导出为.cer格式,并使用以下命令将其转换为.pem格式:

./openssl x509 -inform der -in C:\dev\apps\certificates\org_root.cer -out C:\dev\apps\certificates\org_root.pem
  1. 将转换后的.pem文件复制到目标机器上的C:\Users\[username]\.chef\trusted_certs目录中。如果该目录不存在,请先创建它。
  2. 如果您使用的是ChefDK机器(如使用kitchen等工具),您还需要将内部证书的.pem文件内容复制到C:\opscode\chefdk\embedded\ssl\certs\cacert.pem文件的末尾,或者将其复制到由SSL_CERT_FILE环境变量引用的cacert.pem文件中。请确保按照正确的顺序复制证书,以确保证书链的正确性。
    这个解决方案的要求是由于ChefDK使用remote_file与客户端机器通信,所以需要将证书内容复制到ChefDK机器上的cacert.pem文件中。这个问题可能与Chef的一个bug有关,新版本的Chef可能已经修复了这个问题。

正文完