【问题标题】:Getting Mutual SSL Authentication information with Heroku使用 Heroku 获取相互 SSL 身份验证信息
【发布时间】:2013-03-15 15:05:11
【问题描述】:

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

我有第三方使用证书调用 Heroku(通过 SSL 插件)并且能够得到响应。因此,相互 SSL 握手似乎奏效了。

但是我的应用程序无法确定哪个第三方调用了 Heroku,因为没有要检查的证书信息。我查看了 Heroku 标头,看看 SSL 插件是否提供了其他信息,但找不到任何东西。

有没有办法通过 Heroku 的任何其他方法从相互 sal 握手中获取证书信息?

【问题讨论】:

  • 我已经联系了 Heroku。他们让我知道这根本不可能。也许有人仍然想出了一些解决方案,但我想这不太可能。
  • Heroku 告诉我,如果 ELB 有一个可行的解决方案,他们可能也可以让它工作。

标签: ssl heroku ssl-certificate mutual-authentication


【解决方案1】:

Heroku SSL 是使用 Amazon Elastic Load Balancer (ELB) 实现的,它在 Heroku 的路由网格之前使用您的 SSL 证书提供 SSL 终止。

由于 SSL 已终止且协商的细节未通过,您无法从相互 SSL 握手中获取证书信息。

但是,如果您的目标是使用基于证书的身份验证来对 HTTP 客户端进行身份验证,您可以在应用层构建它。

免责声明:我不是密码学家,在创作任何基于密码的身份验证机制之前,您应该咨询其中的人。

客户端的证书可用于签署您可以验证的令牌。通常,身份验证令牌将包括一些user_idtimestamp 和大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 集成。
  • 我做了更多研究,ELB 的一个选项是将您的 SSL 流量代理到您控制的 SSL 负载均衡器池,这可以实现 SSL 终止和客户端证书验证。这消除了大部分 ELB 值,恕我直言,但允许在 SSL 层前面、应用层前面的公共负载均衡器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
相关资源
最近更新 更多