应用 - 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();
    }
}