使用Heroku获取双向SSL认证信息

11

我希望建立与Heroku的相互SSL身份验证,其中第三方调用Heroku端点,而Heroku的响应取决于哪个第三方调用了Heroku。由于第三方非常注重安全性,因此需要使用相互SSL。

我已经让第三方使用证书通过SSL附加组件调用Heroku,并能够得到响应。因此,相互SSL握手似乎已经起作用了。

然而,我的应用程序无法确定哪个第三方调用了Heroku,因为没有证书信息可以检查。我查看了Heroku头文件,以查看SSL附加组件是否提供了其他信息,但什么也没找到。

是否有其他方法可以通过相互SSL握手获取证书信息?


我已经联系了Heroku。他们让我知道这根本不可能。也许有人会想出一些解决方案,但我认为这是不太可能的。 - Konstantin Haase
Heroku告诉我,如果有一个使用ELB的有效解决方案,他们可能也能使其正常工作。 - Konstantin Haase
1个回答

7
Heroku SSL是使用Amazon Elastic Load Balancers(ELB)实现的,它们提供SSL终止功能,并将您的SSL证书放置在Heroku路由网格前面。
因为SSL已经终止并且协商的详细信息没有传递,所以您无法从双向SSL握手中获取证书信息。 然而,如果您的目标是使用基于证书的身份验证来认证HTTP客户端,则可以在应用程序层构建该功能。
免责声明:我不是密码学家,在撰写任何基于加密的身份验证机制之前,请咨询专业人员。
客户端的证书可用于签署一个您可以验证的令牌。通常,身份验证令牌会包括一些user_id、一个timestamp和大的nonce。您可以通过HTTP头或HTTP查询参数将其与请求一起传递,提供应用程序级别的身份验证,而不是SSL级别的身份验证。
例如:
# Half-ass ruby-ish pseudocode
def generate_auth_token(user_id, cert_private_key)
  auth_payload = "#{user_id}::#{timestamp}::#{nonce}"
  token = sign(cert_private_key, auth_payload)
end

def authenticate(cert_public_key, token)
  user_id = extract_user_id(token)
  valid_token = validate_signature(token, cert_public_key)

  valid_token ? user_id : nil 
end

def validate_signature(cert_public_key, token)
  # False if signature isn't valid cryptographically based on key
  # False if timestamp isn't recent
  # False if format isn't legit
  # Otherwise true
end

谢谢回复。这基本上也是Heroku所说的。虽然您的方法在服务之间的通信中效果很好,但对于浏览器来说并不适用。我们目前通过ROTP使用双因素身份验证,并正在研究yubikey集成。 - Konstantin Haase
我做了更多的研究,ELB 的一个选项是将您的 SSL 流量代理到一组 SSL 负载均衡器中,您可以控制这些负载均衡器,这些负载均衡器可以实现 SSL 终止和客户端证书验证。在我看来,这消除了大部分 ELB 的价值 - 但允许在 SSL 层前面放置公共负载均衡器,在应用层前面放置一个SSL层。 - Winfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接