2012-06-21 46 views
11

że mam dwie aplikacje Java, że ​​napisałem: Ping.jar i Pong.jar i dostają wdrożonych i pobiegł na dwóch osobnych serwerach (Ping.jar wdraża do srv-01.myorg.com i Pong.jar wdraża do srv-02.myorg.com) i te dwie aplikacje potrzebne do komunikowania się ze sobą (dwukierunkowo) przez SSL. Załóżmy też, że każda aplikacja ma własny certyfikat SSL.weryfikacji certyfikatu SSL w Java

  • Jak mogę, programista Java, kod Ping i Pong aby zweryfikować nawzajem cert SSL? Czy każdy ośrodek CA oferuje pewien rodzaj RESTful API, na który mogę trafić, powiedzmy, HttpClient? Czy Java ma własny interfejs API do weryfikacji certyfikatów? Czy mogę korzystać z JAR-ów lub usług zewnętrznych firm zewnętrznych?

Byłem zaskoczony tym, jak mało się pojawił, gdy szukałem tego w Internecie.

+0

Z jakich serwerów internetowych korzystasz? Włączenie SSL (w twoim przypadku mutual-ssl) jest zwykle przypadkiem konfiguracji serwera, a nie kodowania. – npe

+0

Załóżmy, że oba scenariusze: (1) czysta aplikacja Java korzystająca z surowych gniazd/NIO (jak sugeruje mój przypadek użycia) i (2) Oracle GlassFish. Właściwie teraz interesują mnie oba przypadki użycia. – IAmYourFaja

+0

Ad 1. Nigdy nie próbowałem, to może być piekielnie trudne zadanie od zera. Reklama 2. Sprawdź [ten link] (http://glassfish.java.net/javaee5/security/faq.html), szczególnie dwa pytania dotyczące uwierzytelniania SSL i certyfikatu klienta. Jest w tym znacznie więcej, więc czytajcie doktor Glassfish o bezpieczeństwie, ale tak jak powiedziałem, wszystko zależy od konfiguracji, a nie od kodowania. – npe

Odpowiedz

21

Jeśli łączysz się za pomocą klas Java SE SSL/TLS (np. SSLSocket lub SSLEngine), używasz Java Secure Socket Extension (JSSE).

Zweryfikuje certyfikat podmiotu zewnętrznego zgodnie z SSLContext, który został użyty do utworzenia tego SSLSocket lub SSLEngine.

To SSLContext zostanie zainicjowane za pomocą TrustManager, które określają, jak należy ustanowić zaufanie.

Jeśli nie potrzebujesz konkretnej konfiguracji, możesz często polegać na the default values: będzie to zależało od algorytmu PKIX (RFC 3280) w celu zweryfikowania certyfikatu względem zestawu punktów kontrolnych zaufania (domyślnie w cacerts). cacerts, dostarczany z Oracle JRE to magazyn kluczy JKS, do którego można dodawać dodatkowe certyfikaty. Możesz dodawać certyfikaty jawnie, na przykład za pomocą keytool.

Można również utworzyć programowo X509TrustManager na podstawie niestandardowego magazynu kluczy (jak opisano w this answer) i użyć go w konkretnym SSLContext, który nie ma wpływu na domyślny.

Oprócz tego, jeśli korzystasz z własnego protokołu, musisz sprawdzić, czy uzyskany certyfikat odpowiada nazwie hosta, którego szukasz (patrz dokument RFC 6125). Zazwyczaj można wyszukać alternatywną nazwę podmiotu w otrzymywanym X509Certificate (uzyskać pierwszy certyfikat równorzędny w łańcuchu od SSLSession), w przeciwnym razie wyszukać RDN CN w nazwie wyróżniającej podmiotu.

+1

Możesz być także zainteresowany [this] (http://stackoverflow.com/a/6341566/372643). – Bruno

0

Nie musisz ręcznie sprawdzać swoich certyfikatów.

Musisz tylko zaimportować każdy certyfikat serwera do swoich cacertów, w ten sposób oba serwery aplikacji automatycznie ufają sobie nawzajem.

+0

Co, jeśli oba punkty końcowe kłamią? Podałem ten przykład Ping/Pong, aby zilustrować koncepcję próby zweryfikowania certyfikatu w czystej Javie. Fakt, że napisałem Ping/Pong nie powinien sugerować, że mogą sobie ufać! Myśląc bardziej abstrakcyjnie: jeśli Ping i Pong zostały napisane przez różne sklepy deweloperskie i hostowane w 2 całkowicie oddzielnych sieciach, co by zrobili, aby zweryfikować wzajemne certyfikaty? – IAmYourFaja

+0

Tak, robisz. SSL zapewnia prywatność, integralność i uwierzytelnianie tożsamości rówieśników. To, czy tożsamość rówieśnicza jest tą, której oczekuje aplikacja, i co ta tożsamość może zrobić we wniosku, powinno być sprawdzone przez aplikację, jeśli to konieczne. To jest krok "autoryzacji", a SSL nie może tego zrobić dla ciebie. – EJP

1

Można uzyskać certyfikat rówieśniczej poprzez dołączenie HandshakeCompletedListener do SSLSocket i uzyskanie certyfikatu od przypadku, albo przez coraz SSLSession z SSLSocket i uzyskanie certyfikatu partnerskiego z sesji.

SSL zapewnia prywatność, integralność i uwierzytelnianie tożsamości rówieśników. To, czy tożsamość rówieśnicza jest tą, której oczekuje aplikacja, i co ta tożsamość może zrobić we wniosku, powinno być sprawdzone przez aplikację, jeśli to konieczne. To jest krok "autoryzacji", a SSL nie może tego zrobić dla ciebie.

Powiązane problemy