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