Netty-based HTTP/2 transport implementation for gRPC Java providing high-performance network communication
—
Comprehensive SSL/TLS support for gRPC Netty with utilities for creating properly configured SSL contexts, including ALPN negotiation and certificate management.
import io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.NettySslContextChannelCredentials;
import io.grpc.netty.NettySslContextServerCredentials;
import io.grpc.netty.NettyChannelCredentials;
import io.grpc.ChannelCredentials;
import io.grpc.ServerCredentials;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.SslProvider;
import java.io.File;
import java.io.InputStream;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.cert.X509Certificate;Utility class for configuring Netty SSL contexts with gRPC-specific settings.
public static SslContextBuilder forClient();Creates an SSL context builder for gRPC clients with appropriate ALPN/NPN configuration.
Returns: SslContextBuilder configured for gRPC client use
public static SslContextBuilder forServer(File keyCertChainFile, File keyFile);
public static SslContextBuilder forServer(File keyCertChainFile, File keyFile, String keyPassword);
public static SslContextBuilder forServer(InputStream keyCertChain, InputStream key);
public static SslContextBuilder forServer(InputStream keyCertChain, InputStream key, String keyPassword);
public static SslContextBuilder forServer(PrivateKey key, X509Certificate... keyCertChain);
public static SslContextBuilder forServer(PrivateKey key, String keyPassword, X509Certificate... keyCertChain);Parameters:
keyCertChainFile - Certificate chain file in PEM formatkeyFile - Private key file in PEM formatkeyPassword - Password for encrypted private keyskeyCertChain - Certificate chain input streamkey - Private key input stream or objectkeyCertChain - Certificate chain as X.509 certificatesReturns: SslContextBuilder configured for gRPC server use
public static SslContextBuilder configure(SslContextBuilder builder);
public static SslContextBuilder configure(SslContextBuilder builder, SslProvider provider);
public static SslContextBuilder configure(SslContextBuilder builder, Provider jdkProvider);Parameters:
builder - Existing SslContextBuilder to configureprovider - Specific SSL provider (OPENSSL, JDK)jdkProvider - JDK security provider for SSL implementationReturns: Configured SslContextBuilder with gRPC-specific settings
public static ChannelCredentials create(SslContext sslContext);Parameters:
sslContext - Configured Netty SslContextReturns: ChannelCredentials for use with channel builders
public static ServerCredentials create(SslContext sslContext);Parameters:
sslContext - Configured Netty SslContextReturns: ServerCredentials for use with server builders
public static ChannelCredentials create(io.grpc.ChannelCredentials channelCreds);Parameters:
channelCreds - Standard gRPC channel credentialsReturns: Netty-specific ChannelCredentials implementation
public static ServerCredentials create(io.grpc.ServerCredentials serverCreds);Parameters:
serverCreds - Standard gRPC server credentialsReturns: Netty-specific ServerCredentials implementation
import io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.NettyChannelBuilder;
import io.netty.handler.ssl.SslContext;
// Client with system default trust store
SslContext sslContext = GrpcSslContexts.forClient()
.build();
ManagedChannel channel = NettyChannelBuilder.forAddress("api.example.com", 443)
.sslContext(sslContext)
.build();import javax.net.ssl.TrustManagerFactory;
import java.security.KeyStore;
// Load custom trust store
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(new FileInputStream("truststore.jks"), "password".toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(trustStore);
SslContext sslContext = GrpcSslContexts.forClient()
.trustManager(trustManagerFactory)
.build();
ManagedChannel channel = NettyChannelBuilder.forAddress("api.example.com", 443)
.sslContext(sslContext)
.build();import java.io.File;
SslContext sslContext = GrpcSslContexts.forClient()
.trustManager(new File("ca-cert.pem"))
.keyManager(new File("client-cert.pem"), new File("client-key.pem"))
.build();
ManagedChannel channel = NettyChannelBuilder.forAddress("api.example.com", 443)
.sslContext(sslContext)
.build();import io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.NettyServerBuilder;
import java.io.File;
SslContext sslContext = GrpcSslContexts.forServer(
new File("server-cert.pem"),
new File("server-key.pem")
).build();
Server server = NettyServerBuilder.forPort(9090)
.sslContext(sslContext)
.addService(new GreeterImpl())
.build();SslContext sslContext = GrpcSslContexts.forServer(
new File("server-cert.pem"),
new File("server-key.pem"),
"keyPassword"
).build();
Server server = NettyServerBuilder.forPort(9090)
.sslContext(sslContext)
.addService(new GreeterImpl())
.build();SslContext sslContext = GrpcSslContexts.forServer(
new File("server-cert.pem"),
new File("server-key.pem")
)
.trustManager(new File("client-ca.pem"))
.clientAuth(ClientAuth.REQUIRE)
.build();
Server server = NettyServerBuilder.forPort(9090)
.sslContext(sslContext)
.addService(new GreeterImpl())
.build();import io.grpc.netty.NettySslContextChannelCredentials;
import io.grpc.netty.NettySslContextServerCredentials;
// Client credentials
SslContext clientSslContext = GrpcSslContexts.forClient().build();
ChannelCredentials channelCreds = NettySslContextChannelCredentials.create(clientSslContext);
ManagedChannel channel = Grpc.newChannelBuilder("api.example.com:443", channelCreds)
.build();
// Server credentials
SslContext serverSslContext = GrpcSslContexts.forServer(
new File("server-cert.pem"),
new File("server-key.pem")
).build();
ServerCredentials serverCreds = NettySslContextServerCredentials.create(serverSslContext);
Server server = Grpc.newServerBuilderForPort(9090, serverCreds)
.addService(new GreeterImpl())
.build();import io.netty.handler.ssl.SslProvider;
import io.netty.handler.ssl.SupportedCipherSuiteFilter;
SslContext sslContext = GrpcSslContexts.forClient()
.sslProvider(SslProvider.OPENSSL) // Use OpenSSL for performance
.ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE)
.protocols("TLSv1.2", "TLSv1.3")
.build();import io.netty.handler.ssl.OpenSsl;
import io.netty.handler.ssl.SslProvider;
if (OpenSsl.isAvailable()) {
SslContext sslContext = GrpcSslContexts.forClient()
.sslProvider(SslProvider.OPENSSL)
.build();
} else {
// Fallback to JDK
SslContext sslContext = GrpcSslContexts.forClient()
.sslProvider(SslProvider.JDK)
.build();
}import io.netty.handler.ssl.SslSessionCacheSize;
import io.netty.handler.ssl.SslSessionTimeout;
SslContext sslContext = GrpcSslContexts.forServer(
new File("server-cert.pem"),
new File("server-key.pem")
)
.sessionCacheSize(1000)
.sessionTimeout(300) // 5 minutes
.build();gRPC requires ALPN (Application Layer Protocol Negotiation) for HTTP/2. The GrpcSslContexts utility automatically configures ALPN with the correct protocol identifiers:
h2 - HTTP/2 over TLShttp/1.1 - HTTP/1.1 fallbackjavax.net.ssl.SSLException: ALPN is not supportedSolution: Use OpenSSL provider or ensure JDK 8u251+ with ALPN support
javax.net.ssl.SSLHandshakeException: General SSLEngine problemSolution: Verify certificate chain and trust store configuration
javax.net.ssl.SSLHandshakeException: No appropriate protocolSolution: Ensure both client and server support compatible TLS versions
Install with Tessl CLI
npx tessl i tessl/maven-io-grpc--grpc-netty