我有一个使用mod_ssl的Apache服务器来进行客户端验证的SSL。 Apache显然设置了包含用户证书等的环境变量(请参阅this mod_ssl doc),但我无法从System.getProperty()获取它们。
我在httpd-ssl.conf文件中设置了SSLOptions -StdEnvVars + ExportCertData(这是正确的地方吗?)无济于事。
答案 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评论:我真的不知道答案,但我会列出一些你可以尝试帮助缩小问题的方法(其中一些你可能已经知道了)已经尝试过):
ExportCertData
的文档说的是“其他CGI / SSI环境变量”(与StdEnvVars
控制的“标准集”相对)。文档没有明确说明ExportCertData
完全独立于StdEnvVars
;如果你没有先获得标准集就无法获得这些额外的变量,那就不会让我感到震惊。因此,值得尝试SSLOptions +StdEnvVars +ExportCertData
。 (即使第一次尝试没有解决问题,我建议坚持+StdEnvVars
,直到你有一个做的解决方案,然后只有然后切换到-StdEnvVars
,因为您可以确保可以这样做。)SSLOptions
可以在.htaccess
中使用,因此您可能需要尝试将其放在那里(因为这会绕过httpd-ssl.conf
与httpd.conf
以及诸如此类的问题)。new java.util.ArrayList<String>((System.getenv().keySet()).toString()
将是String
,其中包含您 获取的所有环境变量的(长)列表。可能值得研究它,只是为了看看键可能因某些原因而与您的期望有所不同。 (ArrayList
部分可能是不必要的 - 在我的系统上只有System.getenv().keySet().toString()
有效 - 但JDK文档似乎并不能保证后者。)答案 2 :(得分:1)
使用System.getenv(String)
而不是System.getProperty(String)
来检索环境变量。