如何在Java中获取Apache环境变量?

时间:2012-01-04 15:39:18

标签: java apache coldfusion environment-variables

我有一个使用mod_ssl的Apache服务器来进行客户端验证的SSL。 Apache显然设置了包含用户证书等的环境变量(请参阅this mod_ssl doc),但我无法从System.getProperty()获取它们。

我在httpd-ssl.conf文件中设置了SSLOptions -StdEnvVars + ExportCertData(这是正确的地方吗?)无济于事。

3 个答案:

答案 0 :(得分:3)

一位同事发现this web site,其中包含答案。实质上,这需要将环境变量设置为特殊标头。需要两个 set 操作:一个用于初始化为空白并避免伪造,另一个用于检索和设置实际值。为您想要的每个SSL environment variables执行此操作。

   # 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);

答案 1 :(得分:2)

System.getProperty(...)获取系统属性,该属性与环境变量不同。对于环境变量,请使用System.getenv(...)。如that method's Javadoc中所述:

  

系统属性环境变量都是名称和值之间的概念映射。这两种机制都可用于将用户定义的信息传递给Java进程。环境变量具有更全局的效果,因为它们对定义它们的进程的所有后代都是可见的,而不仅仅是直接的Java子进程。它们可以在不同的操作系统上具有微妙的不同语义,例如不区分大小写。由于这些原因,环境变量更可能产生意想不到的副作用。最好尽可能使用系统属性。当需要全局效果时,或者当外部系统接口需要环境变量(例如PATH)时,应使用环境变量。


更新以回应以下OP评论:我真的不知道答案,但我会列出一些你可以尝试帮助缩小问题的方法(其中一些你可能已经知道了)已经尝试过):

  • 请记住在对主配置文件进行任何更改后重新启动Apache,因为它会在启动时处理它们。 (我打赌你已经知道了,但似乎值得一提,以防万一。)
  • ExportCertData的文档说的是“其他CGI / SSI环境变量”(与StdEnvVars控制的“标准集”相对)。文档没有明确说明ExportCertData完全独立于StdEnvVars;如果你没有先获得标准集就无法获得这些额外的变量,那就不会让我感到震惊。因此,值得尝试SSLOptions +StdEnvVars +ExportCertData。 (即使第一次尝试没有解决问题,我建议坚持+StdEnvVars,直到你有一个的解决方案,然后只有然后切换到-StdEnvVars,因为您可以确保可以这样做。)
  • 记录
  • SSLOptions可以在.htaccess中使用,因此您可能需要尝试将其放在那里(因为这会绕过httpd-ssl.confhttpd.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文档似乎并不能保证后者。)

答案 2 :(得分:1)

使用System.getenv(String)而不是System.getProperty(String)来检索环境变量。