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

Google Cloud Ubuntu虚拟机部署Servant时Warp-TLS握手失败求助

解决Servant/Warp-TLS的"no keys found"错误

你遇到的这个握手错误,大概率不是单纯的权限问题,咱们从几个核心排查方向一步步来解决:

1. 先确认证书文件的路径是否正确

你用的是相对路径"ssl/...",但运行可执行文件时的工作目录可能和你预想的不一样(比如用systemd启动、或者从其他目录执行二进制文件)。

  • 快速验证方法:在代码里加一行打印当前工作目录的代码,看看是不是和ssl目录在同一路径:
    startApp :: FilePath -> IO ()
    startApp dbFile = do
      currentDir <- getCurrentDirectory
      putStrLn $ "Current working directory: " ++ currentDir
      let tls = tlsSettings "ssl/22cb488c23a886e2.crt" "ssl/generated-private-key.pem"
      runTLS tls (setPort 443 defaultSettings) $ app dbFile
    
  • 如果路径不对,直接改用绝对路径更可靠,比如:
    let certPath = "/home/ubuntu/your-app-folder/ssl/22cb488c23a886e2.crt"
        keyPath = "/home/ubuntu/your-app-folder/ssl/generated-private-key.pem"
        tls = tlsSettings certPath keyPath
    

2. 检查证书和私钥的格式是否有效

Warp-TLS对证书文件的格式有严格要求,文件损坏或格式错误也会触发"no keys found":

  • 用OpenSSL命令验证私钥:

    openssl rsa -in ssl/generated-private-key.pem -check
    

    如果提示需要输入密码,说明你的私钥是加密的,Warp-TLS默认不支持这种情况,需要改用tlsSettingsWithPassword来传入密码。

  • 验证证书文件:

    openssl x509 -in ssl/22cb488c23a886e2.crt -text -noout
    

    如果命令报错,说明证书文件无效,需要重新生成或获取正确的证书。

3. 调整文件权限(别用777)

chmod 777太过于开放,反而可能因为系统安全策略被限制,正确的做法是让运行程序的用户拥有读权限即可:

  • 先把文件所有者改成运行程序的用户(比如ubuntu用户):
    sudo chown ubuntu:ubuntu ssl/*.crt ssl/*.pem
    
  • 再设置只读权限(所有者可读,其他用户无权限):
    chmod 600 ssl/*.crt ssl/*.pem
    

4. 排除端口权限干扰

Linux系统中,1024以下的端口(比如443)需要root权限才能绑定,如果你用普通用户运行程序,可能会导致绑定失败(虽然你的错误是密钥问题,但可以先排除这个干扰):

  • 临时测试:把端口改成8443(1024以上),看看是否还会出现相同错误。
  • 如果需要用443端口,可以用sudo运行你的可执行文件,或者给二进制文件添加CAP_NET_BIND_SERVICE权限(更安全):
    sudo setcap 'cap_net_bind_service=+ep' ./your-servant-executable
    

按这个顺序一步步排查,应该能解决问题。

内容的提问来源于stack exchange,提问作者Jimbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:46:19