Do you happen to be using Conscrypt JSSE provider? We allow TLS 1.3 for IBM 
and ALPN JSSE providers but not for Conscrypt 
<https://github.com/grpc/grpc-java/blob/1c430989902856e609ddbff203be1dc4c412ff43/netty/src/main/java/io/grpc/netty/GrpcSslContexts.java#L211>,
 
for which we hard code it to TLS1.2. There is an open issue 
<https://github.com/grpc/grpc-java/issues/7765> for this.

On Wednesday, June 11, 2025 at 9:12:26 AM UTC+5:30 ganesh.umapathy 
ganesh.umapathy wrote:

> Can anyone pls check this and help us?
>
> On Tuesday, 10 June 2025 at 09:58:43 UTC+5:30 ganesh.umapathy 
> ganesh.umapathy wrote:
>
>> Can anyone pls check and reply on this?
>>
>> On Saturday, 7 June 2025 at 19:41:11 UTC+5:30 ganesh.umapathy 
>> ganesh.umapathy wrote:
>>
>>> I am using NettyChannelBuilder in grpc client and NettyServerBuilder in 
>>> grpc server.
>>>
>>> I have created NettyServerBuilder with sslcontext with TLS1.3 and 
>>> started the server as below
>>> import io.grpc.ServerCredentials;
>>> import io.grpc.TlsServerCredentials;
>>> import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext;
>>> import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder;
>>> import io.grpc.util.AdvancedTlsX509TrustManager;
>>> import io.grpc.Server;
>>> import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder;
>>> import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext;
>>> import io.grpc.stub.StreamObserver;
>>>
>>>         private Server myServer;
>>>         CertificateData grpcCertificateData = 
>>> CertificateData.SERVER_CERT;
>>>         try {
>>>             KeyManager serverKeyManager = 
>>> myCertificateHandlerService.getServerKeyManagers(grpcCertificateData.getServiceGroup())[0];
>>>             LOG.info("Retrieved key manager: {}", serverKeyManager);
>>>
>>>             X509TrustManager trustManager =
>>>                     (X509TrustManager) 
>>> myCertificateHandlerService.getServerTrustManagers(grpcCertificateData.getServiceGroup())[0];
>>>             X509Certificate[] acceptedIssuers = 
>>> trustManager.getAcceptedIssuers();
>>>             LOG.info("Retrieved CA certificates: {}", acceptedIssuers);
>>>
>>>             SslContextBuilder builder = 
>>> SslContextBuilder.forServer(serverKeyManager)
>>>                     .trustManager(trustManager)
>>>                     .clientAuth(ClientAuth.REQUIRE)
>>>                     .ciphers(CIPHER_SUITES_SUPPORTED)
>>>                     .protocols(TLS_VERSION_1_3);  // Explicitly set 
>>> TLSv1.3
>>>                     .sslProvider(SslProvider.JDK);
>>>
>>>             NettyServerBuilder.forPort(PORT)
>>>                         
>>> .sslContext(GrpcSslContexts.configure(builder).build())
>>>                         .addService(new LoadReportingRpcService());
>>> myServer = serverBuilder.directExecutor().build();
>>>             myServer.start();
>>>
>>>         }
>>>         catch (Exception e) {
>>>             LimitedLogger.logOrSuppressError(LOG, LOG_MESSAGE_DATA, 
>>> "Failed to build SSL context {}", e);
>>>         }
>>>
>>>
>>>
>>>
>>>
>>> Also I have created NettyChannelBuilder with sslContext with TLS1.3 and 
>>> invoked rpc method in grpc server as below
>>>  
>>>  import io.grpc.LoadBalancerRegistry;
>>> import io.grpc.ManagedChannel;
>>> import io.grpc.ManagedChannelBuilder;
>>> import io.grpc.NameResolverRegistry;
>>> import io.grpc.StatusRuntimeException;
>>> import io.grpc.internal.DnsNameResolverProvider;
>>> import io.grpc.internal.PickFirstLoadBalancerProvider;
>>> import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
>>> import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext;
>>> import io.grpc.stub.StreamObserver;
>>>
>>>
>>>    String serviceGroup = CertificateData.CERT_CLIENT.getServiceGroup();
>>>         try
>>>         {
>>>             TrustManager[] caTrustManagers = 
>>> myCertificateHandlerService.getServerTrustManagers(serviceGroup);
>>>             KeyManager[] clientKeyManagers = 
>>> myCertificateHandlerService.getClientKeyManagers(serviceGroup);
>>>             if (caTrustManagers == null || clientKeyManagers == null)
>>>             {
>>>                 LOG.error("NN Failed to retrieve PKI components. Server 
>>> trust manager was {}, client key manager was {}, for service group {}",
>>>                         caTrustManagers,
>>>                         clientKeyManagers,
>>>                         serviceGroup);
>>>             }
>>>             else
>>>             {
>>>                 LOG.error("NN Configure TLS1.3 client");
>>>                 X509TrustManager caTrustManager = (X509TrustManager) 
>>> caTrustManagers[0];
>>>                 KeyManager keyManager = clientKeyManagers[0];
>>>                 SslContextBuilder sslContextBuilder = 
>>> SslContextBuilder.forClient()
>>>                         .trustManager(caTrustManager)
>>>                         .keyManager(keyManager)
>>>                         .protocols(TLS_VERSION_1_3);
>>>                         .sslProvider(SslProvider.JDK)
>>>                         .ciphers(CIPHER_SUITES_SUPPORTED);
>>> ManagedChannelBuilder<?> channelBuilder = 
>>> NettyChannelBuilder.forAddress(target, GRPC_PORT);
>>>                 channelBuilder.directExecutor();
>>>                 LOG.error("NN tls enabled {}", isTlsEnabled());
>>>                 if (isTlsEnabled())
>>>                 {
>>>                    LOG.error("NN tls enabled and start secure grpc 
>>> client");
>>>                    ((NettyChannelBuilder) 
>>> channelBuilder).sslContext(GrpcSslContexts.configure(sslContextBuilder).build())).useTransportSecurity();
>>>                 }
>>>     foundChannel = channelBuilder.build();
>>>                 ReportingServiceGrpc.ReportingServiceStub stub = 
>>> ReportingServiceGrpc.newStub(foundChannel);
>>> stub.invokeRpcMethod();
>>>             }
>>>         }
>>>         catch (Exception e)
>>>         {
>>>             LOG.error("Failed to create ssl context for {}", 
>>> serviceGroup, e);
>>>         }
>>>
>>>  
>>> I
>>>
>>>
>>> I was using below TLS1.3 ciphers in both server and client
>>>  private static final Iterable<String> CIPHER_SUITES_SUPPORTED =
>>>             Arrays.asList("TLS_AES_256_GCM_SHA384", 
>>> "TLS_AES_128_GCM_SHA256",
>>>                     "TLS_CHACHA20_POLY1305_SHA256");
>>>
>>>
>>> But observed that TLS1.2 connection is established always from client to 
>>> server communication. Here i have configured with TLS1.3 in sslcontext in 
>>> both client and server and i am using java 11. It should establish TLS1.3 
>>> right?
>>>
>>> is it a bug in GRPC?   Otherwise please clarify me with the solution 
>>> with what am i missing ?
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to grpc-io+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/grpc-io/aa439f1e-6e50-479b-83b4-8169c350043an%40googlegroups.com.

Reply via email to