JavaRush /Java Blog /Random-TK /HTTP-den HTTPS-e çenli
Viacheslav
Dereje

HTTP-den HTTPS-e çenli

Toparda çap edildi
HTTP-den HTTPS - 1
Mazmuny:

Giriş

Häzirki zaman dünýäsinde web programmalary bolmazdan ýaşap bolmaz. Kiçijik synagdan başlarys. Çagalygymda, dükanlaryň hemmesinde “Argumentler we faktlar” ýaly gazet satylandygy ýadymda. Olary ýada saldym, sebäbi çagalykdan şahsy düşünjäm boýunça bu gazetler hemişe geň görünýärdi. We olaryň web sahypasyna girmelimi ýa-da etmezlik kararyna geldim:
HTTP-den HTTPS-e çenli - 2
Google Chrome kömegine barsak, bu sahypanyň ygtybarly birikme ulanmaýandygyny we sahypa bilen alyş-çalyş maglumatlaryňyzyň üçünji taraplara girip biljekdigini okarys. Başga käbir habarlary barlap göreliň, mysal üçin Sankt-Peterburgyň elektron metbugaty bolan Fontankadan gelen habarlar:
HTTP-den HTTPS-e çenli - 3
Görşüňiz ýaly, Fontanka web sahypasynda bu maglumatlara esaslanýan howpsuzlyk meselesi ýok. Netijede, web çeşmeleri howpsuz bolup biler ýa-da bolmazlygy mümkin. Şeýle hem goralmadyk çeşmelere elýeterliligiň HTTP protokoly arkaly bolýandygyny görýäris. Eger çeşme goralýan bolsa, maglumat alyş-çalşygy HTTPS protokolynyň kömegi bilen amala aşyrylýar, bu ýerde S ahyrynda “Howpsuz” diýmekdir. HTTPS protokoly rfc2818 spesifikasiýasynda düşündirilýär: " TLS üstünden HTTP ". Geliň, öz web programmamyzy döretmäge synanyşalyň we onuň nähili işleýändigini göreliň. Theolda adalgalara düşüneris.
HTTP-den HTTPS-e çenli - 4

Java-da web programmasy

Şeýlelikde, Java-da gaty ýönekeý web programmasy döretmeli. Ilki bilen Java programmasynyň özi gerek. Munuň üçin Gradle taslamasynyň awtomatiki gurluş ulgamyny ulanarys. Bu bize zerur katalog gurluşyny el bilen döretmezlige mümkinçilik berer + Gradle biziň üçin taslama üçin zerur bolan ähli kitaphanalary dolandyrar we kod ýerine ýetirilende olaryň elýeterliligini üpjün eder. Gradle hakda has giňişleýin gözden geçirip bilersiňiz: " Gradle barada gysgaça giriş ". Gradle Init Plugini ulanalyň we buýrugy işledeliň:
gradle init --type java-application
build.gradleOndan soň, taslamamyzyň haýsy kitaphanalardan ybaratdygyny, Gradleň bize berjek gurluş skriptini açalyň . Şol ýerde synag etjek web serwerimize garaşlylygy goşalyň:
dependencies {
    // Web server
    implementation 'io.undertow:undertow-core:2.0.20.Final'
     // Use JUnit test framework
     testImplementation 'junit:junit:4.12'
}
Web programmasynyň işlemegi üçin, elbetde, programmamyzyň ýerleşdiriljek web serweri gerek. Web serwerleriniň köp görnüşi bar, ýöne esasylary: Tomkat, Jetty, Undertow. Bu gezek Undertow saýlarys. Bu web serwerimiz bilen nädip işleşip biljekdigimize düşünmek üçin resmi Undertow web sahypasyna geçeliň we resminamalar bölümine geçeliň . Siz we men Undertow Core baglylygy baglanyşdyrdyk, şonuň üçin bu ýadro , ýagny web serweriniň esasy bolan bölüm bilen gyzyklanýarys . Iň aňsat usuly, Undertow üçin Builder API-ni ulanmak:
public static void main(String[] args) {
	Undertow server = Undertow.builder()
            .addHttpListener(8080, "localhost")
            .setHandler(new HttpHandler() {
                @Override
                public void handleRequest(final HttpServerExchange exchange) throws Exception {
                    exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                    exchange.getResponseSender().send("Hello World");
                }
            }).build();
    server.start();
}
Kod ýerine ýetirilse, aşakdaky web çeşmesine geçip bileris:
HTTP-den HTTPS - 5
Simplyönekeý işleýär. Undertow Builder API-iň kömegi bilen, ýerlihost we port 8080-e HTTP diňleýjisini goşýarys. Bu diňleýji web brauzerinden haýyşlary alýar we jogap hökmünde "Salam Dünýä" setirini yzyna berýär. Ajaýyp web programmasy. Emma görşümiz ýaly, HTTP protokolyny ulanýarys. Maglumat alyşmagyň bu görnüşi ygtybarly däl. HTTPS protokolyny ulanyp alyş-çalyşlaryň nähili geçirilýändigini anyklalyň.
HTTP-den HTTPS-e çenli - 6

