Common Lisp开发Slack Bot遇WebSocket SSL验证错误求助
解决Common Lisp Slack Bot的SSL验证错误问题
我来帮你搞定这个SSL验证的问题——这是用Common Lisp开发Slack Bot时挺常见的证书信任类错误,咱们一步步来解决。
你的问题回顾
你编写的Slack Bot代码如下:
(ql:quickload '(:cl-slack :event-emitter :websocket-driver :jonathan :cl-async ) :silent t) (defconstant +token+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") (defconstant +channel+ "xxx") (defvar *client* (make-instance 'cl-slack.core:slack-client :token +token+)) (let ((url (getf (jonathan:parse (cl-slack.rtm:start *client* nil)) :|url|))) (format t url) (defparameter *slack-bot* (wsd:make-client url))) (defun params (id type channel text) (jonathan:to-json (list :|id| id :|type| type :|channel| channel :|text| text))) (wsd:on :message *slack-bot* (lambda (message) (let ((data (jonathan:parse message))) (format t "~A~%" data) (when (string= (getf data :|type|) "message") (wsd:send *slack-bot* (params 1 "message" (getf data :|channel|) (getf data :|text|))))))) (as:with-event-loop (:catch-app-errors t) (wsd:start-connection *slack-bot*))
触发的错误信息为:
[20:42:25] cl-async-util - handle-error: SSL verify error: 20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
这个错误的核心是:OpenSSL在本地找不到用来验证Slack服务器证书的颁发机构(CA)证书,导致SSL握手失败。下面给你三种解决办法,按需选择:
解决方案
方法1:指定系统CA证书路径(推荐生产环境使用)
cl-async依赖libuv处理网络请求,它会读取系统的SSL_CERT_FILE环境变量定位CA证书。你可以先确认自己系统的CA证书路径:
- Debian/Ubuntu类系统:
/etc/ssl/certs/ca-certificates.crt - macOS(通过brew安装openssl):
/usr/local/etc/openssl/cert.pem - CentOS/RHEL:
/etc/pki/tls/certs/ca-bundle.crt
做法一:启动Lisp前设置环境变量
在终端先执行:
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt # 替换成你系统对应的证书路径
再启动Common Lisp环境运行代码。
做法二:在代码中提前设置
把环境变量设置放在quickload之前:
;; 先设置证书路径 (setf (uiop:getenv "SSL_CERT_FILE") "/etc/ssl/certs/ca-certificates.crt") ;; 再加载依赖包 (ql:quickload '(:cl-slack :event-emitter :websocket-driver :jonathan :cl-async ) :silent t) ;; 后续代码保持不变
方法2:临时禁用SSL验证(仅测试环境使用)
如果只是做功能测试,不想折腾证书路径,可以临时关闭SSL验证——注意:绝对不要在生产环境使用此方法,会带来严重安全风险。修改创建websocket客户端的代码,添加:verify nil参数:
(let ((url (getf (jonathan:parse (cl-slack.rtm:start *client* nil)) :|url|))) (format t url) ;; 添加:verify nil跳过证书验证 (defparameter *slack-bot* (wsd:make-client url :verify nil)))
这样websocket-driver会跳过证书验证流程,直接建立连接。
方法3:更新系统CA证书
如果你的系统CA证书过期或缺失,直接更新系统的证书包即可解决:
- Debian/Ubuntu系统:
sudo apt update && sudo apt install --reinstall ca-certificates
- macOS(使用brew):
brew install openssl ln -sf /usr/local/opt/openssl/etc/ssl/cert.pem /usr/local/etc/ssl/cert.pem
总结
这个错误本质是本地CA证书的信任问题,优先选择方法1或方法3来保证连接安全性,测试阶段可以用方法2临时绕开验证。
内容的提问来源于stack exchange,提问作者leaf_chage
相关产品推荐
相关产品推荐

