Как подписать нестандартного провайдера безопасности JCE

Провайдеру безопасности Sun PKCS11 JCE не хватает необходимой нам функциональности.
Поэтому я написал расширенную версию, используя оригинальные источники.

К сожалению, инфраструктура JCE отвергает нового провайдера
"JCE не может аутентифицировать провайдера"
потому что он не подписан должным образом.

javax.crypto.JceSecurity.verifyProviderJar(...) броски.
(это вызывает javax.crypto.JarVerifier.verify())

Любые предложения, как подписать нового провайдера, чтобы он работал с JCE?

5 ответов

Решение

Процесс описан в документе "Как реализовать провайдера".

Это включает отправку по электронной почте Sun Oracle некоторой информации (включая CSR, сгенерированную вами для вашего ключа подписи), а затем отправку по факсу подтверждающего документа. Возвращение подписанного сертификата может занять неделю или более, поэтому планируйте заранее.

Вам нужно только подписать своего провайдера, если он предоставляет услуги, которые ограничены некоторыми (репрессивными) правительствами. Например, Cipher реализация является ограниченной "службой", в то время как MessageDigest это неограниченный сервис. С сообщением, которое вы получаете, я предполагаю, что вы пытаетесь предоставить ограниченные услуги.

Если вы предоставляете какую-либо из этих услуг, вы не можете обойти это: вам нужен сертификат для подписи кода, выданный Sun. (Один из IBM может работать тоже; если я правильно помню, их CA подписи кода поддерживается, но я ничего не знаю о процессе их выпуска.)

Альтернативой является разработка вашего собственного провайдера с использованием OpenJDK. Это проект с открытым исходным кодом, спонсируемый Sun/Oracle, и предоставляет базу кода для их официального выпуска. OpenJDK не требует подписчиков. OpenJDK доступен (по умолчанию, сейчас) в нескольких дистрибутивах Linux. К сожалению, он не доступен в Windows или Macintosh. Если вы используете Windows или Macintosh, я рекомендую установить Linux на виртуальную машину.

Однако если вам необходимо разрабатывать на Windows или Mac, вы можете скопировать файл jce.jar из установки OpenJDK поверх jce.jar (в вашем каталоге lib lib) официальной установки. Это эффективно обойдет процесс аутентификации Jar. Обязательно верните оригинальный файл jce.jar, когда закончите разработку.

Вы должны подписать JAR с помощью "JCE Code Signing CA". Во всех современных дистрибутивах Java только 2 CA (Sun и IBM) являются встроенными (жестко запрограммированными), и нет никакого способа добавить свой собственный. Мы пытались работать с Sun, чтобы подписать нашего провайдера, и это почти невозможно. Они не будут выдавать промежуточный сертификат CA, а это означает, что вам придется проходить проверку каждый раз, когда вы вносите изменения.

Почему бы вам просто не использовать свою собственную библиотеку? Вы используете стандартный API для взаимодействия между различными JCE. Но сейчас это нереально для CryptoKi/SmartCard, вам почти всегда нужно написать собственный код для взаимодействия с API конкретного производителя. Вы даже можете сделать свой код имитирующим JCE API, чтобы минимизировать изменения кода.

Только для дополнительной информации, я получил это же исключение, когда я собираю JAR (Eclipse Juno) с опцией "Извлечь необходимые библиотеки в сгенерированный JAR" вместо правильного "Пакет необходимых библиотек в сгенерированный JAR"

Что ж, после прочтения о рукопожатии с некоторыми полномочиями Oracle, мое решение пишет независимый класс Cipher с собственной проверкой подписи, который в случае других поставщиков, кроме "меня", делегирует javax.crypto.Cipher.

Это кажется обязательным, поскольку во всех выпусках Java почти нет алгоритма, а также ограничения силы некоторых алгоритмов не удовлетворяют, и, по сути, Oracle не нужно знать о моих алгоритмах шифрования.

Другие вопросы по тегам