Socket.D v2.5.20

应用 - SSL

</> markdown

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