Configuration Apache pour accéder aux WebSockets d'un noeud duniter local


#1

Salut à tous.
J’ai mis à jour Cesium récemment et, dans la console, j’ai remarqué que “Firefox ne peut établir de connexion avec le serveur à l’adresse wss://duniter.normandie-libre.fr/ws/block” J’ai donc commencé à chercher d’où ça venait. Après 2h30 de recherches, je n’arrive toujours pas à résoudre le problème.

Voici ma config WS2P sur mon noeud duniter.
Voici ma config Apache.
Le port 20901 est bien redirigé sur le serveur.
L’adresse https://duniter.normandie-libre.fr/ws2p a l’air de répondre correctement.

J’ai pourtant remis le nez dans la doc mais je n’y arrive pas.

Un coup de main serait le bienvenue.


#8

Ok, sans Converse ça semble pareil.
Césium doit faire des connexions en websockets pour la vue réseau.
Du coup, je sais pas trop.
Étrange que ça n’apparaisse que chez toi.
Tu utilises le serveur Apache ?


#9

Oui. Vu que j’ai partagé ma config d’Apache :wink:


#10

Ok, ce problème n’a pas lieu en connectant ton Césium à g1.duniter.org:443.
Tu connectes ton instance de Césium à ton nœud Duniter.
Je vois pas trop la source du problème pour l’instant.


#11

Oui, mais quand on teste avec SimpleWebSocket client on a une erreur :

image

image

A priori ta conf WS2P m’a l’air bonne, reste la conf Apache que je ne sais pas trop analyser, je suis plus à l’aise avec Nginx.


#12

Oui je teste avec Simple Web Socket. J’aurais ptet du le préciser dans mon premier post.

Du coup, voici ma config duniter au complet.


#13

Les instructions que je mets en général pour les nœuds publics qui ont du websocket :

# Socket.io support  
proxy_http_version 1.1;  
proxy_set_header Upgrade $http_upgrade;  
proxy_set_header Connection "upgrade";

Je n’ai pas vu d’instruction similaire dans ta conf Apache, c’est peut-être une piste.


#14

C’est en effet une piste que j’ai essayé de suivre cet après-midi sans trouver réellement de solution.
Je viens de refaire une recherche (“Add header proxy apache”) et je suis tombé là-dessus. Sûrement à tester


#15

De manière générale, tu peux suivre la piste “Apache + Socket .io”.


#17

ça avance.

J’ai bien une réponse avec Simple Web Socket sur wss://duniter.normandie-libre.fr/ws/block (la même qu’avec curl, voir premier post du topic) :

{"auth":"CONNECT","pub":"8t6Di3pLxxoTEfjXHjF49pNpjSTXuGEQ6BpkT75CkNb2","challenge":"1810b0a4-1677-443c-bfab-e55de6e397145729e355-a3a0-4471-bf28-d5b3f923f873","sig":"qmuM590jIJXuNeKCsIBPfjQ/PfnwwREwFx43mx4vzN/h0oMiMyRwaB3H0dyPNQ/yx/6y7oJl+S8vL4pHTLwUBg=="}

Mais avec wss://g1.duniter.fr/ws/block, j’obtiens :

