| | |
| | | import org.opends.server.types.DirectoryException; |
| | | import org.opends.server.types.InitializationException; |
| | | |
| | | |
| | | |
| | | /** |
| | | * This class defines a key manager provider that will access keys stored in a |
| | | * file located on the Directory Server filesystem. |
| | |
| | | { |
| | | private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); |
| | | |
| | | |
| | | |
| | | /** The DN of the configuration entry for this key manager provider. */ |
| | | private DN configEntryDN; |
| | | |
| | | /** The PIN needed to access the keystore. */ |
| | | private char[] keyStorePIN; |
| | | |
| | | /** The configuration for this key manager provider. */ |
| | | private FileBasedKeyManagerProviderCfg currentConfig; |
| | | |
| | | /** The PIN needed to access the keystore. */ |
| | | private char[] keyStorePIN; |
| | | /** The path to the key store backing file. */ |
| | | private String keyStoreFile; |
| | | |
| | | /** The key store type to use. */ |
| | | private String keyStoreType; |
| | | |
| | | |
| | | |
| | | /** |
| | | * Creates a new instance of this file-based key manager provider. The |
| | | * <CODE>initializeKeyManagerProvider</CODE> method must be called on the |
| | |
| | | // No implementation is required. |
| | | } |
| | | |
| | | |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void initializeKeyManagerProvider( |
| | | FileBasedKeyManagerProviderCfg configuration) |
| | |
| | | configEntryDN = configuration.dn(); |
| | | configuration.addFileBasedChangeListener(this); |
| | | |
| | | |
| | | // Get the path to the key store file. |
| | | keyStoreFile = configuration.getKeyStoreFile(); |
| | | try { |
| | |
| | | |
| | | private String readPinFromFile(String fileName, File pinFile) throws InitializationException |
| | | { |
| | | BufferedReader br = null; |
| | | try |
| | | try (BufferedReader br = new BufferedReader(new FileReader(pinFile))) |
| | | { |
| | | br = new BufferedReader(new FileReader(pinFile)); |
| | | return br.readLine(); |
| | | } |
| | | catch (IOException ioe) |
| | |
| | | ERR_FILE_KEYMANAGER_PIN_FILE_CANNOT_READ.get(fileName, configEntryDN, getExceptionMessage(ioe)); |
| | | throw new InitializationException(message, ioe); |
| | | } |
| | | finally |
| | | { |
| | | close(br); |
| | | } |
| | | } |
| | | |
| | | /** Performs any finalization that may be necessary for this key manager provider. */ |
| | |
| | | currentConfig.removeFileBasedChangeListener(this); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public boolean containsKeyWithAlias(String alias) { |
| | | KeyStore keyStore; |
| | | |
| | | try { |
| | | keyStore = getKeystore(); |
| | | } catch (DirectoryException e) { |
| | | return false; |
| | | } |
| | | |
| | | try { |
| | | KeyStore keyStore = getKeystore(); |
| | | Enumeration<String> aliases = keyStore.aliases(); |
| | | while (aliases.hasMoreElements()) { |
| | | String theAlias = aliases.nextElement(); |
| | |
| | | return true; |
| | | } |
| | | } |
| | | } catch (KeyStoreException e) { |
| | | } |
| | | catch (DirectoryException | KeyStoreException e) { |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | private KeyStore getKeystore() |
| | | throws DirectoryException { |
| | | KeyStore keyStore; |
| | | private KeyStore getKeystore() throws DirectoryException |
| | | { |
| | | try |
| | | { |
| | | keyStore = KeyStore.getInstance(keyStoreType); |
| | | KeyStore keyStore = KeyStore.getInstance(keyStoreType); |
| | | |
| | | FileInputStream inputStream = |
| | | new FileInputStream(getFileForPath(keyStoreFile)); |
| | | try |
| | | try (FileInputStream inputStream = new FileInputStream(getFileForPath(keyStoreFile))) |
| | | { |
| | | keyStore.load(inputStream, keyStorePIN); |
| | | } |
| | | finally |
| | | { |
| | | close(inputStream); |
| | | } |
| | | return keyStore; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | |
| | | |
| | | LocalizableMessage message = ERR_FILE_KEYMANAGER_CANNOT_LOAD.get( |
| | | keyStoreFile, getExceptionMessage(e)); |
| | | throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), |
| | | message, e); |
| | | throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), message, e); |
| | | } |
| | | return keyStore; |
| | | } |
| | | |
| | | /** |
| | | * Retrieves a set of <CODE>KeyManager</CODE> objects that may be used for |
| | | * interactions requiring access to a key manager. |
| | | * |
| | | * @return A set of <CODE>KeyManager</CODE> objects that may be used for |
| | | * interactions requiring access to a key manager. |
| | | * |
| | | * @throws DirectoryException If a problem occurs while attempting to obtain |
| | | * the set of key managers. |
| | | */ |
| | | @Override |
| | | public KeyManager[] getKeyManagers() throws DirectoryException |
| | | { |
| | |
| | | |
| | | LocalizableMessage message = ERR_FILE_KEYMANAGER_CANNOT_CREATE_FACTORY.get( |
| | | keyStoreFile, getExceptionMessage(e)); |
| | | throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), |
| | | message, e); |
| | | throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), message, e); |
| | | } |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean containsAtLeastOneKey() |
| | | { |
| | | try |
| | | { |
| | | return findOneKeyEntry(getKeystore()); |
| | | } |
| | | } |
| | | catch (Exception e) { |
| | | logger.traceException(e); |
| | | return false; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private boolean findOneKeyEntry(KeyStore keyStore) throws KeyStoreException |
| | |
| | | return false; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isConfigurationAcceptable( |
| | | FileBasedKeyManagerProviderCfg configuration, |
| | |
| | | return isConfigurationChangeAcceptable(configuration, unacceptableReasons); |
| | | } |
| | | |
| | | |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public boolean isConfigurationChangeAcceptable( |
| | | FileBasedKeyManagerProviderCfg configuration, |
| | |
| | | int startSize = unacceptableReasons.size(); |
| | | DN cfgEntryDN = configuration.dn(); |
| | | |
| | | |
| | | // Get the path to the key store file. |
| | | String newKeyStoreFile = configuration.getKeyStoreFile(); |
| | | try |
| | |
| | | private String readPinFromFile(File pinFile, String fileName, DN cfgEntryDN, |
| | | List<LocalizableMessage> unacceptableReasons) |
| | | { |
| | | BufferedReader br = null; |
| | | try |
| | | try (BufferedReader br = new BufferedReader(new FileReader(pinFile))) |
| | | { |
| | | br = new BufferedReader(new FileReader(pinFile)); |
| | | return br.readLine(); |
| | | } |
| | | catch (IOException ioe) |
| | |
| | | ERR_FILE_KEYMANAGER_PIN_FILE_CANNOT_READ.get(fileName, cfgEntryDN, getExceptionMessage(ioe))); |
| | | return null; |
| | | } |
| | | finally |
| | | { |
| | | close(br); |
| | | } |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public ConfigChangeResult applyConfigurationChange( |
| | | FileBasedKeyManagerProviderCfg configuration) |
| | | { |
| | | final ConfigChangeResult ccr = new ConfigChangeResult(); |
| | | |
| | | |
| | | // Get the path to the key store file. |
| | | String newKeyStoreFile = configuration.getKeyStoreFile(); |
| | | try |
| | |
| | | |
| | | private String readPinFromFile(File pinFile, String fileName, ConfigChangeResult ccr) |
| | | { |
| | | BufferedReader br = null; |
| | | try |
| | | try (BufferedReader br = new BufferedReader(new FileReader(pinFile))) |
| | | { |
| | | br = new BufferedReader(new FileReader(pinFile)); |
| | | return br.readLine(); |
| | | } |
| | | catch (IOException ioe) |
| | |
| | | ccr.addMessage(ERR_FILE_KEYMANAGER_PIN_FILE_CANNOT_READ.get(fileName, configEntryDN, getExceptionMessage(ioe))); |
| | | return null; |
| | | } |
| | | finally |
| | | { |
| | | close(br); |
| | | } |
| | | } |
| | | } |