Apache + Passenger + Rails和客户端证书

时间:2015-03-29 17:50:13

标签: ruby-on-rails apache ssl passenger

我正在尝试使用X.509证书对API用户进行身份验证,而且我几乎在一起。唯一的问题是如何从Apache到Rails获取证书信息(尤其是 PEM证书数据)。

这个ENV变量包含我需要的东西:

ENV['SSL_CLIENT_CERT']

但是,在产生Passenger流程后,这似乎固定在第一个请求上,而不是针对每个请求重置。

Passenger的作者对this thread的回答似乎确认ENV变量已冻结,并且不会为每个请求重置。

有没有办法从Apache到Rails获取正确的证书数据?

我认为我可以使用一些魔法来创建自定义标头,但这不太安全,因为恶意客户端也可以设置它。

1 个答案:

答案 0 :(得分:0)

在任何其他选项出现之前,我仍然选择了标题技巧:

确保已加载mod_headers,然后在虚拟主机中加载:

# Ensure that client can not pass certificate header
RequestHeader unset X-Api-Client-Cert
# Require client cert for API
<Location /api>
    SSLVerifyClient require
    SSLOptions +ExportCertData
    # Now export CertData via header
    RequestHeader set X-Api-Client-Cert "%{SSL_CLIENT_CERT}s"
</Location>

然后,在Rails代码中使用:

cert_data = request.headers['X-Api-Client-Cert']

使用什么作为标题名称来代替X-Api-Client-Cert并不重要。诚然,security through obscurity并不是真正的安全性,但我选择使用自定义标题名称,以最大限度地减少此标题与真实客户端无意图发送的任何内容发生冲突的可能性。