java-crypto-workaround/

На этих выходных я решил, что что-то больно давно не ставил апдейтов. Ну и решил поставить. Помимо прочего apt-get закачал новую версию JVM. Что интересно, непосредственная установка происходит где-то в недрах пакета oracle-java8-installer, в postinst или вроде того. Поэтому apt-get неправильно определяет объем трафика, необходимый для скачивания апдейтов. Однако поведать я хотел не об этом.

Вроде все прошло гладко. Браузер работает, Skype запускается — на этот раз обошлось без инцидентов. Но в понедельник, придя на работу, я обнаружил, что проект перестал собираться. Кто-то накоммитил без запуска тестов? Я, наверное, минут двадцать курил стектрейсы, пока не понял, в чем же дело.

А дело оказалось в том, что когда-то я потчил установленную JVM, но уже забыл об этом. Кому может прийти в голову патчить JVM? Не смотрите на меня — это у Oracle такие приходы. Вы наверняка слушали об ограничениях на экспорт криптографического ПО в США. Я не особо знаком с деталями этих ограничений, но суть в том, что под JVM вы не можете так просто взять и использовать AES с длиной ключа 256 бит. Использовать 128 бит можно, а 256 — нельзя. Чтобы стало можно, требуется сходить по ссылке , найти там что-то типа «Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE» для вашей версии JVM, скачать и распаковать пакет, а затем пропатчить свою JVM:

export TOPATH = / usr / lib / jvm / java- 8 -oracle / jre / lib / security
sudo cp $TOPATH / local_policy.jar $TOPATH / local_policy.jar.bak
sudo cp $TOPATH / US_export_policy.jar $TOPATH / US_export_policy.jar.bak
sudo cp local_policy.jar $TOPATH / local_policy.jar
sudo cp US_export_policy.jar $TOPATH / US_export_policy.jar

Ну и, конечно же, после очередного обновления все снова сломается.

Можно ли как-то решить эту проблему раз и навсегда? Можно запретить обновлять JVM, но тогда вы останетесь без багфиксов . Можно использовать в своем проекте длины ключей, доступные по умолчанию. Но это (1) менее секьюрно , а также (2) не поможет решить проблемы со сторонними приложениями.

Как по мне, вместо того, чтобы усложнять язык лямбдами и прочей ерундой, лучше бы Oracle сосредоточился на оптимизации ВМ, исправлении багов и решении давно известных проблем вроде этой. Почему я могу спокойно патчить JVM, забив на законы какой-то там далекой страны, но при этом не могу сразу устанавливать пропатченную версию ВМ? Да, и уметь отображать иконки в трее в третьем-то тысячелетии было бы здорово.

А сталкивались ли вы с описанной проблемой и если да, то как ее решали?

EnglishRussianUkrainian