11

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

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

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

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

4

1 回答 1

7

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

因为 SSL 被终止并且协商的细节没有通过,所以您无法从相互 SSL 握手中获取证书信息。

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

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

客户端的证书可用于签署您可以验证的令牌。通常,身份验证令牌将包括 some user_id、 atimestamp和 large 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
于 2014-01-31T17:36:45.660 回答