2

在我的 JavaFX 客户端应用程序中,我正在实现自己的TrustManager依赖于 Platform TrustManager 的应用程序。

基本上,我总是调用 Platform trustManager,如果连接不受信任,我可以弹出一个警告对话框,询问用户是否要信任证书(就像浏览器一样)。

我面临一个问题,证书指定了多个 URL 以便使用AIA(授权信息访问)检索中间证书,其中一些没有响应。因此,每次checkServerTrusted调用该方法时,响应可能会很长,因为 Java 试图访问无法访问的 URL。当超时发生时,Java 尝试另一个 URL,最后,其中一个终于响应了。

在我的客户端会话期间,我可以缓存checkServerTrusted给定证书的结果chainauthType返回缓存的值,而不是调用TrustManager? 或者这是一个坏主意或不可靠?

4

1 回答 1

1

为了更快地响应,我最终确实在会话期间缓存了链证书。

   //Cache validated certificate's chain during session
    private final Set<UUID> chainCache;

    /*
     * Delegate to the default trust manager.
     */
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        checkTrusted(chain, authType, false);
    }

    /*
     * Delegate to the default trust manager.
     */
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        checkTrusted(chain, authType, true);
    }

     private void checkTrusted(X509Certificate[] chain, String authType, boolean server) throws CertificateException {
        // Internal class but Arrays.hashcode can be used in the same manner
        Digester digester = new Digester();
        //Digester will run through the array
        digester.digest(chain);
        digester.digest(authType);
        digester.digest(server);
        UUID uuid = digester.getUUID();
        //If the chain has been validated, no need top check again.
        if (chainCache.contains(uuid)) {
            return;
        }
       //Do stuff
     }
于 2020-01-17T09:07:32.703 回答