Este - arhivă

Implementarea tunelului HTTPS cu JSSE

Creați un soclu personalizat pentru tunelizarea aplicațiilor HTTPS în aplicațiile Java Secure Socket Extension.

Biblioteca Java Secure Socket Extension (JSSE), creat de Sun Addiction vă oferă acces la un server securizat, Web-din afara firewall-ului printr-un proxy-tonnellirovaniya.Pri această JSSE așteaptă un răspuns de la proxy la cererea de trecere pentru a începe cu „HTTP 1.0“ ; în caz contrar, trimite un IOException. Dacă proxy-ul dvs. nu răspunde corect, trebuie să implementați propriul protocolul de tunel proxy. În acest articol, veți afla cum să deschideți SSLSocket care trece printr-un proxy și îl utilizați cu API-uri URLConnection pentru a comunica cu servere Web securizate din afara firewall-ului. Și astfel, Java Secure Socket Extension (JSSE) oferă acces la server, dar pentru a face acest lucru, JSSE-cerere trebuie sistemul svoysva https.ProxyHost și https.ProxyPort. Codul de tunel din JSSE caută "HTTP 1.0" în răspunsul primit de la proxy. Dacă proxy-ul dvs., ca multe altele, returnează "HTTP 1.1", veți primi o IOException. În acest caz, va trebui să implementați propriul protocol HTTPS tunelat. Voi arăta cum să creați un Secure Sockets Layer, este capabil să treacă prin firewall, și îl transmite handler HTTPS-flux pentru a deschide o adresă URL HTTPS utilizând clasa URLConnection.

Cum se deschide un soclu tunel la un proxy

Primul lucru pe care trebuie să-l faceți atunci când creați soclul securizat este deschiderea socketului tunelului la portul proxy. Codul pentru această procedură plictisitoare poate fi găsit în exemplul SSLClientSocketWithTunneling.java. care este pus în pachet atunci când JSSE este primit. Mai întâi, creați un soclu normal care vă conectează la portul proxy din gazda acestui proxy (linia 65). Apoi, socket-ul în sine este creat, care este trecut la metoda doTunnelHandshake (). în care se numește protocolul tunel al proxy-ului nostru:

În doTunnelHandshake (). Comanda http "CONNECT" este trimisă proxy-ului, cu numele site-ului protejat și numărul portului ca parametri (linia 161). În codul original al tunelului de pe linia 206 din JSSE, codul verifică apoi prezența "HTTP / 1.0 200" în răspunsul primit de la proxy. Dacă proxy-ul companiei dvs. conține în răspunsul "HTTP 1.1", IOException scade. Pentru a rezolva acest lucru, în cazul nostru, codul va arăta în răspunsul din proxy-ul "200 Connection Established", care va însemna construirea cu succes a tunelului (linia 206). Puteți modifica codul astfel încât să verifice prezența parametrului de care aveți nevoie în răspunsul din proxy.

Mascați soclul tunelului sub o priză SSL

După ce ați creat cu succes o priză de tunel, îl mascați sub un soclu SSL. Și aici, totul este extrem de simplu:

Înainte de aceasta, codul numit metoda getDefault () din SSLSocketFactory. pentru a obține o instanță de SSLSocketFactory (linia 54). Apoi înaintează soclul tunelului creat în pasul anterior la metoda createSocket () a acestui SSLSocketFactory. Metoda createSocket () returnează SSLSocket. conectat la gazda și portul necesar prin tunelul proxy. Dacă doriți, puteți adăuga HandshakeCompletedListener la soclu. dacă doriți să primiți un semnal despre finalizarea unei operațiuni SSL.

Cu toate acestea, utilizarea comenzilor http pentru un soclu SSL atunci când accesați paginile Web nu este o abordare ideală, deoarece aceasta ar putea însemna încărcarea procesatorului de protocol http. În schimb, ar trebui să utilizați API-urile HTTPS URL incluse în JSSE în acest scop. Pentru a face acest lucru, trebuie să treci soclul tunelului SSL la dispozitivul de procesare a fluxului URL HTTPS.

Transmiterea unui soclu SSL la dispozitivul de procesare a fluxului URL HTTPS

Biblioteca JSSE conține clasa HttpsURLConnection din pachetul com.sun.net.ssl. extinderea clasei java.net.URLConnection. Obiectul HttpsURLConnection este returnat de metoda openConnection () a obiectului URL, dacă "HTTPS" este specificată ca protocol. Clasa HttpsURLConnection conține metoda setSSLSocketFactory (). permițându-vă să instalați SSLSocketFactory la alegere. Pentru a trimite un HTTPS SSL-socket în handler flux URL-ul, va trebui să setați parametrii setSSLSocketFactory metoda (), folosind un constructor soclu returnează un tunel SSL-socket creat anterior. Pentru aceasta, trebuie să atașați codul anterior considerat la clasa SSLTunnelSocketFactory. extinde SSLSocketFactory clasă. Clasa SSLSocketFactory este abstractă. Pentru ao extinde, trebuie să implementați metoda createSocket (). pentru a reveni la soclul tunelului SSL pe care l-ați creat mai devreme:

Rețineți că SSLTunnelSocketFactory implicit conține obiectul SSLSocketFactory. Acest obiect SSLSocketFactory poate fi setat prin apelarea metodei statice getDefault () (linia 15). Acest obiect SSLSocketFactory este necesar pentru dvs. pentru impunerea unui soclu SSL, așa cum a fost spus mai devreme. Puteți apela, de asemenea, metode getDefaultCipherSuites () și getSupportedCipherSuites () a obiectului implicit în procesul de punere în aplicare a metodelor adecvate SSLSocketFactory abstracte de super-clasă. Detalii despre această implementare pot fi găsite în codurile sursă ale SSLTunnelSocketFactory în Surse adiționale.

Tunelul prin proxy prin URLConnection

Se trece printr-un proxy folosind URLConnection în dvs. JSSE aplicație se va face după ce apelați openConnection metoda () și verifică dacă obiectul obiect returnat HttpsURLConnection. Dacă da, creați o instanță a obiectului SSLTunnelSocketFactory și setați-o în metoda setSSLSocketFactory () (liniile 22-25):

Acum puteți accesa adresele URL HTTPS utilizând API-ul furnizat de clasa URLConnection. Nu mai trebuie să vă faceți griji cu privire la formatul comenzilor http GET și POST, ca și cum ați utiliza SSL Socket API. Codul sursă complet pentru SSLTunnelSocketFactory și codul aplicației pentru conectarea la adresa URL protejată utilizând tunelul proxy pot fi găsite în surse suplimentare. Pentru a compila și a rula aplicația, va trebui să descărcați și să instalați JSSE de pe site-ul Sun, listat și în Sursele adiționale.

concluzie

Dacă aplicația dvs. JSSE nu poate penetra un tunel prin firewall-ul organizației dvs., trebuie să implementați propriul mufă de tunel. Exemplul de cod include pachetul JSSE și arată cum se deschide tunelul socket-ului SSL. În acest articol, mergem mai departe pentru a arăta cum să treci soclul tunelului la dispozitivul de procesare a fluxului URL HTTPS și să te ajuți să eviți să rescrieți handler-ul http.