Использование более одной пары ключей в SSL Socket Factory Connection - PullRequest
0 голосов
/ 07 февраля 2012

Я использую пару ключей и думаю о возможности использовать более одного закрытого ключа для создания фабрики сокетов SSL.

Так что я смогу поделиться разными открытыми ключами и пожать руку
динамически базируется в хранилище открытых ключей для клиентов

Ниже приведен исходный код, объясняющий, как я создаю это соединение. SSL

...
  ...log("Activating an SSL connection");
  System.setProperty("javax.net.ssl.keyStore", "myPrivateKey");
  System.setProperty("javax.net.ssl.keyStorePassword", "myPass");

  // SSL Server Socket Factory
  SSLServerSocketFactory sslSrvFact = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
  objServerSocket = sslSrvFact.createServerSocket(iPort);
  log("SSL connection actived");
...

Это возможно или мечта?

Thx

1 Ответ

3 голосов
/ 07 февраля 2012

Вы можете сделать это, создав собственный SSLContext, используя собственный X509KeyManager, и выберите хранилище ключей alias, используя метод chooseClientAlias (или chooseServerAlias, в зависимости от стороны) .

Что-то вроде этого должно работать:

// Load the key store: change store type if needed
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream fis = new FileInputStream("/path/to/keystore");
try {
    ks.load(fis, keystorePassword);
} finally {
    if (fis != null) { fis.close(); }
}

// Get the default Key Manager
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
   KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, keyPassword);

final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0];
X509KeyManager km = new X509KeyManager() {
    public String chooseClientAlias(String[] keyType, 
                                    Principal[] issuers, Socket socket) {
        // Implement your alias selection, possibly based on the socket
        // and the remote IP address, for example.
    }

    // Delegate the other methods to origKm.
}

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(new KeyManager[] { km }, null, null);

SSLSocketFactory sslSocketFactory = sslContext.getSSLSocketFactory();

(здесь есть короткий пример , который может помочь вам начать работу.)

На самом деле вам не нужно делегировать исходный KeyManager (я просто нахожу это более удобным). Вы могли бы очень хорошо реализовать все его методы для возврата ключей и сертификатов, используя загруженный вами KeyStore

Обратите внимание, что это в основном полезно для выбора клиента-сертификата. Java не поддерживает индикацию имени сервера (SNI) на стороне сервера (насколько я знаю, даже в Java 7), поэтому вы не сможете узнать, какое имя хоста запрашивает клиент, прежде чем выбрать псевдоним (из с точки зрения сервера).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...