我们正在使用 Spring
org.springframework.boot" version '2.7.5'
,我们发现了一些 bouncycastle
的漏洞,它在我们的项目中仅具有传递依赖。
我们想要指定最新版本的 bouncycastle,如下所述 overriding-dependency-versions-with-spring-boot
ext['bouncycastle.version'] = '1.72'
尝试此操作后仍然失败,它显示了旧的依赖关系。知道缺少什么吗?
依赖洞察
bouncycastle
gradlew dependencyInsight --dependency bouncycastle --configuration compileClasspath
结果
org.bouncycastle:bcpkix-jdk15on:1.69
\--- org.springframework.security:spring-security-rsa:1.0.11.RELEASE
+--- org.springframework.cloud:spring-cloud-dependencies:2021.0.4
| \--- compileClasspath
\--- org.springframework.cloud:spring-cloud-starter:3.1.4
+--- org.springframework.cloud:spring-cloud-dependencies:2021.0.4 (*)
\--- org.springframework.cloud:spring-cloud-starter-sleuth:3.1.4
+--- compileClasspath (requested org.springframework.cloud:spring-cloud-starter-sleuth)
\--- org.springframework.cloud:spring-cloud-dependencies:2021.0.4 (*)
我可以通过使用 gradle 约束来解决这个问题
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
constraints {
implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
implementation 'org.bouncycastle:bcpkix-jdk15on:1.70'
implementation 'org.bouncycastle:bcutil-jdk15on:1.70'
}
或者通过排除它并手动添加所需的依赖项
configurations.all {
exclude group:"org.bouncycastle", module: "bcprov-jdk15on"
exclude group:"org.bouncycastle", module: "bcutil-jdk15on"
exclude group:"org.bouncycastle", module: "bcpkix-jdk15on"
}
implementation 'org.bouncycastle:bcprov-jdk18on:1.72'
implementation 'org.bouncycastle:bcpkix-jdk18on:1.72'
implementation 'org.bouncycastle:bcutil-jdk18on:1.72'
对此添加更多理解:
您尝试对
ext['bouncycastle.version'] = '1.72'
执行的操作是覆盖由您可能在 build.gradle 顶部导入的 io.spring.dependency-management
插件创建和使用的变量。
这些变量并不详尽,也不是神奇的。它们涵盖了许多非常常见的软件包,但也有很多它们没有涵盖。
这里是插件引入的变量的Spring文档列表(或者更确切地说,是大多数变量。您可以检查Spring版本标签下的源代码以获取完整列表)。您会注意到
bouncycastle.version
不是插件实际创建或引用的变量。
我在任何地方都没有找到这个问题的出色答案,所以我最终在我的 build.gradle 的顶部实现了这个:
configurations.all {
resolutionStrategy {
eachDependency { DependencyResolveDetails details ->
if (details.requested.group == 'org.bouncycastle' && details.requested.name == 'bcpkix-jdk15on') {
details.useTarget('org.bouncycastle:bcpkix-jdk18on:1.78')
}
if (details.requested.group == 'org.bouncycastle' && details.requested.name == 'bcprov-jdk15on') {
details.useTarget('org.bouncycastle:bcprov-jdk18on:1.78')
}
}
}
}
我不喜欢这个解决方案,但在我见过的所有解决方案中,这是对“如何用 jdk18on 替换 jdk15on?”这个问题最直接的答案:您确定 jdk15on 的用法并将其替换为 jdk18on。