使用Quarkus&Smallrye JWT生成GitHub App认证JWT失败求助
解决Quarkus中GitHub App JWT签名密钥错误问题
针对你遇到的SRJWT05028: Signing key can not be created from the loaded content错误,以下是排查和解决步骤:
1. 检查私钥文件有效性
GitHub App生成的私钥必须是完整的RSA格式,确保privateKey.pem包含首尾标记且无格式错误:
-----BEGIN RSA PRIVATE KEY----- # 密钥内容(无多余空格/换行) -----END RSA PRIVATE KEY-----
如果私钥是从GitHub下载的,不要修改内容,直接放入src/main/resources目录。若文件损坏,重新从GitHub App设置页面生成并下载私钥。
2. 验证配置路径与文件读取
- 确认
privateKey.pem在src/main/resources根目录下,若放在子文件夹,需修改配置路径为相对路径(如keys/privateKey.pem)。 - 可临时使用绝对路径测试配置,确认文件能被读取:
smallrye.jwt.sign.key.location=file:/your/project/path/src/main/resources/privateKey.pem
3. 确认依赖配置正确
确保项目引入了正确的Quarkus SmallRye JWT Build依赖:
Maven
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-smallrye-jwt-build</artifactId> </dependency>
Gradle
implementation 'io.quarkus:quarkus-smallrye-jwt-build'
依赖版本需与Quarkus主版本一致,避免版本冲突。
4. 手动加载私钥调试
若自动加载失败,尝试手动读取私钥以定位问题,修改TokenManager:
@RequestScoped public class TokenManager { @Inject @ConfigProperty(name = "smallrye.jwt.sign.key.location") String keyLocation; public String getJwt() throws Exception { InputStream keyStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(keyLocation); if (keyStream == null) { throw new IllegalArgumentException("私钥文件未找到"); } byte[] keyBytes = keyStream.readAllBytes(); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); return Jwt .issuer("你的GitHub App数字ID") // 注意:这里必须是App的数字ID,不是URL .issuedAt(Instant.now()) .expiresAt(Instant.now().plusMillis(600000)) .sign(privateKey); } }
如果手动加载时报错,说明私钥格式或文件路径存在问题;若成功,则检查自动加载的配置是否有遗漏。
5. 修正GitHub JWT Issuer字段
注意:GitHub App要求JWT的iss字段是你的App的数字ID(可在GitHub App设置页面找到),而非https://github.com/apps/appname,这个错误虽不直接导致当前密钥错误,但会导致后续GitHub API认证失败,必须修正。
内容的提问来源于stack exchange,提问作者ceid1987
相关产品推荐
相关产品推荐

