如何在 Spring Boot gradle 项目中为 bouncycastle 指定传递依赖

问题描述 投票:0回答:2

我们正在使用 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 (*)
java spring-boot gradle spring-security bouncycastle
2个回答
0
投票

我可以通过使用 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'

0
投票

对此添加更多理解:

您尝试对

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。

© www.soinside.com 2019 - 2024. All rights reserved.