java - 从 SSLContext 中提取证书

标签 java ssl ssl-certificate keystore

我正在以标准方式创建 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/

相关文章:

java - 如何将自定义 SSL 证书验证添加到 osmdroid 的 MapTileDownloader?

ssl - 如何避免 SSL 错误的警告屏幕

java - 读取.txt信息并将其加载到数组中

java - HibernateValidator 如何在 validatedBy 为空时找到 ConstraintValidator?

rest - 公司内部网络上的 SSL SEC_ERROR_UNKNOWN_ISSUER,REST 服务

ssl - 如何为 tibco JMS ssl 配置水槽

linux - 将 SSL 证书和中间体从给定的 https URL 导出到文件

google-chrome - 修改自托管Owin "require SSL"

java - 使用 Apache CXF 的 WS-Security UsernameToken

java - 如何在 Seekbar 上放置箭头作为选择器