HTTPS üçin talaplar

HTTPS-i nädip işletmelidigine düşünmek üçin, HTTPS spesifikasiýasyna gaýdyp geleliň: " RFC-2818: TLS üstünden HTTP ". Spesifikasiýa laýyklykda, HTTPS protokolyndaky maglumatlar SSL ýa-da TLS kriptografiki protokollaryndan geçirilýär. Adamlar köplenç SSL we TLS düşünjesi bilen azaşýarlar. Aslynda SSL ösdi we wersiýalaryny üýtgetdi. Soň TLS SSL protokolyny işläp düzmekde indiki ädim boldy. Tagny, TLS diňe SSL-iň täze wersiýasy. Spesifikasiýa şeýle diýýär: “SSL we onuň oruntutary TLS”. Şeýlelikde, SSL / TLS kriptografiki protokollarynyň bardygyny öwrendik. SSL “Secure Sockets Layer” -iň gysgaltmasy bolup, “ygtybarly rozetka gatlagy” hökmünde terjime edilýär. Iňlis dilinden terjime edilen rozetka birleşdiriji. Tor arkaly maglumat geçirişine gatnaşyjylar torda biri-biri bilen aragatnaşyk saklamak üçin rozetkalary programmirleme interfeýsi (ýagny API) hökmünde ulanýarlar. Brauzer müşderi hökmünde hereket edýär we müşderi rozetkasyny ulanýar, haýyş alýan we jogap berýän serwer serwer rozetkasyny ulanýar. Hut şu rozetkalaryň arasynda maglumat alyş-çalşygy bolýar. Şonuň üçin teswirnama ilki SSL diýilýärdi. Emma wagt geçdi we teswirnama ösdi. Bir gezek SSL protokoly TLS protokolyna öwrüldi. Transport gatlagynyň howpsuzlygy üçin TLS gysga. TLS protokoly, öz gezeginde, SSL protokol spesifikasiýasynyň 3.0 wersiýasyna esaslanýar. TLS teswirnamasy aýratyn makalalaryň we synlaryň mowzugy, şonuň üçin diňe gyzykly materiallary görkezerin: Gysgaça aýdylanda, HTTPS-iň esasy, sanly şahadatnamasyny ulanyp, TLS el çarpmak we “Serwer şahsyýeti” barlagy (ýagny serwer kesgitlemesi). Bu möhümdir. Muny ýatda saklalyň, sebäbi ... Bu hakykata soňrak dolanarys. Şeýlelik bilen, ozal serwere HTTP protokolynyň üstünde işlemelidigini aýtmak üçin HttpListener ulanýardyk. Aboveokardaky mysalda, HTTP-de işlemek üçin HttpListener goşsak, HTTPS-iň üstünde işlemek üçin HttpsListener goşmaly:
HTTP-den HTTPS - 7
Emma goşmak üçin SSLContext gerek. Gyzykly tarapy, SSLContext Undertow-dan däl, ýöne javax.net.ssl.SSLContext. SSLContext synpy " Java Secure Socket Extension " (JSSE) diýilýän zadyň bir bölegi - internet birikmesiniň howpsuzlygyny üpjün etmek üçin Java giňeltmesi. Bu giňeltme " Java Secure Socket Extension (JSSE) salgylanma gollanmasynda " düşündirilýär . Resminamalaryň giriş bölüminden görnüşi ýaly, JSSE SSL we TLS protokollarynyň çarçuwasyny we Java ýerine ýetirişini üpjün edýär. SSLContext-i nädip almaly? JavaDoc SSLContext-i açyň we getInstance usulyny tapyň . Görşüňiz ýaly, SSLContext-i almak üçin "Howpsuz soket protokoly" adyny görkezmeli. Parametrleriň beýany, bu atlaryň " Java kriptografiýa arhitekturasy standart algoritm adynyň resminamalary " -da tapylyp bilinjekdigini görkezýär. Şonuň üçin geliň görkezmelere eýereliň we resminamalara geçeliň. SSL we TLS arasynda saýlap biljekdigimizi görýäris:
HTTP-den HTTPS - 8
Indi SSLContext-i aşakdaky ýaly döretmelidigimize düşündik:
public SSLContext getSSLContext() {
	// 1. Получаем контекст, в рамках которого будем работать по TLS протоколу
	SSLContext context = null;
	try {
		context = SSLContext.getInstance("TLS");
	} catch (NoSuchAlgorithmException e) {
		throw new IllegalStateException(e);
	}
	return context;
}
Täze kontekst döredenimizden soň, SSLContext-iň " Java Secure Socket Extension (JSSE) salgylanma gollanmasynda " beýan edilendigini ýadymyzdan çykarmaýarys. “Täze döredilen SSLContext init usulyna başlamaly” diýip okaýarys we görýäris. Contextagny, kontekst döretmek ýeterlik däl. Başlamaly. Bu mantykly, sebäbi howpsuzlyk barada, diňe TLS protokolyny ulanmak isleýändigimizi aýtdyk. SSLContext-i başlatmak üçin üç zady üpjün etmeli: KeyManager, TrustManager, SecureRandom.
HTTP-den HTTPS - 9

