Ruby on rails Apache+Passenger+Rails和客户端证书
我试图用X.509证书对API用户进行身份验证,我几乎做到了这一点。唯一的问题是如何从Apache到Rails获取证书信息,尤其是PEM证书数据 此ENV变量包含我需要的内容:Ruby on rails Apache+Passenger+Rails和客户端证书,ruby-on-rails,apache,ssl,passenger,Ruby On Rails,Apache,Ssl,Passenger,我试图用X.509证书对API用户进行身份验证,我几乎做到了这一点。唯一的问题是如何从Apache到Rails获取证书信息,尤其是PEM证书数据 此ENV变量包含我需要的内容: ENV['SSL_CLIENT_CERT'] 但这似乎是固定的第一个请求后,产卵乘客进程,而不是重置为每一个请求 《乘客》作者的回答似乎证实了ENV变量被冻结,而不是针对每个请求重置 有没有办法从Apache到Rails获取正确的证书数据 我想我可以使用一些魔法来创建自定义标题,但这并不十分安全,因为恶意客户端也可以设
ENV['SSL_CLIENT_CERT']
但这似乎是固定的第一个请求后,产卵乘客进程,而不是重置为每一个请求
《乘客》作者的回答似乎证实了ENV变量被冻结,而不是针对每个请求重置
有没有办法从Apache到Rails获取正确的证书数据
我想我可以使用一些魔法来创建自定义标题,但这并不十分安全,因为恶意客户端也可以设置该标题。在出现任何其他选项之前,我仍然选择了标题技巧: 确保加载mod_头,然后在虚拟主机配置中:
# 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>
用什么来代替X-Api-Client-Cert并不重要。诚然,这不是真正的安全性,但我选择使用自定义标头名称只是为了最大限度地降低此标头与真实客户端无意发送的任何内容发生冲突的可能性。PEM Cert数据会随着每个客户端请求而更改吗?我认为它将保持不变,除非在服务器上更改。我谈论的是客户机证书,它标识客户机-即根据定义,必须随每个不同的客户机而更改。目前Rails将所有客户端视为第一个连接的客户端。
cert_data = request.headers['X-Api-Client-Cert']