这是一个无需重置 Xcode Server 即可解决问题的解决方案。
有什么问题?
首先,通过检查xcsnginx.log
日志文件检查此答案是否适用:
sudo tail /Library/Developer/XcodeServer/Logs/xcsnginx.log
在日志末尾搜索以下行:
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/Library/Developer/XcodeServer/Certificates/xcsnginx.key") failed (SSL: error:0906A068:PEM routines:PEM_do_header:bad password read error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
我在日志中没有看到该条目,恐怕这个答案对您没有帮助。如果您确实看到该条目,则可以继续。
为什么会这样?
Xcode Server 在内部运行一个 Nginx Web 服务器(在 port 上20543
),命名为xcsnginx
充当某些服务之间的代理。此服务器使用 TLS/SSL 证书来确保通信保持安全。涉及的文件如下:
xcsnginx.crt
: 包含 PEM 证书。
xcsnginx.key
: 包含证书的私钥。
xcsnginx.pass
: 包含私钥的密码。
据我了解,私钥是未加密存储的,这意味着xcsnginx.pass
应该是空的(并且似乎每次 Xcode Server 启动时都会重置)。
但是由于某种原因,在某些方面,私钥xcsnginx.key
被导出为加密密钥。我不知道这如何以及为什么会发生,但它确实发生在我的服务器上,所以我假设它也可能发生在你的服务器上。结果是xcsnginx
无法加载证书并且无法启动。
您可以通过执行以下命令来验证它xcsnginx
没有运行:
pgrep xcsnginx || echo "Not running"
如何解决?
与其从头开始重置 Xcode Server,我们可以:
xcsnginx.keychain
从钥匙串中再次导出身份或
- 恢复以前的证书和密钥或
- 为 .创建一个新的证书和密钥
xcsnginx
。
因此,让我们来看看每个选项。
选项1
证书和私钥的副本存储在xcsnginx.keychain
位于/Library/Developer/XcodeServer/Keychains
. 此钥匙串受存储在文件夹中命名XCSNginxKeychainSharedSecret
的文件中的密码保护/Library/Developer/XcodeServer/SharedSecrets
。
如果您熟悉 OS X 钥匙串,则可以从钥匙串中检索证书和密钥。
然而,使用命令行操作钥匙串是一场真正的噩梦,所以我将把它作为读者(或编辑)的练习。
选项 2
该/Library/Developer/XcodeServer/Certificates
文件夹可能包含您的证书和密钥的备份。让我们来了解一下:
sudo find /Library/Developer/XcodeServer/Certificates -name "*.original"
如果幸运的话,应该会得到以下结果:
/Library/Developer/XcodeServer/Certificates/xcsnginx.crt.original
/Library/Developer/XcodeServer/Certificates/xcsnginx.key.original
/Library/Developer/XcodeServer/Certificates/xcsnginx.pass.original
这意味着您可以恢复原始文件:
sudo cp /Library/Developer/XcodeServer/Certificates/xcsnginx.crt.original /Library/Developer/XcodeServer/Certificates/xcsnginx.crt
sudo cp /Library/Developer/XcodeServer/Certificates/xcsnginx.key.original /Library/Developer/XcodeServer/Certificates/xcsnginx.key
sudo cp /Library/Developer/XcodeServer/Certificates/xcsnginx.pass.original /Library/Developer/XcodeServer/Certificates/xcsnginx.pass
选项 3
如果您无法恢复以前的证书和钥匙串,您可能会决定只生成新的,如下所示:
sudo openssl req -new -x509 -newkey rsa:2048 -nodes -out /Library/Developer/XcodeServer/Certificates/xcsnginx.crt -keyout /Library/Developer/XcodeServer/Certificates/xcsnginx.key -subj /CN=your-server.example.com -days 1000 -batch
whereyour-server.example.com
替换为您的服务器的 DNS 地址。理想情况下,证书应该由 Xcode 服务器根证书颁发机构颁发,但使用单签名证书似乎不是问题(就我现在/目前/您的里程可能会有所不同)。
最后
现在我们只需要等到系统xcsnginx
再次启动。这应该在一分钟或更短的时间内自动发生。您可以验证xcsnginx
确实开始于:
pgrep xcsnginx || echo "Not running"