KeyManager

KeyManager esasy dolandyryjydyr. Biziň bilen habarlaşýan adama haýsy “tanamaklyk şahadatnamasynyň” berilmegi üçin jogapkärdir. Şahadatnama şahsyýet hökmünde terjime edilip bilner. Müşderi, serweriň özüniň kimdigini we özüne ynanyp boljakdygyna göz ýetirmek üçin zerur. Şahsyýet hökmünde näme ulanylar? .Adymyzda bolsa, Serwer şahsyýeti serweriň sanly şahadatnamasy bilen barlanýar. Bu prosesi aşakdaky ýaly görkezip bolar:
HTTP-den HTTPS - 10
Mundan başga-da, " JSSE salgylanma gollanmasy: SSL-iň işleýşi" SSL-iň "asimmetrik kriptografiýa" ulanýandygyny aýdýar, bu bolsa açar jübütiň gerekdigini aňladýar: açar we şahsy açar. Kriptografiýa barada aýdanymyzdan soň, “Java kriptografiýa arhitekturasy” (JCA) güýje girýär. Oracle bu arhitektura barada ajaýyp resminama berýär: " Java Kriptografiýa Arhitekturasy (JCA) salgylanma gollanmasy ". Mundan başga-da, JavaRush-da JCA-nyň gysgaça synyny okap bilersiňiz: " Java Kriptografiýa Arhitekturasy: Ilkinji tanyş ." Şeýlelik bilen, “KeyManager” -i işe girizmek üçin serwerimiziň şahadatnamasyny saklaýan “KeyStore” gerek. Açar we şahadatnama dükanyny döretmegiň iň giň ýaýran usuly, JDK-a goşulan açar gurallarydyr. Mysal JSSE resminamalarynda görmek bolýar: " JSSE bilen ulanmak üçin açar dükany döretmek ". Şeýlelik bilen, açar dükany döretmek we şol ýerde şahadatnama ýazmak üçin KeyTool kömekçi programmasyny ulanmalydyrys. Gyzykly tarapy, öň nesil -genkey ulanyp kesgitlenýärdi, indi bolsa -genkeair ulanmak maslahat berilýär. Aşakdaky zatlary kesgitlemeli bolarys:
  • lakam : lakam ýa-da ýazgy Keystore-da ýatda saklanjak at
  • keyalg : açar şifrlemek algoritmi. Aslynda maksadymyz üçin adaty çözgüt bolan RSA algoritmini saýlalyň.
  • açar düwmesi : Açar ululyk (bitlerde). Maslahat berilýän iň pes ululyk 2048, sebäbi ... kiçi göwrümli eýýäm ýaryldy. Bu ýerde has giňişleýin okap bilersiňiz: " 2048 bitde ssl şahadatnamasy ".
  • dname : Hormatly at, tapawutly at.
