问题描述
在使用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
- 将转换后的
.pem
文件复制到目标机器上的C:\Users\[username]\.chef\trusted_certs
目录中。如果该目录不存在,请先创建它。 - 如果您使用的是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可能已经修复了这个问题。