unzip -p app.jar 'BOOT-INF/classes/**' | strings | grep -c 'AKIA'
grep -rn 'AKIA' src/main/java

安全扫描在构建产物里搜到以 AKIA 开头的字符串,位置在 BOOT-INF/classes/com/demo/EncryptTest.class,测试类里写死的生产密钥被一起打进了 jar。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:测试代码和主代码在同一个源码目录,构建时没有排除 test 包。密钥写在常量里,编译后以明文字符串留在 class 文件。发布流程只检查了配置文件,没有扫构建产物。

围绕「测试密钥进生产包」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:测试类挪到 src/test/java 让构建不打包;密钥从代码里删掉 改成测试启动时从环境变量读取;构建流水线加一步扫描 class 和 jar 里的密钥特征;重新打包后用 unzip 搜一遍确认没有残留。

确认没问题再收工,新包的 strings 输出里 AKIA 计数为 0 测试仍能从环境变量拿到密钥。

作者 9823189