Есть ли практический способ определить, какие крипто-провайдеры JCE используются?
Мы настроили продукт Java на использование только проверенных FIPS криптографических провайдеров RSA JCE. Однако продукт не будет работать, если в java.security указаны только библиотеки RSA. Поэтому что-то запрашивает не-FIPS алгоритмы у другого провайдера.
По процессу исключения мы можем сказать, какие jar-файлы необходимы для успешной работы, но это не говорит нам, какие алгоритмы запрашиваются или кем.
Это кажется часто задаваемым вопросом, но, очевидно, мы не наткнулись на правильную документацию или строку поиска Google: есть ли надежный, удобный и последовательный механизм, позволяющий определить, какие поставщики JCE используются в работающем экземпляре JVM?
5 ответов
Ну, вы можете перечислить поставщиков с помощью Security.getProviders ();
Вот пример, перечисляющий поставщиков и алгоритмы, которые они реализуют.
Чтобы дополнить ответ @Bruno, вы можете использовать jshell и ввести
java.security.Security.getProviders();
Вот пример того, как это сделать с помощью Docker
$ echo "java.security.Security.getProviders();" | docker run -i --rm amazoncorretto:17 jshell
May 11, 2022 10:29:57 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
| Welcome to JShell -- Version 17.0.3
| For an introduction type: /help intro
jshell> java.security.Security.getProviders()$1 ==> Provider[12] {
SUN version 17,
SunRsaSign version 17,
SunEC version 17,
SunJSSE version 17,
SunJCE version 17,
SunJGSS version 17,
SunSASL version 17,
XMLDSig version 17,
SunPCSC version 17,
JdkLDAP version 17,
JdkSASL version 17,
SunPKCS11 version 17 }
jshell>
Как сказал Бруно, вы можете перебирать всех провайдеров.
Во время выполнения вы можете проверить, какой провайдер использует ваш шифр, с помощью метода getProvider.
Я предложу реализовать свой собственный ClassLoader и запишу в нем отладочную информацию.
Хотя я не уверен, что это даст вам знать о каждом классе, который загружает FooJCEProvider, а не только о первом классе, который загружает FooJCEProvider.
Или вы пытались использовать jconsole? "MBean загрузки классов также имеет атрибут Verbose, который можно установить для включения или отключения подробной трассировки загрузки классов"
Есть ли System.setProperty("javax.net.debug","all")
дать вам что-нибудь полезное?