我正在寻找与Heroku建立一个共同的ssl身份验证,其中第三方调用Heroku端点,而Heroku的响应取决于哪个第三方调用Heroku。我需要使用相互的ssl,因为第三方非常注重安全。
我有第三方使用证书调用Heroku(通过SSL插件)并且能够得到回复。因此,相互SSL握手似乎有效。
但是我的应用程序无法确定哪个第三方调用了Heroku,因为没有要检查的证书信息。我查看了Heroku标题,看看是否有SSL添加提供的其他信息,但找不到任何内容。
有没有办法通过Heroku的任何其他方法从相互sal握手中获取证书信息?
答案 0 :(得分:4)
Heroku SSL是使用Amazon Elastic Load Balancers(ELB)实现的,它使用Heroku的路由网格前面的SSL证书提供SSL终止。
由于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