如何从 SSL 连接中获取 public 密钥
How to obtain public key from an SSL connection
我有一个通过 https 访问的 REST 服务。该服务的参数包括明文密码,这些密码在 TRACE 级别的日志记录中出现在日志文件中。为了避免无意中记录这些细节,我想在发送之前加密密码,最明显的方法(至少对我来说)是使用 https 连接的 public 密钥。
我不想禁用日志记录,因为详细信息有时很有用,而且很容易无意中重新启用它。
我正在使用 Spring RestTemplate。
如何获得 public 键?
我解决这个问题的方法是与服务器建立 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);
}
}
这个 returns 证书数组,第一个元素是可以从中获取 public 密钥的对等方证书。
我有一个通过 https 访问的 REST 服务。该服务的参数包括明文密码,这些密码在 TRACE 级别的日志记录中出现在日志文件中。为了避免无意中记录这些细节,我想在发送之前加密密码,最明显的方法(至少对我来说)是使用 https 连接的 public 密钥。
我不想禁用日志记录,因为详细信息有时很有用,而且很容易无意中重新启用它。
我正在使用 Spring RestTemplate。
如何获得 public 键?
我解决这个问题的方法是与服务器建立 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);
}
}
这个 returns 证书数组,第一个元素是可以从中获取 public 密钥的对等方证书。