Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Websockets https kautta ?

Sivun loppuun

HannuTapio [16.09.2017 16:15:13]

#

Hei,

Minulla on letsencrypt https sertifikaatti sivustollani, kuinka tämä websockets, voiko sen laittaa nyt sitten jotenkin toimimaan https kautta wss kanssa ?

Vai tarvitsenko minä vielä jonkin ylimääräisen sertifikaatin.

Minun palvelinohjelmani on java serversocket, ja minun client on javascript, joka ainakin ws:// kanssa toimii firefox ja google selaimissa. :)

--

groovyb [16.09.2017 16:50:54]

#

domain vaatii sertin, ei palvelu. eli jos hostaat websocketia samasta paikasta, esim domain.com, et tarvitse kuin yhden sertin. Mutta jos websocket on kiinni subdomainissa kuten stream.domain.com, tarvitset toisen koska lets encrypt ei tue wildcard sertejä (*.domain.com). eli jokaiselle subdomainille joudut tekemään saman systeemin mitä nyt olet lets encryptillä tehnyt sivustosi domainille. suojattuna websocket url on wss://

HannuTapio [16.09.2017 17:41:50]

#

Wss://,

Eli, tämä Websocket osoite "wss://hannusaro.com:8080" pitäisi toimia oikein, kun lataan yhteyden "https://www.hannusaro.com/tabletpelisivusto/AsiakasOhjelma.html" tiedostoni kautta.

:)

Minulla palauttaa tuo yllä oleva, seuraavan virheilmoituksen - WebSocket connection to 'wss://hannusaro.com:8080/' failed: WebSocket opening handshake timed out

Minulla http toimii ihan oikein, ws:// kanssa firefox ja google selaimissa. :)

Täytyykö https avata firewall kanssa, jotenkin erikseensä, kuin tuo http ?

Onko wss handshake, erillainen kuin ws ?

--

Metabolix [16.09.2017 19:38:48]

#

Sivun lataustapa (HTTP tai HTTPS) ei vaikuta asiaan mitenkään, kun WebSocket-palvelin on erikseen. Jotta salausta voisi käyttää myös WebSocketeilla, palvelimeen täytyy ohjelmoida SSL-tuki. Nyt selain yrittää ottaa salatun SSL-yhteyden palvelimeen mutta palvelimesi odottaa selkokielistä WebSocket-avauspyyntöä, ja koska sellaista pyyntöä ei tule, palvelin ei vastaa ja tulee timeout.

Ei ole järkevää ohjelmoida itse WebSocket-palvelinta tai varsinkaan SSL-tukea siihen. Kannattaa käyttää jotain valmista kirjastoa, jossa kaikki on valmiina.

HannuTapio [16.09.2017 21:06:44]

#

Ok,

Kiitos, mikä olisi yksinkertaisin ja helpoin https ja wss kykenevä kirjasto serverille ?

Onko teille esim. jotakin yksinkertaista php server koodia tiedossa, jossain koodi varastossa, taikka netti sivustolla tiedossa ?

Minulla ei tule salasanoja tähän tabletpelisivustoon, niin, avaan tällä ws:// ja http:// parilla sivustojeni ylläpidot silti.

Mutta, pyrin jatkot sitten https:// ja wss:// kanssa. :), jos se vain open sourcen kanssa on mahdollista, ilman kaupalista sertifikaattia server ohjelmaani. :)

:)

--

groovyb [16.09.2017 21:48:09]

#

Tähän ei ole helppoa vastausta, koska voit hostata sivujasi niin monin tavoin.
Mutta oletetaan nyt, että sinulla pyörisi itse softa dockerissa serverillä sisäiseti portissa 8080 (docker port map 8080:8080), tai että softasi muuten kuuntelee portissa 8080 kuitenkin niin että ko. portti on suljettu ulkomaailmasta, ja haluat tehdä apachessa ssl reverse proxyn siellä pörräävään sivustoon ja websocketiin tilanteessa missä sivustosi osoite on domainini.com

https:// portti 443 ohjautuu sisäisesti http://localhost:8080
wss:// portti 443 ohjautuu sisäisesti ws://localhost:8080

