我正在以标准方式创建 SSLContext:
- 获取.p12证书文件,
- 创建 keystore 并将证书加载到其中,
- 创建 KeyManagerFactory,使用 KeyStore 初始化它,并获取 KeyManagers,
- 创建 TrustManagerFactory,用 null 初始化它,并获取 TrustManagers。
- 创建 SSLContext 并使用 KeyManagers 和 TrustManagers 对其进行初始化。
问题是——如何从 SSLContext 中提取 KeyStore 和证书数据?任务是从证书中获取指纹哈希。
是否有可能,或者我必须单独获取它,从文件中读取证书?
最佳答案
如果您有自定义的 TrustManager,就可以做到。可以引用这个link对于那个自定义类。查找私有(private) SavingTrustManager
静态类。
在您使用 java 的默认 TrustManager 的地方,使用此类以便您可以检索服务器发送的证书。
SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(dummyTrustStore);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SavingTrustManager savingTrustManager = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[] { savingTrustManager }, null);
SSLSocketFactory factory = context.getSocketFactory();
并且在你开始握手之后,你可以从静态成员变量 chain
中的 SavingTrustManager 获取证书,比如:
savingTrustManager.chain
关于java - 从 SSLContext 中提取证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40530117/