You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:08:40