NameVirtualHost *:443
<VirtualHost *:443>
    ServerName domainini.com
    SSLCertificateFile /etc/letsencrypt/live/domainini.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domainini.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

<Location />
        Order allow,deny
        Allow from all
</Location>

RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*)           ws://localhost:8080/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*)           http://localhost:8080/$1 [P,L]

ProxyPassReverse / http://localhost:8080/

SSLCertificateChainFile /etc/letsencrypt/live/domainini.com/chain.pem
</VirtualHost>

Tämän lisäksi pitäisi tietysti tehdä erikseen ohjaus http => https, jos joku erehtyy http:llä tulemaan sivustolle, esimerkiksi jotain tämän suuntaista:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName domainini.com
    Redirect permanent / https://domainini.com/
</VirtualHost>

HannuTapio [17.09.2017 01:21:14]

#

Apache2 virhe,

Minulla tuo esimerkki antaa virheen.

Mutta, voinko kysyä, että, kuinka tämä seuraava https configure toimisi, niin, että, se ohjaisi netistä javascript client ws:// osoitteen, minun palvelimen https kautta ws://localhost:8080 osoitteeseen palvelimessa.

Vai pysäyttääkö selain, kaikki, ws:// osoitteet, kun yrittää ladata ws:// https kautta ?

Minun tietojeni mukaan vain selaimen wss:// voi käynnistyä https kautta, vai voiko tehdä tunnelin ?

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName hannusaro.com
ServerAlias www.hannusaro.com
DocumentRoot /var/www/
ServerSignature Off

RewriteEngine On
# Some rewrite rules in this file were disabled on your HTTPS site,
# because they have the potential to create redirection loops.
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]

ErrorLog /var/log/apache2/redirect.error.log
LogLevel warn
SSLCertificateFile /etc/letsencrypt/live/hannusaro.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hannusaro.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

--

groovyb [17.09.2017 10:45:33]

#

Esimerkki ei toimi koska omassa mallissasi et tarvitse reverse proxyä. kuten sanoin, hostata voi niin monilla tavoilla ja suosittelen että otat apache2 dokumentaation kauniiseen käteen ja alat opiskelemaan. Jotta voisit saada foorumilta apua, sinun pitää kertoa paljon tarkempia yksityiskohtia. Esimerkiksi että onko sivusi staattiset, vai php (jaat vähän ristiriitaista infoa koska olet php:stä puhunut mutta sivustosi päättyy .html), sekä miten olet websocketin implementoinut. eli onko sinulla websocket nodejs totetuksena vaikka expressjs + ws combolla, vai onko se php joka on tarkoitus hostata apache2:sessa suoraan. Yleisesti, älä käytä koodia mistä et ymmärrä miten se toimii. Jos haluat apua, et voi sitä pyytää ellet osaa kertoa tarkkaan mihin apua tarvitset. ja nyt ollaan siitä pisteestä kaukana vielä, koska et näemmä vieläkään ymmärrä esimerkiksi sitä että ws ja http on eri asioita, kuten wss ja https. et hostaa wss minkään https:n päällä, vaan https on salattu http, ja wss on salattu ws. Koodeillasi ei ole tähän myös mitään merkitystä, ellet ole koodissa kovakolvannut http ja ws urleja vaikka integraatioihin, ne ei luonnollisestikaan toimisi jos kerran pannu vastaanottaa vain 443 yhteyksiä.

mutta mitä nyt ymmärsin, ainakin tuo websocket pitää reverse proxyttää koska se kuuntelee apachen ulkopuolella portissa 8080. tai sitten alat miettimään miten saat sertit käyttöön kooditasolla serveritotetuksessasi ja vaihdat kuuntelun porttiin 443. tästä kivana bonuksena apache ei voi enää 443:sta kuunnella koska portti on jo websocket serverisi käytössä.

Metabolix [17.09.2017 17:02:42]

#

