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

无法在Bun.js HTTPS服务器中使用SSH密钥对的问题

Bun.js HTTPS密钥对读取失败问题排查与解决

问题背景

按照Bun.js官方文档配置HTTPS,通过Bun.serve()的tls属性指定RSA密钥对,代码示例如下:

Bun.serve({
    port: Bun.env.PORT,
    async fetch(request) {
        return new Response(JSON.stringify({"message": "Hello world","from": "Paris"}), 
            {
                headers: {
                    "Content-Type": "application/json",
                    "Access-Control-Allow-Origin": "*"
                }
            }
        )        
    },
    tls: {
        key: Bun.file("./.tls/key.pem"),     // 私钥
        cert: Bun.file("./.tls/cert.pem")    // 公钥证书
    }
})

但实际运行时遇到多种密钥读取错误:

  • 使用openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256生成密钥对,抛出异常:error: OpenSSL BAD_PASSWORD_READ via OPENSSL_internal PEM routines
  • 使用ssh-keygen生成的RSA密钥对,抛出异常:OpenSSL NO_START_LINE via OPENSSL_internal PEM routines;为公钥添加首尾行后,异常变为:error: OpenSSL BAD_BASE64_DECODE via OPENSSL_internal PEM routines
  • 将密钥直接以字符串写入JS文件时,出现:OpenSSL BAD_END_LINE via OPENSSL_internal PEM routines错误

已确认私钥权限为600、公钥权限为644,格式与编码均无问题。

解决方法

1. OpenSSL生成密钥对报错(BAD_PASSWORD_READ)

  • 问题根源:生成密钥时设置了密码,但Bun未配置密码参数,导致无法解密私钥。
  • 两种解决方式:
    • 生成无密码密钥对:在openssl命令中添加-nodes参数,跳过密码设置:
      openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -nodes
      
    • 保留密码并配置参数:如果必须使用带密码的密钥,在tls配置中添加passphrase字段:
      tls: {
          key: Bun.file("./.tls/key.pem"),
          cert: Bun.file("./.tls/cert.pem"),
          passphrase: "你的密钥密码"
      }
      

2. ssh-keygen生成密钥对报错(NO_START_LINE/BAD_BASE64_DECODE)

  • 问题根源:ssh-keygen生成的是SSH协议专用格式的密钥,而Bun要求的是用于HTTPS的X.509标准PEM格式密钥,两者不兼容。
  • 解决方式:放弃使用ssh-keygen生成HTTPS密钥,直接用openssl生成符合要求的PEM格式密钥对。

3. 密钥字符串写入报错(BAD_END_LINE)

  • 问题根源:字符串格式丢失了PEM密钥的换行符或首尾标记行。
  • 解决方式:
    • 确保完整保留PEM格式的首尾行:私钥需包含-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----,证书需包含-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----
    • 使用JavaScript模板字符串保留换行:
      tls: {
          key: `-----BEGIN PRIVATE KEY-----
      MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...(完整密钥内容)
      -----END PRIVATE KEY-----`,
          cert: `-----BEGIN CERTIFICATE-----
      MIIDdzCCAl+gAwIBAgIUY...(完整证书内容)
      -----END CERTIFICATE-----`
      }
      

内容的提问来源于stack exchange,提问作者Sébastien M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:01:37