Hubot与Slack集成遇SSL拦截问题求助
我来帮你搞定这个问题——企业网络的SSL拦截确实经常给Node.js应用(比如Hubot)添乱,因为Node默认只信任公共CA颁发的证书,而代理的拦截证书不在这个列表里,导致连接Slack时验证失败,就卡在你看到的DEBUG slack rtm start with options: {}日志那里了。
下面给你两种可行的解决办法,优先推荐安全的方案:
推荐方案:信任企业的SSL根证书
这是最安全的做法,既让Hubot能正常通过代理,又保留SSL加密的安全性。
获取企业代理的根CA证书
联系你们公司的IT团队,拿到代理使用的根CA证书(通常是.pem或.crt格式的文件)。如果自己能导出的话,也可以从浏览器的证书管理器里导出企业根CA的证书(注意选Base64编码的PEM格式)。配置Node.js信任该证书
Node.js提供了NODE_EXTRA_CA_CERTS环境变量,用来指定额外的信任CA证书。你可以在启动Hubot的时候加上这个变量:NODE_EXTRA_CA_CERTS=/绝对路径/到/你的/企业ca证书.pem HTTPS_PROXY=http://你的代理地址:端口 ./bin/hubot --adapter slack如果需要永久生效,可以把这个环境变量加到系统的环境变量配置里,或者Hubot的启动脚本中。
确保代理配置正确
别忘了设置HTTP_PROXY和HTTPS_PROXY环境变量,指向你们企业的代理地址。如果代理需要认证,格式是http://用户名:密码@代理地址:端口。
临时应急:绕过SSL验证(不推荐)
这个方法会禁用SSL证书验证,虽然能快速解决连接问题,但会让Hubot和Slack之间的通信失去加密保护,容易被窃听,只建议在测试环境临时使用。
你可以通过设置NODE_TLS_REJECT_UNAUTHORIZED=0环境变量来禁用验证:
NODE_TLS_REJECT_UNAUTHORIZED=0 HTTPS_PROXY=http://你的代理地址:端口 ./bin/hubot --adapter slack
额外注意事项
- 如果你用的是旧版的
hubot-slack适配器,建议升级到最新版本,新版本对代理和SSL的支持更完善。 - 如果是用Docker部署Hubot,记得把CA证书挂载到容器内部,然后在容器的环境变量里设置
NODE_EXTRA_CA_CERTS指向容器内的证书路径。 - 测试的时候可以先单独用curl验证代理和证书是否正常:
curl --cacert /path/to/ca.pem -x http://proxy:port https://slack.com/api/auth.test,如果能正常返回,说明证书和代理配置没问题。
内容的提问来源于stack exchange,提问作者Ishan

