Как получить переменные окружения Apache в Java? - PullRequest
1 голос
/ 04 января 2012

У меня есть сервер Apache, использующий mod_ssl для проверки подлинности клиента SSL.Apache, очевидно, устанавливает переменные среды (см. этот mod_ssl doc ), которые содержат сертификат пользователя и т. Д., Но я не могу получить их из System.getProperty ().

Я установил SSLOptions -StdEnvVars + ExportCertData в файле httpd-ssl.conf (это правильное место?) Безрезультатно.

Ответы [ 3 ]

3 голосов
/ 09 января 2012

Сотрудник обнаружил этот веб-сайт , в котором содержится ответ.По сути, это требует, чтобы переменные окружения были установлены как специальные заголовки.Необходимы две операции set : одна для инициализации на пустом месте и избежания подделки, а вторая для получения и установки фактического значения.Сделайте это для каждой необходимой вам переменной среды *1005*.

   # initialize to a blank value to avoid http header forgeries
   RequestHeader set SSL_CLIENT_CERT    ""

   # set the actual value
   RequestHeader set SSL_CLIENT_CERT    "%{SSL_CLIENT_CERT}s"

Это сделало значение доступным для нашей страницы ColdFusion.В нашем случае это должно было быть преобразовано в строку Java перед передачей в часть приложения Java.

   clientpem = javacast("string", GetHttpRequestData().Headers.SSL_CLIENT_CERT);
2 голосов
/ 04 января 2012

System.getProperty(...) получает системное свойство, которое не совпадает с переменной среды.Для переменных среды используйте System.getenv(...).Как объяснено в , Javadoc этого метода :

Системные свойства и переменные среды являются концептуально отображениями между именами и значениями.Оба механизма могут использоваться для передачи пользовательской информации процессу Java.Переменные среды имеют более глобальный эффект, потому что они видны всем потомкам процесса, который их определяет, а не только непосредственному подпроцессу Java.Они могут иметь слегка различную семантику, например нечувствительность к регистру, в разных операционных системах.По этим причинам переменные среды с большей вероятностью могут иметь непреднамеренные побочные эффекты.Лучше всего использовать системные свойства, где это возможно.Переменные среды следует использовать, когда требуется глобальный эффект или когда внешнему системному интерфейсу требуется переменная среды (например, PATH).


Обновление вОтвет на комментарий ОП ниже: я действительно не знаю ответа, но я перечислю некоторые вещи, которые вы можете попытаться помочь сузить проблему (некоторые из которых вы, возможно, уже пробовали):

  • Не забудьте перезапустить Apache после любого изменения основных файлов конфигурации, так как он обрабатывает их при запуске.(Держу пари, вы уже знаете это, но, кажется, стоит упомянуть, на всякий случай.)
  • В документации для ExportCertData говорится о "дополнительных переменных среды CGI / SSI" (в отличие от "стандартныхнабор "контролируется StdEnvVars).В документации явно не сказано, что ExportCertData полностью не зависит от StdEnvVars;меня не шокирует, если вы не можете получить эти дополнительные переменные без предварительного набора стандартов.Так что, возможно, стоит попробовать SSLOptions +StdEnvVars +ExportCertData.(Даже если это не решит проблему с первой попытки, я бы рекомендовал придерживаться +StdEnvVars, пока у вас не появится решение, которое работает , и только затем переключается на-StdEnvVars, поскольку вы можете убедиться, что это нормально.)
  • SSLOptions задокументировано для работы в .htaccess, так что вы можете попробовать поместить его туда (поскольку это обходитсявопрос httpd-ssl.conf против httpd.conf и прочее).
  • В документации говорится, что эта конфигурация "предоставляет несколько элементов информации SSL в качестве дополнительных переменных среды в пространство имен SSI и CGI"(выделено мое).Я не уверен, что это означает в контексте вызванной ColdFusion Java;возможно, стоит создать настоящий CGI-скрипт в той же директории и подтвердить, что он не получает эти переменные.
  • Я не знаю много о ColdFusion.Возможно ли, что он как-то распознает эти переменные среды как чувствительные, поэтому не передает их в программу Java?(Или возможно, что он имеет ограничение на длину переменной среды, которую он передает внешней программе?) Возможно, стоит добавить код на странице cfm для проверки этих переменных, просто чтобы увидеть, есть ли разница.
  • Внутри вашего Java-кода new java.util.ArrayList<String>((System.getenv().keySet()).toString() будет String, содержащим (длинный) список всех переменных среды, которые вы получаете .Возможно, стоит изучить его, просто чтобы посмотреть, не выглядят ли клавиши по какой-то причине немного иначе, чем вы ожидаете.(Часть ArrayList, вероятно, не нужна - в моей системе работает только System.getenv().keySet().toString(), но документация JDK, похоже, не гарантирует последнее.)
1 голос
/ 04 января 2012

Используйте System.getenv(String), а не System.getProperty(String), чтобы получить переменные среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...