11

サードパーティが Heroku エンドポイントを呼び出し、Heroku からの応答が Heroku を呼び出すサードパーティに依存する、Heroku との相互 SSL 認証を構築しようとしています。サードパーティはセキュリティを非常に重視しているため、相互 SSL を使用する必要があります。

証明書を使用して (SSL アドオン経由で) Heroku を呼び出すサード パーティがあり、応答を得ることができます。したがって、相互 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、 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
于 2014-01-31T17:36:45.660 に答える