SSL / TLS客户端证书使用RewriteCond和Rewrite Rules进行身份validation,以敏感地redirect未经授权的通信

我终于写在这里,因为我非常努力地对抗apache,SSL / TLS和客户端证书authentication,应该使用证书的序列号来限制访问特定的API调用。

更好地解释一些细节:

用户必须能够访问:

https:// {host} / apiv3xx / s?testing没有任何问题和限制,但对于以下url:

https:// {host} / apiv3xx / x?action = login&user = blablabla为了执行呼叫,需要客户端证书。 我以为实施以下解决scheme:

<Location /apiv3xx> SetEnv api 1 SSLOptions +StdEnvVars -ExportCertData SSLVerifyClient optional SSLVerifyDepth 10 </Location> 

另外还有一些重写规则来控制逻辑:

 RewriteCond %{REQUEST_URI} ^/apiv3xx/ [NC] RewriteCond %{QUERY_STRING} action=log([^&]*)?(?=&|$) [NC,OR] RewriteCond %{QUERY_STRING} action=adm([^&]*)?(?=&|$) [NC,OR] RewriteCond %{QUERY_STRING} action=ctc([^&]*)?(?=&|$) [NC] RewriteCond %{SSL:SSL_CLIENT_M_SERIAL} !(01000000000140AAD72ACCXXXXXX|02000000000140BAD37F1XXXXXXX) RewriteCond %{SSL:SSL_CLIENT_VERIFY} !^SUCCESS$ RewriteRule (.*) - [F,L] 

所以…我的问题现在很简单:我没有收到请求中的任何序列号,并且在逻辑上,条件不满意。

我在网上search了几天,find了一个解决scheme,我发现只有这个旧的文章 (我最终从中扣除了我的解决scheme),但似乎没用。

使用WireSharkloggingSSL会话,然后检查SSL ALERT协议。 这将有助于你理解谈判。 在apache服务器上启用SSLdebugging。 检查Apache服务器是否正在请求客户端重新协商会话并且客户端正在发送证书。 如果需要,您还可以解密会话,如果您有服务器的RSA密钥和证书。

同样在客户端上,您必须使服务器被信任。 否则,客户端将不会发送证书。

另请注意,SSL / TLS协议由于重新协商而被更改。 使用不同协议版本的客户端和服务器不兼容。 请参阅: CVE-2009-3555

您可能需要启用:

 SSLOptions +OptRenegotiate