Склад доверенных сертификатов Exchange на сервере без остановки сервера

Я использую двустороннюю аутентификацию своей реализации сокета клиент-сервер. Код моего сервера, на который я загружаю хранилище ключей и хранилище доверенных сертификатов, выглядит так:

    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 во время сервера?

1 ответ

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

Другие вопросы по тегам