Да да.. сегодня мы попытаемся подружить яву и питон через SSL. Точнее HTTP сервер у нас будет на питоне клиент на яве. Про детали написания того и другого я умолчу так как их достаточно на просторах интернета. А вот с SSL сертификатами все интереснее. Информацию приходится собирать по разным источникам. Почему? А потому что ява использует собственное хранилище ключей, а питону как-то пофиг на кофейные заморочки. И соответственно те кто пишут про такие темы как правило затрагивают только один язык.
В общем задача сводится к следующему. Нам надо сгенерировать SSL ключ и сертификат и скормить их питоновскому серверу. А сертификат еще и затолкать в ява хранилище ключей. Вообще невкусность этой ситуевины в некоторой неоднозначности. Keytool может создавать ява хранилища прям с сертификатами а питон с ним обращаться не умеет. А OpenSSL не умеет обращаться с ява хранилищами но умеет генерировать ключ/сертификат в виде понимаемом питонскими библиотеками. Ну еще добавляет некоторого разнообразия тот факт что OpenSSL может генерировать любые ключи, а яве надо х509.
Итак запомнив все это приступим. Для начала сгенерируем просто ключ/сертификат для питонского сервера.
Условимся с названиями файлов server509k.pem - ключ server509o.pem - сертификат
Как вы уже поняли я не посмею лишить читателя удовольствия самому погуглить и покурить маны и даю только общие направление и рецепт который заработал для меня.
Ах да.. чуть не забыл. В коце диалога с кейтулом будет важный вопрос доверительный ли сертификат, в моем случае - да.
Trust this certificate? [no]: yes
После этого полученное хранилище можно скормить своему или не очень ява монстрику и он запросто начнет секретничать со змеиным сервером.
З.Ы. только не оставляйте их без присмотра.. а то малоли до чего эти мутанты договорятся.
Не могу не поделится рецептом так как решения "в лоб" я не нашел. Ситуация следующая. В скрипте нужно ненавязчиво проверить установленны ли переменные окружение и если не установлены то установить. При все простоте формулировке задача сложнее чем кажется т.к. например надо учитывать что ряд переменных содержат набор значений. Приветствуйте мой велосипед, он же "деликатный экспорт"
functionsoftexport() { evaltmp_export_val=\$$1 if [[ $tmp_export_val == "" ]] then eval"export $1=$2" else if [ $(expr match $tmp_export_val $2) = 0 ] then eval"export $1=\$$1:$2" fi fi }
вызывать соответственно например так softexport LD_LIBRARY_PATH ${ORACLE_HOME}/lib
З.Ы. пишу скорее как памятку себе потому извините за отсутствие подробностей. Ежеели кому чего не понятно станет спрашивайте - отвечу.
Продолжаю корчить из себя лиспера. Поскольку часто в emacs, в запале страсти программирования путаю раскладку то и решил по быстрому набросать транслитератор(да, я знаю про xneur). Решил сделать его на CL и потом перевести на eLisp. И опять наткнулся на некую неполноценность elisp. Оказалось что коллекции и строки в нем не тоже самое, в отличие от CL. Ниже приведу код на том и на другом. CL мне нравится все больше. И даже loop который по началу показался чудовищным вдруг начинает нравится.
CommonLisp во все красе.
(defvar*latsym*"qwertyuiop[]asdfghjkl;'zxcvbnm,.`/QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~")
(defvar*russym*"йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё")
(defvar*etalon-rus*"йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ№")
(defvar*ignore-syms*",./?:\";'{}[]")
(defun translit (bad-string bad-list good-list)
(let ((goot-string "")
(pos 0))
(loop for letter across bad-string
do (progn
(setf pos (position letter bad-list))
(if (equalp pos nil)
(setf goot-string (concatenate
'string goot-string (string letter)))
(setf goot-string
(concatenate 'string goot-string
(string (elt good-list pos)))))))
goot-string))
(defunfind-in-rus(line)
(loop for letter across line
do (if (equal (position letter *ignore-syms*) nil)
(return (position letter *etalon-rus*)))))
(defunreverse-lang(input-str)
(if (find-in-rus input-str)
(translit input-str *russym* *latsym*)
(translit input-str *latsym* *russym*)))
(format t "~s~%" (reverse-lang '"ghbdtn"))
Поскольку сейчас на досуге ковыряю Common Lisp то заглянув в свой .emacs пришел в легкий ужас от того что было сделано ранее. Ну и поскольку зуд в руках было не унять переделал все немного. Добавил функцию тригерного подсвечивания слов. Т.е. если слово не подсвечено оно подсвечивается по всему тексту. Если подсвечено то подсветка снимается. Удобно. В процессе создания меня ждало несколько обломов и разочарований.
1) Зачем было давать в elisp другие имена функциям имеющим сходное поведение в CL??
2) Не нашел аналога функции position из CL пришлось писать свой велосипед
3) Удаление элемента из списка. В доке по elisp сказано буквально следующее
— Function: delete object sequence
If sequence is a list, this function destructively removes all elements equal to object from sequence. For lists, delete is to delq as member is to memq: it uses equal to compare elements with object, like member; when it finds an element that matches, it cuts the element out just as delq would.
оказалось она ни разу не деструктивная.
В результате получилось следующее. Предыдущий вариант можно посмотреть в более ранних постах.
Есть в java замечательная особенность. ByteBuffer она называется. Например сокеты могут читать/писать только в него. Самое замечательное что логика работы данного буфера весьма не однозначна. Мне он показалсчя больше всего похожим на ленту. Записал на него а чтоб прочитать изволь его перемотать на начало. Ну и вдогонку куча операций с позиционированием разнообразных указателей чтения/записи. Например если попросить считать из сокета немного данных(скажем байт 100) в ByteBuffer размером 1024 байта, а потом преобразуем все это в строку т.к. ожидаем что пришла нам строка. То получим строку длиной 1024. В начале будет то что нам надо а потом мусор какой-то. Из 5и обнаруженных способов преобразовать ByteBuffer в строку корректно отработал только один. С предварительным явным выделением byte[] нужного размера. Мне кажется.. нет я даже уверен что для высокоуровневого языка это явный перебор. В общем несмотря на то что пишу на жабе уже почти 2а года она не перестает меня удивлять. В плохом смысле слова.
Долго ничего не писал. Желания небыло совершенно... Но тут пришла мысль которой просто немогу не поделиться.
Изучая очередной язык программирования, я каждый раз жду что откроется истинна. И что странно что эта мысль пришла мне в голову когда я взялся за лисп.