应用 - SSL
SSL 目前支持:tcp, ws 协议(udp 暂不支持)。使用SSL时,尽量用域名的形式连接(ws 可能会验证域名)。
关于证书的配置对照关系:
| 参数 | 客户端 | 服务端 |
|---|---|---|
| SSLContext:keyManagers | 可为 null(不提供客户端证书) | 不能为 null(必须提供服务器证书) |
| SSLContext:trustManagers | 可为 null(使用默认信任库)。可为空(全部信任) | 可为 null(不验证客户端证书,只支持单向认证) |
| Config:sslNeedClientAuth | / | 是否强制要求客户端证书(没有证书则连接失败) |
| Config:sslWantClientAuth | / | 是否请求客户端证书(但没有证书也允许连接) |
具体由业务情况及证书要求而定。
1、单向认证
- 客户端
public class Demo {
public static void main(String[] args) throws Throwable {
SSLContext sslContext = new SslContextBuilder()
.trustManagerAsEmpty() //为空,信任所有证书
.build();
//::打开客户端会话
ClientSession clientSession = SocketD.createClient("sd:tcp://localhost:8602/?u=a&p=2")
.config(c -> c.sslContext(sslContext))
.open();
}
}
- 服务端
public class Demo {
public static void main(String[] args) throws Throwable {
SSLContext sslContext = new SslContextBuilder()
.keyStoreType("JKS")
.keyManager("/data/ssl/jks/keystore.jks", "123456", "123456")
.build();
//::启动服务端
SocketD.createServer("sd:tcp")
.config(c -> c.port(8602).sslContext(sslContext))
.start();
}
}
2、双向认证
- 客户端
public class Demo {
public static void main(String[] args) throws Throwable {
SSLContext sslContext = new SslContextBuilder()
.keyManager("/data/ssl/jks/keystore.jks", "123456", "123456")
.build();
//::打开客户端会话
ClientSession clientSession = SocketD.createClient("sd:tcp://localhost:8602/?u=a&p=2")
.config(c -> c.sslContext(sslContext))
.open();
}
}
- 服务端(注意 sslNeedClientAuth。启用后,客户端必须配置证书)
public class Demo {
public static void main(String[] args) throws Throwable {
SSLContext sslContext = new SslContextBuilder()
.keyManager("/data/ssl/jks/keystore.jks", "123456", "123456")
.trustManager("/data/ssl/jks/trustKeystore.jks", "123456")
.build();
//::启动服务端
SocketD.createServer("sd:tcp")
.config(c -> c.port(8602).sslContext(sslContext).sslNeedClientAuth(true))
.listen(new EventListener().doOn("/hello", (s, m) -> {
}))
.start();
}
}