Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从SSLContext中提取证书_Java_Ssl_Ssl Certificate_Keystore - Fatal编程技术网

Java 从SSLContext中提取证书

Java 从SSLContext中提取证书,java,ssl,ssl-certificate,keystore,Java,Ssl,Ssl Certificate,Keystore,我正在以标准方式创建SSLContext: 获取.p12证书文件 创建密钥库并将证书加载到其中 创建KeyManagerFactory,使用KeyStore初始化它,并获取KeyManagers 创建TrustManagerFactory,使用null初始化它,然后获取TrustManager 创建SSLContext并使用KeyManager和TrustManager初始化它 问题是-如何从SSLContext提取密钥库和证书数据?任务是从证书获取指纹哈希 是否可能,或者我必须单独获取,从

我正在以标准方式创建SSLContext:

  • 获取.p12证书文件
  • 创建密钥库并将证书加载到其中
  • 创建KeyManagerFactory,使用KeyStore初始化它,并获取KeyManagers
  • 创建TrustManagerFactory,使用null初始化它,然后获取TrustManager
  • 创建SSLContext并使用KeyManager和TrustManager初始化它
问题是-如何从SSLContext提取密钥库和证书数据?任务是从证书获取指纹哈希


是否可能,或者我必须单独获取,从文件中读取证书?

如果您有自定义TrustManager,则可以这样做。对于该自定义类,您可以参考此。查找private
SavingTrustManager
static类

在您使用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();
并且在开始握手后,您可以从静态成员变量
从SavingTrustManager获取证书,如:

savingTrustManager.chain


如果您有密钥库,那么您可以获得如下证书
certificate cert=KeyStore.getCertificate(别名),但在使用该证书之前,您必须知道该证书的别名(名称)。然后获取指纹也很容易
org.apache.commons.codec.binary.Hex.encodehextString(cert.getFingerprint())所以要获取证书信息,我必须建立连接?嗯,不是我想做的,不过还是谢谢你。