【问题标题】:How to obtain public key from an SSL connection如何从 SSL 连接获取公钥
【发布时间】:2020-01-21 08:34:36
【问题描述】:

我有一个通过 https 访问的 REST 服务。该服务的参数包括明文密码,这些密码在 TRACE 级别记录出现在日志文件中。为了避免无意中记录这些详细信息,我想在发送之前加密密码,这样做的明显方法(至少对我而言)是使用 https 连接的公钥。

我不想禁用日志记录,因为详细信息有时很有用,而且很容易在不经意间重新启用它。

我正在使用 Spring RestTemplate。

我如何获得公钥?

【问题讨论】:

  • @VaibhavSharma - 我可能遗漏了一些东西,但这看起来像是从基于文件的证书中获取私钥。
  • 密码应该通过 POST 发送。
  • 他们正在通过 POST 发送...

标签: java ssl resttemplate public-key


【解决方案1】:

我解决这个问题的方法是与服务器建立 HttpsURLConnection 连接。

KeyStore keyStore = loadKeystore(keystoreFilename, keystorePassword);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, keystorePassword.toCharArray());

KeyStore trustStore = loadKeystore(truststoreFilename, truststorePassword);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, trustManagers, new java.security.SecureRandom());

URL destinationURL = new URL(origin);
HttpsURLConnection conn = (HttpsURLConnection) destinationURL.openConnection();
conn.setSSLSocketFactory(sslContext.getSocketFactory());
conn.connect();

return conn.getServerCertificates();

private KeyStore loadKeystore(String keyStoreFilename, String keyStorePassword) {
    try {
        final KeyStore trustStore = KeyStore.getInstance("JKS");
        final InputStream is = new FileInputStream(keyStoreFilename);
        trustStore.load(is, keyStorePassword.toCharArray());

        return trustStore;

    } catch (Exception ex) {
        throw new MyException(ex);
    }
}

这将返回一个证书数组,第一个元素是可以从中获取公钥的对等方的证书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 2014-02-16
    • 2014-04-09
    • 2012-01-02
    • 2013-03-05
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多