tomcat получить все сертификаты доверия

У меня есть небольшое приложение безопасности с сертификатами сервера и клиента, которое работает на Tomcat 7. У каждого клиента есть собственный сертификат.

В веб-приложении мне нужна вкладка со всеми известными псевдонимами доверенных сертификатов, потому что каждый клиент должен сообщать обо всех X минутах. Если клиент не сообщает через X минут, сервер должен пометить этого клиента.

Итак, моя идея заключалась в том, чтобы получить все доверенные сертификаты из файла truststoreFile, который определен в Server.xml Tomcat, потому что я должен знать всех зарегистрированных клиентов/сертификатов.

Моя проблема в том, что я не нахожу API для получения всех сертификатов, которым будет доверять кот.

Кто-нибудь может помочь?


person user3046582    schedule 11.07.2015    source источник


Ответы (1)


Во-первых, вы уверены, что ваше хранилище доверенных сертификатов (всегда) будет содержать клиентские сертификаты? «Официальный» (X.509/PKIX) способ аутентификации клиента, также известный как клиентский сертификат (сертификаты), заключается в том, чтобы центр сертификации (или несколько центров сертификации) выдавал клиентам сертификаты; тогда вашему серверу не нужно доверять сертификатам клиента по отдельности, только ЦС. Такой ЦС может быть общедоступным ЦС, корпоративным ЦС или тем, который вы (или ваша группа/подразделение/что-то еще) запускаете только для своего сервера. Только для самоподписанных клиентских сертификатов необходимо иметь их по отдельности в хранилище доверенных сертификатов сервера.

Во-вторых, код веб-приложения (сервлета) не может получить конфигурацию соединителя, возможно, в качестве функции безопасности, см. Доступ к закрытому ключу SSL из сервлета .

Но если у вас есть все сертификаты в файле хранилища доверенных сертификатов и вы можете найти этот файл (обычно JKS), то:

  • используйте KeyStore.getInstance(String) для получения объекта хранилища ключей правильного типа (JKS)

  • создайте FileInputStream для файла и передайте его ks.load (а затем закройте его; try-resource может сделать это за вас). Если вы не знаете пароль, используйте null, и вы все равно можете получить доступ к сертификатам (но не к закрытым ключам и только для JKS)

  • используйте .aliases(), чтобы получить список всех записей в магазине

  • если в этом файле могут быть и доверенные сертификаты, и закрытые ключи (т. е. это не просто файл хранилища доверенных сертификатов), проверьте каждый псевдоним с помощью .isCertificateEntry(alias)

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

  • Если вы хотите (любое из) полей имени в каждом сертификате, вызовите .getCertificateEntry(alias), приведите к X509Certificate и вызовите .getSubjectX500Principal(), затем .toString() или одну из .getName() перегрузок и проанализируйте или изучите результаты по желанию

Наконец, поскольку вы хотите отслеживать запросы используя каждый сертификат по псевдониму, для каждого запроса получите сертификаты, используемые, как в Прочитайте входящий сертификат в Tomcat, затем найдите конечный сертификат, т.е. chain[0] с .getCertificateAlias(Certificate). Отслеживайте для каждого псевдонима время последнего запроса, и вы сможете определить любые «недостающие».

Javadoc для KeyStore находится по адресу http://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html

person dave_thompson_085    schedule 11.07.2015