首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netty :如何编写TrustManager

Netty :如何编写TrustManager
EN

Stack Overflow用户
提问于 2012-07-09 13:51:34
回答 1查看 9.7K关注 0票数 7

我已经阅读了大量的东西来设置我的SSL客户机/服务器系统(没有HTTP)。

我的灵感来自安全聊天示例websocket ssl服务器示例。已经使用命令创建了我的cert.jks文件

代码语言:javascript
复制
keytool -genkey -alias app-keysize 2048 -validity 36500
-keyalg RSA -dname "CN=app"
-keypass mysecret-storepass mysecret
-keystore cert.jks

在安全聊天示例中,有以下类:

代码语言:javascript
复制
public class SecureChatTrustManagerFactory extends TrustManagerFactorySpi {

    private static final TrustManager DUMMY_TRUST_MANAGER = new X509TrustManager() {
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }

        @Override
        public void checkClientTrusted(
                X509Certificate[] chain, String authType) throws CertificateException {
            // Always trust - it is an example.
            // You should do something in the real world.
            // You will reach here only if you enabled client certificate auth,
            // as described in SecureChatSslContextFactory.
            System.err.println(
                    "UNKNOWN CLIENT CERTIFICATE: " + chain[0].getSubjectDN());
        }

        @Override
        public void checkServerTrusted(
                X509Certificate[] chain, String authType) throws CertificateException {
            // Always trust - it is an example.
            // You should do something in the real world.
            System.err.println(
                    "UNKNOWN SERVER CERTIFICATE: " + chain[0].getSubjectDN());
        }
    };

    public static TrustManager[] getTrustManagers() {
        return new TrustManager[] { DUMMY_TRUST_MANAGER };
    }

    @Override
    protected TrustManager[] engineGetTrustManagers() {
        return getTrustManagers();
    }

    @Override
    protected void engineInit(KeyStore keystore) throws KeyStoreException {
        // Unused
    }

    @Override
    protected void engineInit(ManagerFactoryParameters managerFactoryParameters)
            throws InvalidAlgorithmParameterException {
        // Unused
    }
}

如何正确地实现这个类?

在这个代码中(在SecureChatSslContextFactory类中):

代码语言:javascript
复制
    SSLContext serverContext = null;
    SSLContext clientContext = null;
    try {
        KeyStore ks = KeyStore.getInstance("JKS");
        ks.load(SecureChatKeyStore.asInputStream(),
                SecureChatKeyStore.getKeyStorePassword());

        // Set up key manager factory to use our key store
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(algorithm);
        kmf.init(ks, SecureChatKeyStore.getCertificatePassword());

        // Initialize the SSLContext to work with our key managers.
        serverContext = SSLContext.getInstance(PROTOCOL);
        serverContext.init(kmf.getKeyManagers(), null, null);
    } catch (Exception e) {
        throw new Error(
                "Failed to initialize the server-side SSLContext", e);
    }

    try {
        clientContext = SSLContext.getInstance(PROTOCOL);
        clientContext.init(null, SecureChatTrustManagerFactory.getTrustManagers(), null);
    } catch (Exception e) {
        throw new Error(
                "Failed to initialize the client-side SSLContext", e);
    }

为什么他们把null而不是tmf.getTrustManagers()放在serverContext.init(kmf.getKeyManagers(), null, null);行里呢?

EN

回答 1

Stack Overflow用户

发布于 2012-07-09 15:03:40

如何正确地实现这个类?

您需要定义一种方式来检查您是否以某种方式信任chain[0]上的证书。如果你不这样做,抛出一个CertificateException。(在这里,SecureChatTrustManagerFactory从不抛出任何东西,因此它绕过验证,从而使连接对MITM攻击开放。)

如果您想要半手动地进行此验证,则可以使用Java (尽管是这可能会有点乏味 ),即使在相对简单的用例上也是如此。

一般来说,正确的做法是不要实施自己的计划。让TrustManagerFactory来完成这一任务(与KeyManagerFactory的方式大致相同)。顺便说一句,在这两种情况下,我都建议使用Key/TrustManagerFactory.getDefaultAlgorithm()作为algorithm的值,除非您有充分的理由不这样做。它至少是一个比SunX509更好的默认值,我在很多情况下都看到了它的硬编码(实际上它不是默认的TMF算法值)。

您可以从您自己的信任库初始化一个TMF (例如,您可以为这个连接专门加载一个KeyStore实例)。

为什么他们在行serverContext.init(kmf.getKeyManagers(),null,null )中放置null而不是serverContext.init()?

信任管理器的nullSecureRandomnull返回到默认值。这将是使用默认的TMF算法(通常是PKIX)初始化的默认信任管理器,使用默认的信任存储(使用javax.net.ssl.trustStore中的位置,或者返回到jssecacerts文件或cacerts)。JSSE参考指南中的更多细节。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11396412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档