Довелось мне недавно удаленно администрировать старенький сервер с помощью BMC (Baseboard Management Controller - контроллер управления материнской платой) "Megarac SP" от производителя "American Megatrends". Зашел на web-страницу этой BMC (пусть ее адрес будет http://192.168.10.48) и при попытке запустить консоль получил ошибку от Java:
Ну т.е. неподписанному приложению Java требуется неограниченный доступ к нашей операционной системе, но Java категорически запрещает его запускать. Т.о. чтобы мы могли запустить консоль нам надо каким-то образом обновить встроенное в BMC приложение Java, чтобы оно соответствовало требованиям к безопасности Java. Сделать это можно несколькими путями:
- Обновить ПО BMC "Megarac SP" на свежую версию с сайта производителя - для этого нужно быть официальным покупателем у "American Megatrends" и позвонить по предоставленному номеру телефона в США. Я не стал пытаться.
- Обойти ограничение безопасности Java - ниже, собственно, и описываю свои действия...
Итак, чтобы обойти ограничение безопасности Java нам надо неподписанное приложение Java, размещенное в BMC "Megarac SP", заменить нашим - подписанным, и тогда Java милостливо разрешит нам его запустить. Вот только проблем тут много: какой ЭЦП подписывать приложение чтобы Java разрешило его запустить, как разместить новое приложение в BMC "Megarac SP" если мы не знаем пароля производителя, а прав имеющейся по-умолчанию админской учетной записи не хватает на такое действие. И вот что я придумал:
- приложение Java подписать своим собственным "левым" ЭЦП, выпущенным мной самим себе буквально "на коленке";
- подменить web-сервер BMC "Megarac SP" своим, где и разместить мое "левое" приложение Java подписанное моей "левой" ЭЦП.
Помолясь, приступаю:
При попытке запуска консоли из BMC "Megarac SP" на мой компьютер скачивается спецфайлик "jviewer.jnlp", являющийся инструкцией для запуска Java-приложений веб-браузером. Вот часть его содержимого:
Что я вижу в этом файле:
- Все приложения Java берутся из web-сервера http://192.168.10.48:80/Java - его нам и нужно будет подменить своим web-сервером;
- Приложения, которые мне нужны и которые нужно подписать "левой" ЭЦП находятся в каталоге "release". И нужных мне приложений целых три - JViewer.jar, JViewer-SOC.jar, Win32.jar (у меня Windows 10, для Linux там соответственно будет другой .jar)
Собственно, скачиваю нужные мне приложения вот такими ссылками:
http://192.168.10.48/Java/release/JViewer.jar
http://192.168.10.48/Java/release/Win32.jar
http://192.168.10.48/Java/release/JViewer-SOC.jar
Сразу, для своего удобства, создаю каталог c:\1\ в котором и буду размещать все свои "левые" jar-файлы и сертификаты. Туда скидываю скаченные выше jar-файлы:
mkdir c:\1\
Так, теперь мне нужно создать "левую" ЭЦП и подписать ею эти файлы. Для этого мне нужны стандартные утилитки Java: keytool.exe и jarsigner.exe. Утилитка keytool.exe устанавливается вместе с Java и располагается в любом дистрибутиве Java в подкаталоге "bin". Я, для примера, взял дистрибутив jre-8u191-windows-i586.exe, но годится любой подходящий для вашей операционной системы:
А вот с утилиткой jarsigner.exe маленькая проблемка - она входит в спецпакет Java для разработчиков. Скачиваем его с официального сайта производителя, для примера, я взял jdk-8u251-windows-x64.exe, но годится любой подходящий для вашей операционной системы:
Все скачано и установлено с путями по-умолчанию, пора создавать "левую" ЭЦП и сразу разместить ее в моем каталоге c:\1\:
"C:\Program Files (x86)\Java\jre1.8.0_191\bin\keytool" -genkey -alias myLeftKey -keyalg RSA -keystore C:\1\keystore.jks -keysize 2048
Чисто для понимания:
-alias myLeftKey значит собственное имя моего "левого" ключа ЭЦП будет "myLeftKey", по нему я смогу подписать нужный мне файл;
-keyalg RSA значит для шифрования закрытого ключа ЭЦП я использую алгоритм шифрования RSA;
-keystore C:\1\keystore.jks значит контейнер для хранения закрытого и открытого ключа ЭЦП будет располагаться в файле C:\1\keystore.jks;
-keysize 2048 значит длина ключа шифрования будет 2048 символов.
При создании просят придумать отдельный пароль для контейнера(keystore) и отдельный пароль для закрытого ключа(keypass). Я не заморачиваюсь и там и там ставлю "левый" пароль "12345678". Да и все остальные поля заполняю "левыми" данными. Готово! Контейнер c:\1\keystore.jks создан и содержит закрытую и открытую часть моего "левого" ключа ЭЦП. Настало время для подписания скачанных мной ранее jar-файлов. Подписываю их однотипными командами:
"C:\Program Files\Java\jdk1.8.0_251\bin\jarsigner" -keystore c:\1\keystore.jks -storepass 12345678 -keypass 12345678 c:\1\JViewer.jar myLeftKey
"C:\Program Files\Java\jdk1.8.0_251\bin\jarsigner" -keystore c:\1\keystore.jks -storepass 12345678 -keypass 12345678 c:\1\Win32.jar myLeftKey
"C:\Program Files\Java\jdk1.8.0_251\bin\jarsigner" -keystore c:\1\keystore.jks -storepass 12345678 -keypass 12345678 c:\1\JViewer-SOC.jar myLeftKey
Чисто для понимания:
-keystore c:\1\keystore.jks значит что контейнер с ключом ЭЦП находится в файле c:\1\keystore.jks;
-storepass 12345678 сразу подставляю свой пароль контейнера(keystore);
-keypass 12345678 сразу подставляю свой пароль закрытого ключа(keypass);
c:\1\JViewer.jar значит подписывать буду файл "c:\1\JViewer.jar";
myLeftKey значит подписывать буду ключом с собственным именем "myLeftKey"
Готово! Нужные для работы jar-файлы подписаны, лежат по адресу C:\1\ и Java готова их запускать. Теперь надо их как-то подсунуть вместо оригинальных. А для этого нужен свой собственный "левый" web-сервер заместо web-сервера BMC "Megarac SP". Скачиваю web-сервер Nginx вот отсюда:
Я, для примера, взял "nginx-1.24.0.zip", но годится любой другой. Создал каталог "C:\nginx" и просто распаковал туда все содержимое архива. Теперь надо настроить Nginx - начинаем редактировать файл C:\nginx\conf\nginx.conf - после распаковки он у меня находится тут. Мне нужно отредактировать только одну подгруппу "server" и добавить следующие строчки:
location /release/ {alias "c:/1/";autoindex on;}
Вот таким стал мой файл C:\nginx\conf\nginx.conf:
Чисто для понимания:
server_name localhost; значит что имя моего "левого" web-сервера будет "localhost";
location /release/ значит у моего web-сервера будет web-ресурс c именем "release";
alias "c:/1/"; значит ресурс "release" будет располагаться по пути c:\1\;
autoindex on; значит автоматическое индексирование каталогов включено, и если в подкаталоге отсутствует файл index.html то будет отображаться список файлов - то, что мне и нужно!;
Запускаю свой "левый" сервер Nginx:
c:\nginx\nginx.exe
и сразу проверяю его работу в браузере:
http://localhost/release/
Ожидаемый мной ответ - в браузере должно отобразиться содержимое моего каталога C:\1\. Если содержимое отобразилось - продолжаем. Если содержимого нет - значит ошибки в C:\nginx\conf\nginx.conf не дали запуститься Nginx, для анализа читай файл C:\nginx\logs\error.log и исправляй их.
Остались последние штрихи: надо дать понять Java что мои "левые" jar-файлы хорошие и их можно запускать: заходим "Панель управления" - Java - вкладка "Security" - Edit Site List... и добавляем туда наш новый "левый" сайт http://localhost
Теперь надо подсунуть мой "левый" сайт http://localhost заместо оригинального http://192.168.10.48. Это делается легко - открываем тот самый скачанный из BMC "Megarac SP" файл jviewer.jnlp и меняем в нем одну-единственную строчку
codebase="http://192.168.10.48:80/Java" на codebase="http://localhost/"
Получается вот так:
Двойным щелком запускаем файл jviewer.jnlp, на вопли Java отвечаем утвердительно и вуаля - консоль заработала!
Все.