SSL 目前支持：tcp, ws 协议（udp 暂不支持）。使用SSL时，尽量用域名的形式连接（ws 可能会验证域名）。


关于证书的配置对照关系：


| 参数 | 客户端 | 服务端 |
| -------- | -------- | -------- |
| SSLContext:keyManagers     | 可为 null（不提供客户端证书）     | 不能为 null（必须提供服务器证书）     |
| SSLContext:trustManagers     | 可为 null（使用默认信任库）。可为空（全部信任）     | 可为 null（不验证客户端证书，只支持单向认证）     |
| | | |
| Config:sslNeedClientAuth     | / | 是否强制要求客户端证书（没有证书则连接失败）  |
| Config:sslWantClientAuth     | / | 是否请求客户端证书（但没有证书也允许连接） |

具体由业务情况及证书要求而定。

### 1、单向认证

* 客户端


```java
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();
    }
}
```

* 服务端

```java
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、双向认证

* 客户端


```java
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。启用后，客户端必须配置证书）

```java
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();
    }
}
```