2013-03-15 12 views
8

Szukam budowania wzajemnego uwierzytelniania SSL z Heroku, gdzie strona trzecia nazywa punkt końcowy Heroku, a odpowiedź od Heroku zależy od tego, która strona trzecia nazywa Heroku. Muszę użyć wspólnego ssl, ponieważ strony trzecie są bardzo świadome bezpieczeństwa.Uzyskiwanie informacji o uwierzytelnianiu SSL z Heroku

Mam osobę trzecią nazywającą Heroku (za pośrednictwem dodatku SSL) z certyfikatem i jestem w stanie uzyskać odpowiedź. Wygląda na to, że wzajemna zgoda SSL okazała się skuteczna.

Jednak moja aplikacja nie jest w stanie określić, która strona trzecia nazwała Heroku, ponieważ nie ma informacji o certyfikacie do zbadania. Przyjrzałem się nagłówkom Heroku, aby sprawdzić, czy dodatkowe informacje są dostarczane przez dodatek SSL, ale nie można znaleźć niczego.

Czy istnieje sposób na uzyskanie informacji o certyfikacie z uzgadniania sal za pośrednictwem dowolnej innej metody dla Heroku?

+0

ja kontaktuje Heroku. Dali mi znać, że to po prostu niemożliwe. Może ktoś nadal ma jakieś rozwiązanie, ale wydaje mi się, że jest to mało prawdopodobne. –

+0

Heroku poinformował mnie, że jeśli istnieje działające rozwiązanie z ELB, prawdopodobnie również może to zadziałać. –

Odpowiedz

4

Heroku SSL jest zaimplementowane przy użyciu Amazon Elastic Load Balancers (ELB), które zapewniają zakończenie SSL za pomocą twojego certyfikatu SSL przed Heroku's Routing Mesh.

Ponieważ protokół SSL jest zakończony, a szczegóły negocjacji nie są przekazywane, nie ma możliwości pobrania informacji o certyfikacie z wzajemnego uzgadniania protokołu SSL.

Jeśli jednak celem jest uwierzytelnianie oparte na certyfikatach w celu uwierzytelnienia klienta HTTP, można to zbudować w warstwie aplikacji.

Oświadczenie: Nie jestem kryptografem i powinieneś skonsultować się z nim przed utworzeniem mechanizmu uwierzytelniania opartego na kryptografii.

Zaświadczenie klienta można wykorzystać do podpisania tokena, który można zweryfikować. Zwykle token uwierzytelniający zawiera około user_id, timestamp i dużą nonce. Możesz przekazać to za pośrednictwem nagłówka HTTP lub parametru zapytania HTTP z żądaniem, zapewniając uwierzytelnianie na poziomie aplikacji, a nie SSL.

Na przykład:

# 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 
+0

Dzięki za odpowiedź. Zasadniczo to samo mówi Heroku. Chociaż twoje podejście dobrze działa z usługą do komunikacji usługowej, nie będzie dobrze działać w przypadku przeglądarek. Obecnie używamy dwu-czynnikowego auth poprzez ROTP i szukamy integracji yubikey. –

+0

Zrobiłem więcej badań i jedną opcją z ELB byłoby pośredniczenie w ruchu SSL do puli równoważących obciążenia SSL, które kontrolujesz, co może zaimplementować zakańczanie SSL i sprawdzanie poprawności po stronie klienta. Eliminuje to znaczną część wartości ELB, imho - ale pozwoliłoby na publiczny system równoważenia obciążenia przed warstwą SSL, przed warstwą aplikacji. – Winfield

Powiązane problemy