Запрос о поддержке ML-KEM с Bouncy Castle 1.80 в приложении Maven Spring BootJAVA

Программисты JAVA общаются здесь
Anonymous
Запрос о поддержке ML-KEM с Bouncy Castle 1.80 в приложении Maven Spring Boot

Сообщение Anonymous »

У меня есть запрос относительно использования библиотеки Bouncy Castle для криптографии после Quantum (PQC) в моем приложении Spring Boot. Я использую Java версию 21, Bouncy Castle версии 1.80 , которая поддерживает ml-kem , и я включил соответствующую bctls версию 1.80 в мои зависимости Maven. Я могу подтвердить, что файл JAR включает в себя классы, связанные с ML-KEM.

Код: Выделить всё

21



org.springframework.boot
spring-boot-starter-actuator


org.springframework.boot
spring-boot-starter-webflux



org.springframework.boot
spring-boot-devtools
runtime
true


org.projectlombok
lombok
true


org.springframework.boot
spring-boot-starter-test
test




org.bouncycastle
bcprov-jdk18on
1.80




org.bouncycastle
bctls-jdk18on
1.80









org.conscrypt
conscrypt-openjdk-uber
2.5.2







org.apache.maven.plugins
maven-compiler-plugin



org.projectlombok
lombok





org.springframework.boot
spring-boot-maven-plugin



org.projectlombok
lombok






< /code>
@Component
@RequiredArgsConstructor
public class CustomTlsConfig {

@PostConstruct
public void init() {
// Register the Bouncy Castle JSSE provider
changeDefaultJSSEProvider();
}

private static void changeDefaultJSSEProvider() {
Security.insertProviderAt(new BouncyCastleProvider(), 1);
Security.insertProviderAt(new BouncyCastleJsseProvider(),  2);
SSLContext context = null;
try {
context = SSLContext.getDefault();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
System.out.println("SSLContext provider: " + context.getProvider().getName());
}
}
Кроме того, я установил свойства SSL в моем приложении.

Код: Выделить всё

server.ssl.enabled=true
server.ssl.key-store-type=PKCS12
server.ssl.key-store=path-to-my-keystore
server.ssl.key-alias=some-alias
server.ssl.key-store-password=some-pwd
< /code>
Мое приложение Spring Boot запускается успешно.openssl s_client -connect localhost:8081 -groups X25519
Он работает отлично, но когда я пытаюсь использовать группу ml-kem с командой:

Код: Выделить всё

openssl s_client -connect localhost:8081 -groups mlkem768
< /code>
Соединение не удается. Пожалуйста, см.  Ниже журналы ошибок из моего приложения Springboot: < /p>
javax.net.ssl|ERROR|03|reactor-http-epoll-3|2025-05-26 10:30:49.541 SGT|TransportContext.java:375|Fatal (UNEXPECTED_MESSAGE): Unexpected key_share extension in HelloRetryRequest (
"throwable"  : {
javax.net.ssl.SSLProtocolException: Unexpected key_share extension in HelloRetryRequest
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:128)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:370)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:326)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:317)
at java.base/sun.security.ssl.KeyShareExtension$HRRKeyShareProducer.produce(KeyShareExtension.java:796)
at java.base/sun.security.ssl.SSLExtension.produce(SSLExtension.java:599)
at java.base/sun.security.ssl.SSLExtensions.produce(SSLExtensions.java:265)
at java.base/sun.security.ssl.ServerHello$T13HelloRetryRequestProducer.produce(ServerHello.java:787)
at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:437)
at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.goHelloRetryRequest(ClientHello.java:1189)
at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.consume(ClientHello.java:1177)
at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:837)
at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:798)
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:393)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:476)
at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1273)
at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1260)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:714)
at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:1205)
at io.netty.handler.ssl.SslHandler.runDelegatedTasks(SslHandler.java:1695)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1541)
at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1377)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1428)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.codec.ByteToMessageDecoder.handlerRemoved(ByteToMessageDecoder.java:266)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:537)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:799)
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:501)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:399)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1583)}

)

< /code>
На основе журналов я вижу, что используется библиотека Sun.security.ssl.  Однако, когда я выполнил следующий код: < /p>
SSLContext context = null;
try {
context = SSLContext.getDefault();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
System.out.println("SSLContext provider: " + context.getProvider().getName());
он печатает Bcjsse в качестве поставщика. Может ли кто-нибудь предоставить примеры руководства или кода о том, как включить поддержку ML-KEM?
Заранее спасибо за помощь.

Подробнее здесь: https://stackoverflow.com/questions/796 ... -boot-appl

Вернуться в «JAVA»