使用2向SSL握手设置Netty(客户端和服务器证书)

我现在正在尝试使用两种方式的SSL握手来设置Netty,其中客户端和服务器都在其中并验证证书。

这似乎没有在SslHandler中实现。有没有人这样做?我想它将在SslHandler.handshake操作中运行并委托给javax.net.ssl.SSLEngine?

任何提示/技巧/预先存在的实现?

谢谢!


回答(stackoverflow不允许我以正常方式发布它)我发现,如果在设置SslHandler之前在SSLEngine对象上设置了needClientAuth标志,就可以解决此问题!

回答:

这是基于netty项目的HttpSnoop服务器示例的解决方案。

设置客户端管道时,必须如下设置ssl引擎:

public ChannelPipeline getPipeline() throws Exception {

// Create a default pipeline implementation.

ChannelPipeline pipeline = pipeline();

// Uncomment the following line if you want HTTPS

SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine();

engine.setUseClientMode(false);

engine.setNeedClientAuth(true);

pipeline.addLast("ssl", new SslHandler(engine));

pipeline.addLast("decoder", new HttpRequestDecoder());

pipeline.addLast("logger", new RequestAuditLogger());

// Uncomment the following line if you don't want to handle HttpChunks.

pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));

pipeline.addLast("outputLogger", new ResponseAuditLogger());

pipeline.addLast("encoder", new HttpResponseEncoder());

// Remove the following line if you don't want automatic content compression.

pipeline.addLast("deflater", new HttpContentCompressor());

pipeline.addLast("handler", new HttpSnoopServerHandler());

return pipeline;

}

}

然后,必须对SSLContext进行如下修改,以建立除密钥库(SecureChatSslContextFactory)之外的信任库:

public final class SecureChatSslContextFactory {

private static Logger logger = LoggerFactory.getLogger(SecureChatSslContextFactory.class);

private static final String PROTOCOL = "TLS";

private static final SSLContext SERVER_CONTEXT;

private static final SSLContext CLIENT_CONTEXT;

static {

SSLContext serverContext = null;

SSLContext clientContext = null;

// get keystore and trustore locations and passwords

String keyStoreLocation = System.getProperty("javax.net.ssl.keyStore");

String keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword");

String trustStoreLocation = System.getProperty("javax.net.ssl.trustStore");

String trustStorePassword = System.getProperty("javax.net.ssl.trustStorePassword");

try {

KeyStore ks = KeyStore.getInstance("JKS");

ks.load(KeyStoreStreamManager.asInputStream(keyStoreLocation),

keyStorePassword.toCharArray());

// Set up key manager factory to use our key store

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

kmf.init(ks, keyStorePassword.toCharArray());

// truststore

KeyStore ts = KeyStore.getInstance("JKS");

ts.load(KeyStoreStreamManager.asInputStream(trustStoreLocation),

trustStorePassword.toCharArray());

// set up trust manager factory to use our trust store

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

tmf.init(ts);

// Initialize the SSLContext to work with our key managers.

serverContext = SSLContext.getInstance(PROTOCOL);

serverContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

} catch (Exception e) {

throw new Error(

"Failed to initialize the server-side SSLContext", e);

}

try {

clientContext = SSLContext.getInstance(PROTOCOL);

clientContext.init(null, SecureChatTrustManagerFactory.getTrustManagers(), null);

} catch (Exception e) {

throw new Error(

"Failed to initialize the client-side SSLContext", e);

}

SERVER_CONTEXT = serverContext;

CLIENT_CONTEXT = clientContext;

}

public static SSLContext getServerContext() {

return SERVER_CONTEXT;

}

public static SSLContext getClientContext() {

return CLIENT_CONTEXT;

}

private SecureChatSslContextFactory() {

// Unused

}

}

以上是 使用2向SSL握手设置Netty(客户端和服务器证书) 的全部内容, 来源链接: utcz.com/qa/424187.html

回到顶部