Получение приватного SSL-ключа без пароля no comments
Защищать приватный ключ SSL-соединений паролем в большинстве случаев очень хорошая идея, но некоторое ПО (в частности некоторые классы PHP) не всегда нормально воспринимают такие файлы, особенно в формате PEM. Чтобы дать им счастье и умиротворение достаточно с помощью openssl провести пару простых операций импорта-экспорта и получить желаемый файл без паролей:
cat my.crt my.key > my.pem openssl pkcs12 -export -in my.pem -nodes -out my.pfx openssl pkcs12 -in my.pfx -out my-nodes.key -nodes -nocerts
В примере из файлов my.crt и my.key получаем незащищенный файл my-nodes.key. Взято отсюда.
Задание разрешения экрана в VirtualBox no comments
На рабочей системе я держу Kubuntu под VirtualBox в которой провожу основную разработку (привык к bash, да и gvim там как-то симпатичнее). Но вот проблема: разрешение рабочего стола у меня 1280×800, но при запуске виртуальной машины в полный экран при загрузке получаю всего 1024×768. Помогало переключение в оконный режим и возврат в полноэкранный. Но оказалось есть более удачный способ. Нужно зайти в каталог где установлен VirtualBox и запустить команду вида:
VBoxManage setextradata global GUI/MaxGuestResolution 1280,800
где последний параметр — это собственно и есть желаемое разрешение. Работает, сохраняется после выключения и новой загрузки. Такая вот магия командной строки
Отлов ошибок PECL класса HTTPRequest no comments
В модуле pecl_http есть очень удобный, но при этом не всегда хорошо задокументированный класс HTTPRequest. Одной из проблем, с которой я столкнулся при работе с ним, это то, что в случае ошибок при HTTP-соединениях, выбрасывались исключения с текстами:
(HttpInvalidParamException) Empty or too short HTTP message: ''
Понятное дело, для отладки они не подходят. Но, если вывести исключение полностью, то обычно там как-раз и были подробности проблемы:
exception 'HttpInvalidParamException' with message 'Empty or too short HTTP message: ''' in example.php:189 inner exception 'HttpRequestException' with message 'Timeout was reached; Operation timed out after 10000 milliseconds with 0 bytes received (https://example.ru/)' in example.php:160
Видно, что самое важное содержится в сообщении от inner exception. И его, оказывается, легко поймать, если поставить дополнительный блок catch на HTTPException, например:
try {
$request->send();
} catch (HttpException $ex) {
if (isset($ex->innerException)){
echo $ex->innerException->getMessage();
exit;
} else {
echo $ex;
exit;
}
}
Информация получена отсюда.
Unknown SSL protocol error no comments
При запросе из PHP с помощью HTTPRequest к интерфейсу одной серьёзной биллинговой системы получал постоянно ошибку «Unknown SSL protocol error in connection to xxx.xxx.xxx.xxx:443». Быстрый взгляд в гугл подсказал только перебирать параметры, что оказалось вполне верной догадкой: оказывается хост нормальное работал с SSLv2, который не использовался при соединении. Пришлось указать принудительно строкой:
$req->setOptions(array('ssl' => array('version' => SSL_VERSION_SSLv2)));
Потом правда всплыли и другие прелести, вроде отдачи XML в UTF-8 с типом «text/html; charset=ISO-8859-1», но такие шутки находятся быстрее и решаются проще.
Загадка бытия 1 comment
Почему в Eclipse до сих пор не сделали такой банальной вещи как цветовая схема?
Чудны дела no comments
Удивительно, но совсем рядом с теми людьми, кто проводит конференции разработчиков высоконагруженных систем находятся довольно забавные люди. Кто-то сравнивает непонятно что, непонятно с чем, а кто-то, видимо, начитавшись подобного пишет платёжные системы на ASP.NET, сталкивается с проблемами нагрузки и, вместо того чтобы заниматься оптимизацией БД, репликацией, установкой load balancer’а, делает такой финт: ставит несколько серверов, обслуживающих веб-запросы, которые за собой лезут к единой базе. Клиентам предлагает самостоятельно искать, какой-же из серверов сейчас доступен. Но даже, если ты счастливо находишь этот доступный сервер, это не значит, что ты совершишь свою операцию: база то одна на всех, и задержка ответов у неё дикая, и, например, список доступных провайдеров выдать быстро уже не может. Ну хорошо, отвечают они, вот вы действительно не можете получить этот список, так попробуйте увеличить время ожидания ответа. Но, максимальный таймаут прописан уже на их стороне, в обслуживающем веб-сервере и увеличить его никак! Задаюсь теперь вопросом: сколько же должно быть записей, чтобы для их получения и форматирования в SOAP-ответ требовалось более 3 минут? Вопрос почему же нельзя сделать простейший master (read/write) — slave (read) и брать статусы, списки и т.п. со второго сервера, а так-же почему бы не сделать простейший скрипт распределения нагрузки самим уже отпал
Дополнение: В процессе работы выяснился момент, что у ребят в WSDL были указаны неверные адреса сервиса, из-за этого и происходили проблемы с получением списка. Но перебор серверов всё-равно требуется.
PHP и SOAP Message Security no comments
Очередной случай из жизни натолкнул меня на мысль расписать, как из PHP создать подписанный по стандарту SOAP Message Security SOAP-запрос по SSL-соединению. Насколько я понимаю, стандарт этот не единственный, но используется достаточно широко и базируется на различных XML-стандартах W3C.
Сама суть механизма подписи хорошо описана в этой статье, из которой и я почерпнул для себя несколько полезных моментов, на которых возник ступор поначалу. Но предлагаемый мной вариант имеет одно важное дополнение: он добавляет в SOAP-сообщение ещё и информацию о сертификате, с помощью которого была сделана подпись. Кстати, меня удивила логика одной системы, для которой это делалось (кстати, написанной на Microsoft’овских компонентах): помимо сертификата в SSL-соединении они ещё проверяли сертификат и в самом запросе, хотя могли бы и воспользоваться данными HTTPS и тем самым получить ещё дополнительную проверку того, что соединение открыто тем самым агентом, который подписывал запрос.
Основным моментом в подписи является то, что собираются хэши (дайджесты) узлов с данными, которые будут подписаны (при этом узлы приводятся в канонический вид с помощью утилиты xmllint из комплекта libxml2). После чего собранные внутри одной «обёртки» дайджесты подписываются ключом сертификата, тем самым гарантируя, что если подпись верна, то данные в этих узлах не были изменены во время передачи запроса.
Класс так-же переписывает механизм HTTP-запроса к удалённому серверу, т.к. даже с помощью stream_context PHP не позволяет использовать совместно с SOAP сертификаты в формате PKCS12. В итоге используется HTTPRequest, результат которого уже транслируется далее в обработку.
- Собственно сам класс: SignedSoapClient.zip
Ассиметричный ответ no comments
Компания «Доктор Веб» сделала генератор ключей к вирусу Trojan.Winlock.19
Сколько же записей обновилось? 2 comments
Вроде бы простой вопрос, сколько рядов было затронуто SQL-операцией UPDATE, но и здесь притаился подводный камень (о котором, правда честно предупреждают в документации). В MySQL в это число могут не попадать записи, у которых данные не потребовалось изменять. А значит, если REPLACE не подходит, то нужно проводить дополнительные проверки на тему того, сколько же данных вы обновили. Я споткнулся об этом в функции mysql_affected_rows в PHP. Там-же можно найти один из вариантов решения – использовать mysql_info, но в этом случае нужно парсить строку с ответом. Ну а дальше в вариантах SELECT‘ы и т.п.
Совместимость на уровне Microsoft no comments
Имеем: Vista x64 и Outlook 2007. Оба наших друга имеют честные лицензионные ключи из MSDN. Последний причём нужен для единственной цели – синхронизации с КПК (поэтому ставиться отдельно от Офиса). Но, сделав нормальную установку без всяких подвохов получаем сообщение «Microsoft Outlook не был установлен для текущего пользователя». Явно дело нечисто. Начинаю поднимать форумы – в русскоязычной части никакого определённого решения нет (да и не поднимали особо вопрос, хотя видно, что у него уже давняя история). Ставим все обновления к Outlook на всякий случай. Переставляю, меняю права на файлах – одна ерунда. Решение находится странице на второй странице забугорного форума. Нужно скачать программу SetACL – Windows permission management, и с её помощью сбросить права администратора у компонент командой, выполненной от администратора:
setacl -ot reg -on "HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components" -actn setprot -op "dacl:np;sacl:nc" -rec yes
Итог: несовместимость между широко распространёнными продуктами Microsoft побеждается с помощью open source утилиты.