Talap edilýän çeşmäniň (mysal üçin, https: // localhost) munuň bilen deňeşdiriljekdigine düşünmek möhümdir. Muňa "predmet cn gabat gelmek" diýilýär.
  • güýji : Döredilen şahadatnamanyň hereket edýän günleriniň dowamlylygy, ýagny dogry.
  • ext : " Atlandyrylan giňeltmeler " -de görkezilen şahadatnama giňeltmesi.
Öz-özüňe gol çekilen şahadatnamalar üçin (ýagny özbaşdak döredilen şahadatnamalar üçin) aşakdaky giňeltmeleri görkezmeli:
  • -ext san: tankydy = dns: localhost, ip: 127.0.0.1> SubjectAlternativeName tarapyndan mowzuk gabat gelişini ýerine ýetirmek üçin
  • -ext bc = ca: false> bu şahadatnamanyň beýleki şahadatnamalara gol çekmek üçin ulanylmaýandygyny görkezmek üçin
Buýrugy işledeliň (Windows OS üçin mysal):
keytool -genkeypair -alias ssl -keyalg RSA -keysize 2048 -dname "CN=localhost,OU=IT,O=Javarush,L=SaintPetersburg,C=RU,email=contact@email.com" -validity 90 -keystore C:/keystore.jks -storepass passw0rd -keypass passw0rd -ext san:critical=dns:localhost,ip:127.0.0.1 -ext bc=ca:false
Sebäbi faýl dörediler, faýly döretmek üçin ähli hukuklaryňyzyň bardygyna göz ýetiriň. Mundan başga-da, şuňa meňzeş maslahatlary görersiňiz:
HTTP-den HTTPS-e çenli - 11
Bu ýerde bize JKS-iň eýeçilik formatydygy aýdylýar. Emläk, awtorlaryň şahsy emlägi we diňe Java-da ulanmak üçin niýetlenendir. Üçünji tarap kommunal hyzmatlary bilen işleşende gapma-garşylyk ýüze çykyp biler, şonuň üçin bize duýduryş berilýär. Mundan başga-da, ýalňyşlygy alyp bileris : The destination pkcs12 keystore has different storepass and keypass. Bu ýalňyşlyk, açar dükanyna we açar dükanyna girmegiň parollary başga bolany üçin ýüze çykýar. Düwmeleriň resminamalarynda aýdylyşy ýaly : "Mysal üçin, üçünji tarap gurallarynyň köpüsi PKCS # 12 açar dükanyndaky ammar we klawiaturanyň birmeňzeş bolmagyny talap edýär." Açary özümiz kesgitläp bileris (mysal üçin, -destkeypass enterpassw). Emma talaplary bozmazlyk we şol bir paroly bellemek has gowudyr. Şonuň üçin import şeýle bolup biler:
keytool -importkeystore -srckeystore C:/keystore.jks -destkeystore C:/keystore.jks -deststoretype pkcs12
Üstünlik mysaly:
HTTP-den HTTPS - 12
Şahadatnamany bir faýla eksport etmek üçin işledip bilersiňiz:
keytool -export -alias ssl -storepass passw0rd -file C:/server.cer -keystore C:/keystore.jks
Mundan başga-da, açar dükanynyň mazmunyny şeýle alyp bileris:
keytool -list -v -keystore C:/keystore.jks -storepass passw0rd
Gowy, indi şahadatnamany öz içine alýan açar dükanymyz bar. Indi ony koddan alyp bilersiňiz:
public KeyStore getKeyStore() {
	// Согласно https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#KeyStore
	try(FileInputStream fis = new FileInputStream("C:/keystore.jks")){
		KeyStore keyStore = KeyStore.getInstance("pkcs12");
		keyStore.load(fis, "passw0rd".toCharArray());
		return keyStore;
	} catch (IOException ioe) {
		throw new IllegalStateException(ioe);
	} catch (KeyStoreException | NoSuchAlgorithmException | CertificateException e) {
		throw new IllegalStateException(e);
	}
}
“KeyStore” bar bolsa, “KeyManager” -i başlap bileris:
public KeyManager[] getKeyManagers(KeyStore keyStore) {
	String keyManagerAlgo = KeyManagerFactory.getDefaultAlgorithm();
	KeyManagerFactory keyManagerFactory = null;
	try {
		keyManagerFactory = KeyManagerFactory.getInstance(keyManagerAlgo);
		keyManagerFactory.init(keyStore, "passw0rd".toCharArray());
		return keyManagerFactory.getKeyManagers();
	} catch (NoSuchAlgorithmException e) {
		throw new IllegalStateException(e);
	} catch (UnrecoverableKeyException | KeyStoreException e) {
		throw new IllegalStateException(e);
	}
}
Ilkinji maksadymyza ýetildi. TrustManager-iň nämedigini anyklamak galýar. TrustManager JSSE resminamalarynda " TrustManager interfeýsi " bölüminde düşündirilýär . KeyManager-a gaty meňzeýär, ýöne maksady, birikme soraýan adamyň ynamdar bolup biljekdigini barlamak. Gysgaça aýtsak, bu KeyManager tersine =) Bize TrustManager gerek däl, şonuň üçin biz geçeris. Soňra ulanyjynyň serwerimize haýyş bilen ýüz tutýandygyny tassyklamaýan default TrustManager dörediler. Resminamalarda şeýle diýilýär: "deslapky ýerine ýetiriş ulanylar". “SecureRandom” bilen birmeňzeş. Null görkezsek, deslapky ýerine ýetiriş ulanylar. “SecureRandom” -yň JCA synpydygyny we JCA resminamalarynda “ SecureRandom Class ” bölüminde beýan edilendigini ýadymyzdan çykaralyň . Umuman, ýokarda beýan edilen ähli usullary göz öňünde tutup taýýarlyk şeýle bolup biler:
public static void main(String[] args) {
	// 1. Подготавливаем приложение к работе по HTTPS
	App app = new App();
	SSLContext sslContext = app.getSSLContext();
	KeyStore keyStore = app.getKeyStore();
	KeyManager[] keyManagers = app.getKeyManagers(keyStore);
	try {
		sslContext.init(keyManagers, null, null);
	} catch (KeyManagementException e) {
		throw new IllegalStateException(e);
	}
Galan zat serweri başlamak:
// 2. Поднимаем server
 	int httpsPort = 443;
	Undertow server = Undertow.builder()
            .addHttpsListener(httpsPort, "localhost", sslContext)
            .setHandler(new HttpHandler() {
                @Override
                public void handleRequest(final HttpServerExchange exchange) throws Exception {
                    exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                    exchange.getResponseSender().send("Hello World");
                }
            }).build();
	server.start();
}
Bu gezek serwerimiz aşakdaky salgyda elýeterli bolar, https://localhost:443 ýöne şonda-da bu çeşmä ynanyp bolmajak ýalňyşlyk alarys:
HTTP-den HTTPS - 13
Şahadatnamanyň nämedigini we bu barada näme etmelidigini anyklalyň.
HTTP-den HTTPS - 14