{"version":10,"currency":"g1","number":163191,"issuer":"4GX5gUFwKg8Y8oL5ZFwFD64U3vEJo6CtY61Y3J8LMCHk","issuersFrame":201,"issuersFrameVar":0,"issuersCount":40,"parameters":"","membersCount":1387,"monetaryMass":373402587,"powMin":89,"time":1539855137,"medianTime":1539851377,"dividend":null,"unitbase":0,"hash":"0000006DB6F52A6F19CB6BCFFD8ACDB99F6C555AA641F5F85933FF7453405C0F","previousHash":"00000231C6E8F9E2F0107C66879CACBAB27FA8DEB7D5550E926990EE9CD096AE","previousIssuer":"82NdD9eEbXSjRJXeJdqf56xkpu6taTfTeEqtAtmtbyXY","identities":[],"certifications":[],"joiners":[],"actives":[],"leavers":[],"revoked":[],"excluded":[],"transactions":[{"version":10,"currency":"g1","comment":"Pour commencer","locktime":0,"issuers":["8SbnQYBLoSYdAXtJnVbbjLygPWR3vbFJYCY4PiEdxenY"],"signatures":["XnDFF9Oz9Bro7k6fKAXu0ZRThDTgviD17x640fw1X/CHfLKjHmoi5jThYbhjD4UzXcV0K3ySMr5d/aXBj8xdAg=="],"outputs":["100:0:SIG(3R6nkXHhJNKskcZCieNVfbdFnXYbGzXB6WkotHJwdKnk)","1800:0:SIG(8SbnQYBLoSYdAXtJnVbbjLygPWR3vbFJYCY4PiEdxenY)"],"inputs":["1900:0:T:AF12608C9B08028FD48524D4E9CF23F8DD9DC7C454424FE7EEEE1776CEAC65E2:1"],"unlocks":["0:SIG(0)"],"block_number":163189,"blockstamp":"163189-000000DDC6D1AB82BE2A7275E0EF2A48A33DBBA66804C5A9F04F3DD96451E061","blockstampTime":1539850844,"time":1539850844}],"nonce":10200000002424,"inner_hash":"DFD57AA85F4576E3F5FF2578ABC52DDB13C00F98417B668238DD70AC8065AF34","signature":"sbVl7pCvSMmoi1fYsgOaFO4AlbFhc6W+XlxzV/zcSN+k10xRV0hvB7fD5MVx0XwF+efwaamKA2lfB3F5sQtoBw==","raw":"Version: 10\nType: Block\nCurrency: g1\nNumber: 163191\nPoWMin: 89\nTime: 1539855137\nMedianTime: 1539851377\nUnitBase: 0\nIssuer: 4GX5gUFwKg8Y8oL5ZFwFD64U3vEJo6CtY61Y3J8LMCHk\nIssuersFrame: 201\nIssuersFrameVar: 0\nDifferentIssuersCount: 40\nPreviousHash: 00000231C6E8F9E2F0107C66879CACBAB27FA8DEB7D5550E926990EE9CD096AE\nPreviousIssuer: 82NdD9eEbXSjRJXeJdqf56xkpu6taTfTeEqtAtmtbyXY\nMembersCount: 1387\nIdentities:\nJoiners:\nActives:\nLeavers:\nRevoked:\nExcluded:\nCertifications:\nTransactions:\nTX:10:1:1:1:2:1:0\n163189-000000DDC6D1AB82BE2A7275E0EF2A48A33DBBA66804C5A9F04F3DD96451E061\n8SbnQYBLoSYdAXtJnVbbjLygPWR3vbFJYCY4PiEdxenY\n1900:0:T:AF12608C9B08028FD48524D4E9CF23F8DD9DC7C454424FE7EEEE1776CEAC65E2:1\n0:SIG(0)\n100:0:SIG(3R6nkXHhJNKskcZCieNVfbdFnXYbGzXB6WkotHJwdKnk)\n1800:0:SIG(8SbnQYBLoSYdAXtJnVbbjLygPWR3vbFJYCY4PiEdxenY)\nPour commencer\nXnDFF9Oz9Bro7k6fKAXu0ZRThDTgviD17x640fw1X/CHfLKjHmoi5jThYbhjD4UzXcV0K3ySMr5d/aXBj8xdAg==\nInnerHash: DFD57AA85F4576E3F5FF2578ABC52DDB13C00F98417B668238DD70AC8065AF34\nNonce: 10200000002424\nsbVl7pCvSMmoi1fYsgOaFO4AlbFhc6W+XlxzV/zcSN+k10xRV0hvB7fD5MVx0XwF+efwaamKA2lfB3F5sQtoBw==\n"}

Une petite idée d’où ça peut venir ?

Voici ma nouvelle config Apache :

<VirtualHost *:443>
	ServerName duniter.normandie-libre.fr
	ServerAdmin paidge_cs@hotmail.com

		<IfModule mod_rewrite.c>
		RewriteEngine On
		RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
		RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
		RewriteRule .* ws://localhost:20901%{REQUEST_URI} [P,QSA,L]
		</IfModule>

		Redirect /graph https://duniter.normandie-libre.fr/wotmap
		Redirect /wotmap2 https://duniter.normandie-libre.fr/wotmap

		Alias /wotmap /home/paidge/wotmap
		<Directory /home/paidge/wotmap>
				Options FollowSymLinks MultiViews
				AllowOverride all
				Require all granted
		</Directory>

		ProxyPassMatch ^/wotmap !
		ProxyPassMatch ^/graph !
		ProxyPassMatch ^/pma !

		SSLProxyEngine on

		ProxyPass /ws2p http://127.0.0.1:20901
		ProxyPassReverse /ws2p http://127.0.0.1:20901

		ProxyPass / http://82.64.35.65:10902/
		ProxyPassReverse / http://82.64.35.65:10902/

		ProxyRequests Off
		ProxyPreservehost On

		RequestHeader set X-Forwarded-Proto "https"
		Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"

		RequestHeader unset If-Modified-Since
		RequestHeader unset If-None-Match

		# Gestion des logs
		
		# Gestion des certificats SSL
</VirtualHost>

#18

Je crois qu’il y a une confusion entre BMA et WS2P qui sont deux APIs très différentes.

L’url wss://g1.duniter.fr/ws/block pointe sur l’API BMA du noeud g1 par défaut, BMA expose des websocket, mais ça n’a rien a voir avec WS2P.

