Мы пытаемся установить новый сертификат, выданный правительством, но он не работает.
Код работает на сервере Java EE, который считывает сертификат и извлекает открытый ключ.
//ks is Keystore
ks.load(new FileInputStream("/tmp/cert.pfx"), "password".toCharArray());
С загрузкой сертификата все в порядке. Если мы посмотрим на ks.size(), он вернет 1.
Если мы перечислим псевдонимы, мы также сможем увидеть значение псевдонима.
Enumeration<?> en = ks.aliases();
String alias = (String)en.nextElement();
Однако, если мы извлечем сертификат с использованием псевдонима, мы получим обратно ноль.
X509Certificate x509cert = ((X509Certificate)ks.getCertificate(alias));
x509cert на данный момент равен нулю.
Еще несколько моментов:
Это сертификат государственного образца. Если мы изменим псевдоним на значение открытого текста с помощью openssl, он будет работать нормально. Исходное значение - GUID.
Если мы проведем тестирование с помощью тестовой программы на локальном ПК с использованием Java SE, исходный сертификат работает - мы можем извлечь открытый ключ из сертификата, используя псевдоним.
Прошлые сертификаты работали нормально. Мы перешли на новый сертификат только потому, что срок действия старого сертификата истек.
Новый сертификат не работает только в среде Java EE. Поэтому я рассматриваю это как комбинацию чего-то в сертификате и среды, в которой он работает.
Есть идеи, что может быть не так, или способ решить эту проблему?
Установите флажок эта статья, чтобы правильно сгенерировать ключ сертификата.
@KhaledLela Очевидно, он использовал OpenSSL, а не keytool; и не используйте форматирование кода для текста, не являющегося кодом.
NB ks.load() загружает все хранилище ключей, включая все сертификаты и закрытые ключи, если они есть, а не только открытый ключ.
иногда некоторые p12 плохо читаются. Я предлагаю вам создать новое хранилище ключей, экспортировать и импортировать сертификат с помощью OpenSSL или KeystoreExplorer. Если не работает, попробуйте использовать Bouncycastle и указав здесь провайдера KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
Спасибо всем за отзывы. В псевдониме было несколько непечатаемых символов. Мы снова использовали openssl для сборки сертификата, и он сработал.




Непечатаемый символ в псевдониме?