【问题标题】:Apache + Passenger + Rails and Client certificatesApache + Passenger + Rails 和客户证书
【发布时间】:2015-03-29 17:50:12
【问题描述】:

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

这个 ENV 变量包含我需要的内容:

ENV['SSL_CLIENT_CERT']

但这似乎是在生成乘客进程之后的第一个请求,而不是为每个请求重置。

Passenger 的作者对this thread 的回答似乎证实了 ENV 变量已被冻结并且不会针对每个请求进行重置。

有什么方法可以从 Apache 获取正确的证书数据到 Rails?

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

【问题讨论】:

  • PEM cert data 会随着每个客户请求而改变吗?我认为除非在服务器上进行更改,否则它将保持不变。
  • 我说的是客户端证书,它识别客户端 - 即根据定义必须随每个不同的客户端而变化。目前,Rails 将所有客户端视为第一个连接的客户端。

标签: ruby-on-rails apache ssl passenger


【解决方案1】:

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

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

# 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 并不是真正的安全性,但我选择使用自定义标头名称只是为了最大限度地减少此标头与真实客户端无意发送的任何内容发生冲突的可能性。

【讨论】:

  • 我不认为这里有任何模糊性问题:您删除了某些攻击者可能插入的任何 X-Api-Client-Cert,所以我认为您很好。
猜你喜欢
  • 1970-01-01
  • 2013-06-20
  • 2013-05-25
  • 2015-07-16
  • 2019-07-15
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2013-04-27
相关资源
最近更新 更多