Reverse proxy on tosiaan käytännöllinen ratkaisu WebSockettien käyttöön. Siis sovellus voi käyttää tavallista WebSocket-osoitetta (ws tai wss) ilman erillistä porttia, ja tämä osoite voidaan HTTP-palvelimesta välittää paikallisesti vaikka osoitteeseen localhost:60088. Tällaisessa järjestelyssä on etuna, että osoitteet pysyvät siisteinä ja HTTP-palvelin hoitaa tarvittaessa salauksen. Haittana on toki, että palvelimelle tulee vähän ylimääräistä kuormaa, kun kaikki WebSocket-data kiertää HTTP-palvelimen kautta.

Apachelle on moduuli mod_proxy_wstunnel, jolla tämä ilmeisesti onnistuu.

nginx:lle riittävät tällaiset asetukset:

location /websocket-test/ {
	proxy_pass http://localhost:60088;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
}

HannuTapio [17.09.2017 19:44:28]

#

Aloittelija,

Monenmoista uutta sanaa oli mukana viesteissänne, ja olen yhä 47 vuotinen lautapeli harrastelija helsingistä vaan, ilman korkea- yliopisto taustaa, olen lukio tason henkilö joka erikoistuu jatkossa sotalautapeleihin.

Elikkä, onnistuu siis, niin, että, laitan "ws://hannusaro.com:443" ja sitten proxy tunneli palvelimen sisällä 443 ssl osoitteesta "http://localhost:8080", jolloinka tämä https salaus salaa liikennettä, vaikka liikenne on ws:// ja http://.

Vai pysäyttääkö aina tuo selaimen depracted toiminta liikenteen, kun yritän ws:// kanssa ssl 443 kautta, "http://localhost:8080".

Tämä on ihan uutta ihmettely toimintaa minulla taas.

:)

--

Grez [17.09.2017 20:28:19]

#

HannuTapio kirjoitti:

ilman korkea- yliopisto taustaa, olen lukio tason henkilö joka erikoistuu jatkossa sotalautapeleihin.

Eipä noihin asioihin toisaalta tarvitsekaan korkeakoulu- tai yliopistotaustaa. Ja tuskin mitään auttaisi jos olisit esim. 20 vuotta sitten opiskellut yliopistossa.

Metabolix [17.09.2017 21:41:03]

#

HannuTapio kirjoitti:

https salaus salaa liikennettä, vaikka liikenne on ws:// ja http://.

Olet ymmärtänyt väärin. Selain käyttää salausta vain, kun osoitteessa on wss:// tai https://. Se on täysin pakollista. Kuitenkin HTTP-palvelin (kuten Apache) purkaa wss://-yhteyden salauksen, jolloin WebSocket-palvelimen ei tarvitse itse tukea salausta ja proxy-osoite kirjoitetaan ilman salausta, esimerkiksi ws://localhost:8080.

HannuTapio [17.09.2017 22:44:26]

#

Handshake,

Websockets ja palvelin ohjelma keskustelu sisältää handshaken.

Tämä on aika vaikeata tällä hetkellä ymmärtää kun niin vähän tiedän asiasta.

Mutta, tuo handshake, niin, toimiiko se sitten proxyn kautta tulevasta wss:// aina localhost:8080 asti ja käynnistykseen ?

Minulla tuo proxy asennus palauttaa handshake virheen, testasin https html sivua, jossa on wss:// yhteys, 443 porttiin, ja siintä tuo proxy ohjaus, localhost:8080 jossa on serversocket java .net palvelin ohjelmani.

:)

--

HannuTapio [17.09.2017 22:46:49]

#

Testausta,

Onko teillä kenelläkään toimivaa testiä kokemuksessa, tuosta wss:// asiakas https:// sivustolla, ja sitten java .net serversocket port:8080 palvelimessa, proxyn takana.

:)

--

groovyb [18.09.2017 09:56:33]

#

Jos nyt vaikka ensin näyttäisit nykyiset conffisi, ja pistät myös itse virheen minkä saat. Ei voi auttaa ellet kerro tarkalleen virheitä eri tilanteissa. eli copy pasteta aina virheet mukaan jos haluat että virheitä ratkotaan. Se on erityisen tärkeää.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta