是否可以为 X509TrustManager 缓存 checkServerTrusted 结果?
Can checkServerTrusted result be cached for X509TrustManager?
在我的 JavaFX 客户端应用程序中,我正在实现我自己的 TrustManager
,它依赖于 Platform TrustManager。
基本上,我总是调用平台 trustManager,如果连接不受信任,我可以弹出一个警告对话框,询问用户是否要信任证书(就像浏览器一样) .
我遇到一个问题,证书指定了几个 URL 以便使用 AIA(授权信息访问)检索中间证书,其中一些是未响应。
因此,每次调用 checkServerTrusted
方法时,响应可能会很长,因为 Java 试图到达无法到达的 URL。当超时发生时,Java 尝试另一个 URL,最后,其中一个终于响应。
在我的客户端会话期间,如果证书 chain
和 authType
以及 return 缓存值,我可以缓存 checkServerTrusted
的结果而不是调用 TrustManager
?或者这是个坏主意或不可靠?
为了更快地响应,我最终确实在会话期间缓存了链证书。
//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
}
在我的 JavaFX 客户端应用程序中,我正在实现我自己的 TrustManager
,它依赖于 Platform TrustManager。
基本上,我总是调用平台 trustManager,如果连接不受信任,我可以弹出一个警告对话框,询问用户是否要信任证书(就像浏览器一样) .
我遇到一个问题,证书指定了几个 URL 以便使用 AIA(授权信息访问)检索中间证书,其中一些是未响应。
因此,每次调用 checkServerTrusted
方法时,响应可能会很长,因为 Java 试图到达无法到达的 URL。当超时发生时,Java 尝试另一个 URL,最后,其中一个终于响应。
在我的客户端会话期间,如果证书 chain
和 authType
以及 return 缓存值,我可以缓存 checkServerTrusted
的结果而不是调用 TrustManager
?或者这是个坏主意或不可靠?
为了更快地响应,我最终确实在会话期间缓存了链证书。
//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
}