Şahadatnamany dolandyrmak

Şeýlelik bilen, serwerimiz eýýäm HTTPS arkaly işlemäge taýyn, ýöne müşderi oňa ynananok. Näme üçin? Geliň, seredeliň:
HTTP-den HTTPS-e çenli - 15
Munuň sebäbi, bu şahadatnamanyň öz-özüne gol çekilen şahadatnamasy. Özbaşdak gol çekilen SSL şahadatnamasy, şol bir adam tarapyndan berlen we gol çekilen açyk açar şahadatnamany aňladýar. .Agny, haýsydyr bir abraýly şahadatnama edarasy tarapyndan berilmedi (CA, Sertifikat edarasy diýlip hem atlandyrylýar). Şahadatnama edarasy howandarlyk edýär we gündelik durmuşda notariusa meňzeýär. Berýän şahadatnamalarynyň ygtybarlydygyna ynandyrýar. Şeýle CA-lar tarapyndan şahadatnama bermek hyzmaty tölenýär, şonuň üçin hiç kime ynam ýitirilmegi we abraýly töwekgelçilikler gerek däl. Düzgüne görä, birnäçe ygtybarly şahadatnama bar. Bu sanawy redaktirläp bolýar. Her bir operasiýa ulgamynyň, sertifikat berýän edaralaryň sanawyny öz dolandyryşy bar. Mysal üçin, bu sanawy Windows-da dolandyrmak üçin şu ýerden okap bilersiňiz: " Windows-da ygtybarly kök şahadatnamalaryny dolandyryň ". Erroralňyşlyk habarynda görkezilişi ýaly şahadatnamany ynamdarlara goşalyň. Munuň üçin ilki bilen şahadatnamany göçürip alyň:
HTTP-den HTTPS-e çenli - 16
OS Windows-da Win + R basyň we mmcdolandyryş konsolyna jaň etmek üçin ýerine ýetiriň. Ondan soň, häzirki konsola “Şahadatnamalar” bölümini goşmak üçin Ctrl + M basyň. Ondan soň, "Ynamly kök şahadatnamasy edaralary" bölüminde ýerine ýetireris Действия / Все задачи / Импорт. Öň göçürilen faýly faýla import edeliň. Brauzer şahadatnamanyň öňki ynam ýagdaýyny ýada salan bolmagy mümkin. Şonuň üçin sahypany açmazdan ozal brauzeri täzeden açmaly. Mysal üçin, Google Chrome-da adres setirinde işlemeli chrome://restart. OS Windows-da şahadatnamalary görmek üçin kömekçi enjamy ulanyp bilersiňiz certmgr.msc:
HTTP-den HTTPS - 17
Hemme zady dogry ýerine ýetiren bolsak, HTTPS arkaly serwerimize üstünlikli jaň göreris:
HTTP-den HTTPS-e çenli - 18
Görşüňiz ýaly, şahadatnama indi dogry hasaplanýar, çeşme bar we ýalňyşlyklar ýok.
HTTP-den HTTPS - 19