WS2P n’est pas une API REST, il n’y a pas de “ressources”, ainsi écrire wss://duniter.normandie-libre.fr/ws/block n’a pas de sens, quel que soit le chemin fourni tu aura toujours la même réponse qui est le message CONNECT, et c’est tout a fait normal !

Je vois que sur ta fiche de peer le endpoint annoncé est WS2P dff60418 duniter.normandie-libre.fr 443 ws2p, et ce endpoint semble fonctionner parfaitement :slight_smile:


#19

OK. Je comprends pas tout mais ça ira pour le moment. Mon problème se pose avec mon instance publique de Cesium en fait (voir 1er post du topic).
Je n’ai plus le message Firefox ne peut établir de connexion avec le serveur à l’adresse wss://duniter.normandie-libre.fr/ws/block mais maintenant j’ai des erreurs de Cross Domain Origin :

Blocage d’une requête multiorigines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur https://duniter.normandie-libre.fr/tx/history/4FgeWzpWDQ2Vp38wJa2PfShLLKXyFGRLwAHA44koEhQj/times/1539216000/1539647999. Raison : échec de la requête CORS.


#20

Cesium ne requête jamais WS2P, c’est une api réservée aux échanges entres serveurs.
Cesium ne requête que BMA, donc ton soucis venais de ton endpoint BMA (qui propose aussi des websocket), ça devait être ton serveur apache qui bloquait les websocket de BMA, hélas je ne peut pas t’aider sur Apache :confused:
Mais si tu n’a plus de message d’erreur alors c’est peut etre réglé ?


#21

Le message que tu recois via wss://duniter.normandie-libre.fr/ws/block n’est pas le bon. Il se connecte au /ws2p du noeud, au lieu de /ws/block.


#23

Pour wss, Si je remplace :

RewriteRule .* ws://localhost:20901%{REQUEST_URI} [P,QSA,L]

Par :

RewriteRule .* ws://82.64.35.65:10902%{REQUEST_URI} [P,QSA,L]

Simple Web Socket répond bien. Plus qu’à regarder les erreurs CORS


#24

ok, ca marchera pour les accès de Cesium. En revanche ton noeud ne sera accessible via WS2P : la connection a wss://duniter.normandie-libre.fr/ws2p ne fonctionne plus.
il faut que tu gère différent cas, suivant l’adresse appellée.


#25

Merci tout le monde pour votre aide. Après deux jours et demi de galères et de tests en tous genres, j’ai enfin trouvé ma config Apache qui fonctionne :

<VirtualHost *:80>
	ServerName duniter.normandie-libre.fr

	<IfModule mod_rewrite.c>
		RewriteEngine on
		RewriteCond %{SERVER_PORT} !^443$
		RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]
	</IfModule>
</VirtualHost>

<VirtualHost *:443>
	ServerName duniter.normandie-libre.fr

	<IfModule mod_rewrite.c>
		RewriteEngine On

		RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
		RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
		RewriteCond %{REQUEST_URI}  ^/ws2p            [NC]
		RewriteRule .* ws://localhost:20901%{REQUEST_URI} [P,QSA,L]

		RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
		RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
		RewriteCond %{REQUEST_URI}  ^/ws            [NC]
		RewriteRule .* ws://82.64.35.65:10902%{REQUEST_URI} [P,QSA,L]
	</IfModule>

	SSLProxyEngine on

	ProxyPass /ws2p http://127.0.0.1:20901
	ProxyPassReverse /ws2p http://127.0.0.1:20901

	ProxyPass / http://82.64.35.65:10902/
	ProxyPassReverse / http://82.64.35.65:10902/

	ProxyRequests Off
	ProxyPreservehost On

	RequestHeader set X-Forwarded-Proto "https"
	RequestHeader unset If-Modified-Since
	RequestHeader unset If-None-Match
	Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"

	# config des logs

	# Activation du SSL
	SSLEngine On
	
	# config SSL
</VirtualHost>

#26

Bravo ! :slight_smile:
Tu as encore juste une petite erreur, avec cette fois la config Duniter pour WS2P.
Le endpoint (point d’accès) WS2P n’est pas bon, sur ta fiche de paire :

{
  ...
  "endpoints": [
    "BMAS duniter.normandie-libre.fr 443",
    "BASIC_MERKLED_API duniter.normandie-libre.fr 82.64.35.65 443",
    "WS2P dff60418 duniter.normandie-libre.fr 443 ws2p"
  ],
   ...
}

Le chemin pour la websocket devrait être /ws2p et non ws2p (manque le slash)


#30

Corrigé :slight_smile: Tous les services sont revenus après un redémarrage. Tout devrait être rentré dans l’ordre :slight_smile:


#31

En fait ce n’est pas une erreur, le / est facultatif dans le path du endpoint, Duniter le rajoute tout seul lorsqu’il requete le endpoint :wink: