Я использую двустороннюю аутентификацию моей реализации сокета клиент-сервер. Код моего сервера, на котором я загружаю хранилище ключей и хранилище доверенных сертификатов, выглядит так:
private void createSSLServerSocketFactory() {
try {
InputStream keyStoreInputStream = new FileInputStream(KEYSTORE_PATH);
InputStream trustStoreInputStream = new FileInputStream(TRUSTSTORE_PATH);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(keyStoreInputStream, KEYSTORE_PASSWORD.toCharArray());
keyStoreInputStream.close();
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, KEYSTORE_PASSWORD.toCharArray());
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(trustStoreInputStream, TRUSTSTORE_PASSWORD.toCharArray());
trustStoreInputStream.close();
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
factory = sslContext.getServerSocketFactory();
} catch (IOException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
и функция запускается в потоке:
public void run() {
try {
createSSLServerSocketFactory();
SSLServerSocket ss = (SSLServerSocket) factory.createServerSocket(port);
while (true) {
SSLSocket s = (SSLSocket) ss.accept();
s.setNeedClientAuth(true);
SSLSession sslSession = s.getSession();
X509Certificate x509Certificate = sslSession.getPeerCertificateChain()[0];
String username = x509Certificate.getSubjectDN().getName().split("CN = ")[1].split(",")[0];
x509Certificate.checkValidity();
....
}
}
Но я хотел бы иногда менять свой трастор на сервере, но я бы не остановил сервер, когда я это сделаю. Как я могу это сделать? Обменять trustore.jks во время сервера?




Некоторое время назад мы делали нечто подобное с другой целью. Прочтите файл доверенного хранилища при запуске приложения и загрузите значения из доверенного хранилища в карту. Сохраните эту карту в памяти. Вы также должны отметить временную метку этого файла. Теперь вы используете те значения, которые хранятся на карте, для аутентификации. Вам также следует периодически проверять, не изменилась ли временная метка файла хранилища доверенных сертификатов на диске. Если файл был изменен, перезагрузите его на свою карту. У вас может быть поток демона в фоновом режиме, который сделает все это за вас. Надеюсь, это поможет, спасибо.