Aşakdaky setir

Şeýlelik bilen, web serwerinde HTTPS protokolyny işletmegiň shemasynyň nämä meňzeýändigini we munuň üçin nämäniň zerurdygyny kesgitledik. Şu wagt goldawyň kriptografiýa üçin jogapkär Java Kriptografiýa Arhitekturasynyň (JCA) we Java tarapynda TLS ýerine ýetirilmegini üpjün edýän Java Secure Socket Extension (JSSE) bilen özara täsirleşýändigi aýdyňdyr diýip umyt edýärin. JDK-a girýän açar gurallarynyň KeyStore açary we şahadatnama dükany bilen işlemek üçin nähili ulanylýandygyny gördük. Mundan başga-da, HTTPS-iň howpsuzlyk üçin SSL / TLS protokollaryny ulanýandygyna düşündik. Muny güýçlendirmek üçin size bu mowzukdaky ajaýyp makalalary okamagyňyzy maslahat berýärin: Bu kiçijik gözden geçirilişden soň, HTTPS birneme aç-açan bolar diýip umyt edýärin. HTTPS-i işletmeli bolsaňyz, amaly serwerleriňiziň we çarçuwalaryňyzyň resminamalaryndan şertlere aňsatlyk bilen düşünip bilersiňiz. # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION