CouchDB非对称密钥JWT认证失败求助:无效密钥错误
解决CouchDB JWT认证"Not a valid key"错误
问题现状
已完成CouchDB 3.2.2的JWT认证配置,_session接口显示JWT为有效认证方式,但携带Bearer Token请求时返回{"error":"bad_request","reason":"Not a valid key"}错误。
配置内容如下:
[chttpd] authentication_handlers = {chttpd_auth, jwt_authentication_handler}, {chttpd_auth, cookie_authentication_handler}, {chttpd_auth, default_authentication_handler} [jwt_auth] required_claims = exp [log] level = debug [jwt_keys] rsa:fqT4qxoKNIwJSUSdhEL3KYRjl2tsz-tRMcZr_V16skM = -----BEGIN PUBLIC KEY-----\MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAooP42fI/5PcuI5AflBpn\nLVH9cv4Iz5ubS9J2fFigCSIq6r2nQvgyw/uD+mKO+Gy87zHw+2+2MlYNWiWgBwSJ\naGXE4eZOtqsjiy3q00JMtNfUYCpa8hZWlazIq4beUFjxaDNgTIA1Dm7yk4ZsDKG8\njIzRz51WHAQtnTVGplUYRQD8hVfEiLxB2nbtVMp8rdTTR0hlIv/b262VA1d76BwE\nEzGwgasKlfUxx5usMJ8WRiMMvsgfsrQ/UqH/Oz1BJ/jebbFA2hhQxMZTjk+Sb2hF\nGvxOb7+DNJrgCNyxQfTPThNisOurQf+W6APyP6IMEpkE/E+t4nsPlo9B0+DdjeTW\nwaDcemMzoWmuerjA4PJ7E7CpOOCq6NmjrPJVTjvb61A6zB52LtYLbwqKFVx166Wa\nClhdNspeAXDEP9m1w+TLbvsDBlnVvfJMT/MnBn3nQKGqwjaNJ0VZttn66DAS5Qig\n8iC4R0Ab8Hv22s/WKQA6txXTJ5Fj43TvGbf/kZVteB9hqIdAkoeBKlHQaNz9S4lL\nbt+w1C1CkiO272S/iun+q9il5tbTWVU3mqYEJCgzs2q9RtMTrj81MaM89QRuoJxO\nC/fOcE1mPsFs5PiIOfMcetLNR7jNiwQknK4krmBM9DGrK1tR8hU471ANAOYmqntH\nPUyoxOpC0reaacfiKOqaabkCAwEAAQ==\n-----END PUBLIC KEY-----\n
调用_session接口返回:
curl 127.0.0.1:5984/_session
{"ok":true,"userCtx":{"name":null,"roles":[]},"info":{"authentication_handlers":["jwt","cookie","default"]}}
请求失败示例:
curl -H 'Authorization: Bearer $REALLY_LONG_STRING' 127.0.0.1:5984/
{"error":"bad_request","reason":"Not a valid key"}
问题根源
配置中的PEM公钥存在格式错误:
- 公钥开头
-----BEGIN PUBLIC KEY-----\MIICIjAN...里的\M是非法转义字符 - 公钥内容使用了
\n转义字符串,而非真实换行,导致CouchDB无法正确解析公钥结构
修复步骤
1. 修正公钥格式
将公钥内容改为真实换行,删除错误的转义字符,正确配置如下:
[jwt_keys] rsa:fqT4qxoKNIwJSUSdhEL3KYRjl2tsz-tRMcZr_V16skM = -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAooP42fI/5PcuI5AflBpn LVH9cv4Iz5ubS9J2fFigCSIq6r2nQvgyw/uD+mKO+Gy87zHw+2+2MlYNWiWgBwSJ aGXE4eZOtqsjiy3q00JMtNfUYCpa8hZWlazIq4beUFjxaDNgTIA1Dm7yk4ZsDKG8 jIzRz51WHAQtnTVGplUYRQD8hVfEiLxB2nbtVMp8rdTTR0hlIv/b262VA1d76BwE EzGwgasKlfUxx5usMJ8WRiMMvsgfsrQ/UqH/Oz1BJ/jebbFA2hhQxMZTjk+Sb2hF GvxOb7+DNJrgCNyxQfTPThNisOurQf+W6APyP6IMEpkE/E+t4nsPlo9B0+DdjeTW waDcemMzoWmuerjA4PJ7E7CpOOCq6NmjrPJVTjvb61A6zB52LtYLbwqKFVx166Wa ClhdNspeAXDEP9m1w+TLbvsDBlnVvfJMT/MnBn3nQKGqwjaNJ0VZttn66DAS5Qig 8iC4R0Ab8Hv22s/WKQA6txXTJ5Fj43TvGbf/kZVteB9hqIdAkoeBKlHQaNz9S4lL bt+w1C1CkiO272S/iun+q9il5tbTWVU3mqYEJCgzs2q9RtMTrj81MaM89QRuoJxO C/fOcE1mPsFs5PiIOfMcetLNR7jNiwQknK4krmBM9DGrK1tR8hU471ANAOYmqntH PUyoxOpC0reaacfiKOqaabkCAwEAAQ== -----END PUBLIC KEY-----
2. 匹配JWT的kid字段
确保JWT头部的kid值与配置中rsa:后的密钥ID(fqT4qxoKNIwJSUSdhEL3KYRjl2tsz-tRMcZr_V16skM)完全一致,CouchDB通过kid匹配对应公钥。
3. 确认签名算法一致性
JWT必须使用RS256/RSA系列签名算法,与配置的rsa:密钥类型匹配;若使用HS256等对称算法,需改用hs:前缀配置密钥。
4. 重启CouchDB服务
修改配置后必须重启CouchDB,确保新的密钥配置生效。
5. 查看调试日志
开启debug级别日志后,检查CouchDB日志文件(默认路径var/log/couchdb/),获取更详细的密钥解析错误信息,辅助定位问题。
验证
重启服务后重新发起请求:
curl -H 'Authorization: Bearer YOUR_VALID_JWT_TOKEN' 127.0.0.1:5984/
若返回数据库列表或对应权限的内容,则认证成功。
内容的提问来源于stack exchange,提问作者SemiProfessionalStudies
相关产品推荐
相关产品推荐

