如何从 SSLContext 检索 keyManager 详细信息?

时间:2021-01-30 14:36:41

标签: java keystore truststore java-security sslcontext

我想从 sslContext 对象中检索属于 keyManager 的 credentialMap

 public static void main(String[] args) throws UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, NoSuchProviderException, KeyManagementException {
        SSLContext sslContext = newServerContext(createKeyManagers());
        // how to get keyManager from sslContext?
    }

public static SSLContext newServerContext(KeyManager[] keyManagers)
            throws NoSuchAlgorithmException, NoSuchProviderException,
            KeyManagementException {
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(keyManagers, null, new SecureRandom());
        return ctx;
    }

public static KeyManager[] createKeyManagers()
            throws KeyStoreException, IOException, NoSuchAlgorithmException,
            CertificateException, UnrecoverableKeyException
    {
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        FileInputStream keyStoreFile = new FileInputStream("F:\\IdeaProjects\\NewFeature\\keystore.jks");
        String keyStorePassword = "changeit";
        keyStore.load(keyStoreFile, keyStorePassword.toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, keyStorePassword.toCharArray());
        return kmf.getKeyManagers();
    }

如何从 ctx(SSLContext) 对象中检索 keyManager 详细信息?

1 个答案:

答案 0 :(得分:1)

似乎无法通过KeyManager的某些方法获取SSLContext数组。为什么不将 KeyManager 数组保存在变量中?

KeyManager[] keyManagers = createKeyManagers();
SSLContext sslContext = newServerContext(keyManagers);

顺便说一下,你为什么要通过KeyManager[]获取SSLContext?你打算怎么办?你打算在哪里使用它? SSLContext 充当安全套接字工厂或 SSLEngines 的工厂。 KeyManager 应该由 SSLServerSocketFactorySSLEngine 在内部使用。