Heroku SSL は Amazon Elastic Load Balancer (ELB) を使用して実装されます。これは、Heroku のルーティング メッシュの前で SSL 証明書を使用して SSL ターミネーションを提供します。
SSL が終了し、ネゴシエーションの詳細が渡されないため、相互 SSL ハンドシェイクから証明書情報を取得する方法はありません。
ただし、証明書ベースの認証を使用して HTTP クライアントを認証することが目標である場合は、それをアプリケーション層に組み込むことができます。
免責事項:私は暗号学者ではありません。暗号ベースの認証メカニズムを作成する前に、暗号学者に相談してください。
クライアントの証明書を使用して、検証可能なトークンに署名できます。通常、認証トークンには some user_id
、 a 、timestamp
および 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