我有一个启用了 SSL 并正在请求客户端证书的 Apache HTTP 服务器。
如何设置 Apache 以便仅在用户访问网站的某个部分时请求证书?
示例:
/myapp/ 不应请求证书
/myapp2/ 应请求证书
注意:这些应用程序使用 mod-jk 提供服务
答案1
这里的技巧是您需要在 tomcat 中执行此操作。因为这才是实际处理请求的地方。
由于客户端身份验证基于每个连接器,因此您需要创建 2 个新连接器。一个用于带身份验证的基本 SSL,另一个用于 mod_jk 连接器(所选端口任意选择为 cur+1)。
<!-- Client Auth Connector on port 8444 -->
<!--
<Connector port="8444"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS" />
-->
<!-- Client auth ajp connector on port 8010 -->
<Connector port="8010"
enableLookups="false" redirectPort="8444" debug="0"
protocol="AJP/1.3" />
然后只需设置一个辅助 mod_jk 工作器来连接到 apache 中 /myapp2 的客户端身份验证 SSL
答案2
像这样的事情应该会产生神奇的效果:
<Directory /myapp2>
SSLVerifyClient require
</Directory>
<Directory /myapp>
SSLVerifyClient none
</Directory>
有关 SSLVerifyClient 指令的更多信息这里。
答案3
这可能会有用:http://httpd.apache.org/docs/2.0/ssl/ssl_howto.html#arbitraryclients
如何根据证书对特定 URL 的客户端进行身份验证,但仍允许任意客户端访问服务器的其余部分?
为此,我们再次使用 mod_ssl 的每个目录重新配置功能:httpd.conf
SSLVerifyClient none
SSLCACertificateFile conf/ssl.crt/ca.crt
<Location /secure/area>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>