java - 使用 Netty 的单向 SSL 身份验证

标签 java ssl netty tls1.2


我正在尝试使用 Netty 构建一个单向身份验证套接字服务器。
首先,我使用 keytool 为服务器和客户端生成 keystore 、自签名证书、信任库,然后在我的服务器/客户端中编写了一些代码,SSL 身份验证工作正常。

这是我的问题:
有什么方法不需要将信任库添加到我的客户端,我只将 keystore 添加到我的服务器,它仍然可以正常工作吗?我认为单向身份验证意味着只有服务器持有证书?

到目前为止,以下是我在服务器/客户端中为添加 SslHandler 所写的内容:
服务器:

private void addSslHandlerOneWay(SocketChannel ch) throws Exception {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    KeyStore ks = KeyStore.getInstance("JKS");
    ks.load(new FileInputStream(new File("svrks.jks")), "kspassword1".toCharArray());
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(ks, "kspassword2".toCharArray());

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    tmf.init(ks);

    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    SSLEngine sslEngine = sslContext.createSSLEngine();
    sslEngine.setUseClientMode(false);
    sslEngine.setNeedClientAuth(false);//one-way
    sslEngine.setEnabledProtocols(sslEngine.getSupportedProtocols());
    sslEngine.setEnabledCipherSuites(sslEngine.getSupportedCipherSuites());
    sslEngine.setEnableSessionCreation(true);

    ch.pipeline().addFirst("SSL", new SslHandler(sslEngine));
}

客户:

private void addSslHandlerOneWay(SocketChannel ch) throws Exception {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    KeyStore ts = KeyStore.getInstance("JKS");
    ts.load(getInputStream("clits.jks"), "tspassword2".toCharArray());
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(ts, "tspassword1".toCharArray());

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    tmf.init(ts);

    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    SSLEngine sslEngine = sslContext.createSSLEngine();
    sslEngine.setUseClientMode(true);//client

    sslEngine.setEnabledProtocols(sslEngine.getSupportedProtocols());
    sslEngine.setEnabledCipherSuites(sslEngine.getSupportedCipherSuites());
    sslEngine.setEnableSessionCreation(true);

    ch.pipeline().addFirst("SSL", new SslHandler(sslEngine));
}

谢谢,伙计们。

最佳答案

I thought one-way authentication means that only server holds the certificate?

服务器需要使用证书对自己进行身份验证。为此,它需要证书和匹配的私钥。
客户端需要验证身份验证,即服务器发送的证书实际上是预期的证书。为此,它需要知道证书本身或颁发证书的 CA - 这在自签名证书的情况下是相同的。

您似乎期望客户端不需要任何关于服务器证书或颁发者 CA 的先前知识。如果是这种情况,那么客户端将只接受任何证书,既可以纠正来自服务器的证书,也可以纠正来自攻击者的伪造证书。在没有先前知识(即本地信任 anchor )的情况下,服务器无法区分正确和伪造的证书。

关于java - 使用 Netty 的单向 SSL 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580636/

相关文章:

java - 在 io.netty.handler.ssl.Sslcontext 中禁用主机名验证

使用 HCL Domino NotesThread 时,Java 关闭钩子(Hook)被忽略(?)

java - 如何将mysql表添加到jar文件中

ssl - Kafka设置SSL是否影响Zookeeper通信

regex - 简单的 IIS 重写

gradle - Apache Spark 和 gRPC

Java 错误 - 错误的源文件 : file does not contain class x . 请删除或确保它出现

java - SharedPreferences.Editor.apply 强制关闭

ssl - Kubernetes:如何在 pod 之间使用 https 通信

google-cloud-firestore - FirestoreException - 找不到 TLS ALPN 提供程序 - 没有工作 netty-tcnative