无法在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: "你的密钥密码" }
- 生成无密码密钥对:在openssl命令中添加
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-----` }
- 确保完整保留PEM格式的首尾行:私钥需包含
内容的提问来源于stack exchange,提问作者Sébastien M.
相关产品推荐
相关产品推荐

