Склад доверенных сертификатов Exchange на сервере без остановки сервера - PullRequest
0 голосов
/ 11 декабря 2018

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

    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();
             ....
         }
   }

Но я бы хотел иногда менять свое право на сервере, но я не остановил бы сервер, когда я делаю это.Как я могу это сделать?Exchange trustore.jks во время сервера?

1 Ответ

0 голосов
/ 11 декабря 2018

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

...