Full-HTTPS support for Duniter package for YunoHost

J’ai développé une version modifiée de ce paquet Duniter pour YunoHost, l’URL pour installer l’application est https://github.com/c-geek/duniter_ynh.

Que fait précisément cette version modifiée ? Elle passe Duniter en mode full-HTTPS !

L’interface d’administration

Celle-ci devient accessible à l’adresse /webui, en HTTPS, et nécessite d’être authentifié sur son instance YunoHost. Exemple : https://gtest2.cgeek.fr/webui.

On a donc :

Vous <--HTTPS--> duniter.chez.vous.tld/webui

L’accès à son instance Cesium

Cesium est embarqué dans l’interface d’administration. L’accès à Cesium se fait donc également en HTTPS, connecté au nœud Duniter de la même instance YunoHost (en HTTPS aussi), et nécessite d’être authentifié.

On a alors :

Vous <--HTTPS--> duniter.chez.vous.tld/cesium <-- HTTPS --> duniter.chez.vous.tld (nœud)

Le nœud Duniter

Le nœud lui-même ne devient accessible qu’en HTTPS, sans requérir d’authentification puisque l’API est publique.

Ce qui signifie :

Quiconque <--HTTPS--> duniter.chez.vous.tld (nœud)

Tout cela est pré-configuré !

La configuration correcte du nœud est donc prise en charge par le paquet et est parfaitement cohérente avec l’environnement YunoHost. Techniquement, on a :

  • Duniter écoute sur localhost:<port_de_votre_choix>
  • Duniter est accessible via le nom de domaine choisi pendant l’installation, et sur le port 443 (HTTPS), via un reverse proxy Nginx. Exemple : https://gtest2.cgeek.fr/blockchain/current.
  • L’interface d’administration, tout comme Cesium, sont également gérés par Nginx et protégées par l’authentification YunoHost.

Bref, tout passe par les contrôles YunoHost, et donc chaque requête passe par le Nginx de votre YunoHost. Vous ne devriez donc plus avoir le moindre problème de configuration avec ce paquet.

N.B. : en vrai, vous pourriez encore avoir un message de “your node is not reachable”, mais cela sera corrigé avec Duniter v0.90.7.

Voilà, si vous avez une instance YunoHost vous pouvez tester, je m’en vais réaliser une PR pour officialiser tout cela dans le paquet officiel duniter/duniter_ynh.

Amusez-vous bien :slight_smile:

edit : à noter que Cesium pourrait tout aussi bien être accessible publiquement. Je mettrai peut-être une option pour cela.

edit 2 : hop c’est fait ! https://gtest2.cgeek.fr/cesium devrait être accessible publiquement du coup.

edit 3 : il se peut que les liens gtest2.cgeek.fr ne fonctionne plus quand vous cliquerez dessus, c’est un nœud de développement :grin:

7 Likes

Installation réussie mais J’ai des erreurs :

admin@Yunohost:~$ sudo yunohost app install https://github.com/c-geek/duniter_ynh
Available domains:
- vincentux.fr
- gtest.vincentux.fr
- searx.vincentux.fr
- ffsync.vincentux.fr
- jappix.vincentux.fr
- owncloud.vincentux.fr
- duniter-g1.vincentux.fr
Dedicated domain name on which no application must be installed. Install will be done on root path. (default: vincentux.fr): gtest.vincentux.fr
Path on which install the web admin (installable only on root path for now) (default: /): 
Port of Duniter node (default: 8999): 
Node's address (domain name or IP address) to synchronise with (default: duniter.org): gtest.duniter.org
Port of synchronization (default: 10900): 
Salt of your account. Let credentials as default if you don't have a Duniter account. It is editable on the web admin. (default: joe@example.tld): ***********
Password of your account (default: supersecretpassword): ************
Administrator. Must a YunoHost user.: vincentux
Make Cesium available publicly? [Yes | No] (default: Yes): 
Warning: 2017-02-15T09:58:01+00:00 - debug: Plugging file system...
Warning: 2017-02-15T09:58:01+00:00 - debug: Loading conf...
Warning: 2017-02-15T09:58:01+00:00 - debug: Configuration saved.
Warning: 2017-02-15T09:58:07+00:00 - debug: Plugging file system...
Warning: 
Warning: 2017-02-15T09:58:07+00:00 - debug: Loading conf...
Warning: 
Warning: 2017-02-15T09:58:07+00:00 - debug: Configuration saved.
Warning: 
Warning: 2017-02-15T09:58:12+00:00 - debug: Plugging file system...
Warning: 2017-02-15T09:58:12+00:00 - debug: Loading conf...
Warning: 2017-02-15T09:58:12+00:00 - debug: Configuration saved.
Warning: 2017-02-15T09:58:12+00:00 - debug: Opening SQLite database "/root/.config/duniter/duniter_default/duniter.db"...
Warning: 2017-02-15T09:58:13+00:00 - debug: Upgrade database...
Warning: 2017-02-15T09:58:22+00:00 - error: <html>
Warning: <head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
Warning: <body bgcolor="white">
Warning: <center><h1>400 Bad Request</h1></center>
Warning: <center>The plain HTTP request was sent to HTTPS port</center>
Warning: <hr><center>nginx</center>
Warning: </body>
Warning: </html>
Warning: 
Warning: 2017-02-15T09:58:24+00:00 - error:  Error: getaddrinfo ENOTFOUND fe80 fe80:60527
Warning:     at errnoException (dns.js:28:10)
Warning:     at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)
Warning: 2017-02-15T09:58:30+00:00 - error: <html>
Warning: <head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
Warning: <body bgcolor="white">
Warning: <center><h1>400 Bad Request</h1></center>
Warning: <center>The plain HTTP request was sent to HTTPS port</center>
Warning: <hr><center>nginx</center>
Warning: </body>
Warning: </html>
Warning: 
Warning: 2017-02-15T09:58:31+00:00 - error:  Error: getaddrinfo ENOTFOUND 2a01 2a01:58113
Warning:     at errnoException (dns.js:28:10)
Warning:     at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)
Warning: 2017-02-15T09:58:38+00:00 - debug: 0
Warning: 2017-02-15T09:58:47+00:00 - debug: 250
Warning: 2017-02-15T09:59:02+00:00 - debug: 500
Warning: 2017-02-15T09:59:16+00:00 - debug: 750
Warning: 2017-02-15T09:59:28+00:00 - debug: 1000
Warning: 2017-02-15T09:59:37+00:00 - debug: 1250
Warning: 2017-02-15T09:59:46+00:00 - debug: 1500
Warning: 2017-02-15T09:59:55+00:00 - debug: 1750
Warning: 2017-02-15T10:00:10+00:00 - debug: 2000
Warning: 2017-02-15T10:00:21+00:00 - debug: 2250
Warning: 2017-02-15T10:00:35+00:00 - debug: 2500
Warning: 2017-02-15T10:00:43+00:00 - debug: 2750
Warning: 2017-02-15T10:00:49+00:00 - debug: 3000
Warning: 2017-02-15T10:00:57+00:00 - debug: 3250
Warning: 2017-02-15T10:01:13+00:00 - debug: 3500
Warning: 2017-02-15T10:01:30+00:00 - debug: 3750
Warning: 2017-02-15T10:01:39+00:00 - debug: 4000
Warning: 2017-02-15T10:01:50+00:00 - debug: 4250
Warning: 2017-02-15T10:02:01+00:00 - debug: 4500
Warning: 2017-02-15T10:02:13+00:00 - debug: 4750
Warning: 2017-02-15T10:02:34+00:00 - debug: 5000
Warning: 2017-02-15T10:03:05+00:00 - debug: 5250
Warning: 2017-02-15T10:03:19+00:00 - debug: 5500
Warning: 2017-02-15T10:03:36+00:00 - debug: 5750
Warning: 2017-02-15T10:03:55+00:00 - debug: 6000
Warning: 2017-02-15T10:04:11+00:00 - debug: 6250
Warning: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Warning: nginx: configuration file /etc/nginx/nginx.conf test is successful
Success! The SSOwat configuration has been generated
Success! Installation complete

Cette erreur sera corrigée avec Duniter 0.90.7, c’est la même qui fait que la WebUI peut aussi afficher “your node is not reachable”.

Et concernant les erreurs IPv6, il faudrait tout simplement désactiver son utilisation par Duniter, par exemple en mettant “None” dans la WebUI > Settings > Network > IPv6.

Il y a aussi le liens dans l’interface de yunohost qui pointe sur
https://gtest.vincentux.fr
au lieu de https://gtest.vincentux.fr/webui

Oui, mais ça je ne peux malheureusement pas y toucher. J’ai bien tenté de mettre “/webui”, mais ça casse tout. Je ne connais pas encore tous les détails de fonctionnement de YunoHost ! :slight_smile: Mais c’est peut-être possible.

1 Like

Encore un autre bug ?
Quand je clique sur la vue réseau:

c’est plus lisible ici :

[network] Starting network from [gtest.vincentux.fr:443]  cesium-c7a6edbb73.js:4:24182
Error: The operation is insecure.
i/<@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5:9504
l@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5:8511
i@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5:9481
p/<.on@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5:9759
factory/O@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:4:23259
factory/C/<@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:4:24273
bn/b@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:12:29438
factory/C@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:4:23969
NetworkLookupController/e.load@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:2:9604
NetworkLookupController/e.enter/<@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:2:8862
s@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:12:27073
c/<@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:12:27245
$n/this.$get</h.prototype.$eval@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:13:2746
$n/this.$get</h.prototype.$digest@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:13:1250
$n/this.$get</h.prototype.$evalAsync/<@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:13:2835
i@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:11:14527
ut/u.defer/n<@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:11:15986
  vendor-8dd210e334.js:12:20010
Error: The operation is insecure.
i/<@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5:9504
l@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5:8511
i@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5:9481
p/<.on@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5:9759
BlockLookupController/e.startListenBlock@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:2:27160
BlockLookupController/e.enter@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:2:24643
BlockLookupController/e.enter/<@https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:2:24290
s@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:12:27073
c/<@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:12:27245
$n/this.$get</h.prototype.$eval@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:13:2746
$n/this.$get</h.prototype.$digest@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:13:1250
$n/this.$get</h.prototype.$evalAsync/<@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:13:2835
i@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:11:14527
ut/u.defer/n<@https://gtest.vincentux.fr/cesium/dist_js/vendor-8dd210e334.js:11:15986
  vendor-8dd210e334.js:12:20010
DOMException [SecurityError: "The operation is insecure."
code: 18
nsresult: 0x80530012
location: https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5]  cesium-c7a6edbb73.js:4:30008
DOMException [SecurityError: "The operation is insecure."
code: 18
nsresult: 0x80530012
location: https://gtest.vincentux.fr/cesium/dist_js/cesium-c7a6edbb73.js:5]  cesium-c7a6edbb73.js:4:30008

Oui et non. Oui, car tu t’attends à voir les nœuds comme sur http://gtest.duniter.fr. Non, car c’est une sécurité inhérente au navigateurs quand ils consultent un site HTTPS : le contenu HTTP simple, donc sécurisé, est bloqué.

D’où tous ces messages.

Pour le moment, on n’a pas vraiment de solution à ce problème. Autant considérer que cette vue n’est pas utilisable pour un Cesium en HTTPS.

1 Like

Bon, suite au problème JitHub qu’on rencontre, je souhaite faire avancer le schmilblick.

@cgeek, donc voici les questions que je me pose, avant de fusionner :

Voici les problèmes que j’ai résolut dans le commit que j’ai fait :

Et voici le commentaire global :

J’ai une copie du dépôt avec les deux commit que tu as fait et celui que j’ai ajouté.
Une fois les points ci-dessus éclaircis, je publierai \o/

Les fichiers de la WebUI (.js, .css, polices .woff, …) sont requêtées à la racine du domaine, pour une raison que j’ignore. Du coup je suis obligé de mettre cette ligne sinon la WebUI n’est pas chargée.

Le proxy_pass est nécessaire pour que les fichiers de la WebUI soient servis : c’est Duniter qui sert ces fichiers sur le port localhost:9220.

Quant à la ligne LUA, le fait de l’ajouter à chaque sous-partie de “location /” (qui se trouve en ligne 1) sans l’ajouter dans la partie principale permet de restreindre l’accès par token SSO uniquement aux sous-locations spécifiées.

Ainsi, YunoHost ne protège ici que les URLs : /webmin, /webui, /cesium, location ~ \.(js|css|woff|woff2|ttf). Et donc, l’API Duniter est accessible publiquement.

/webui n’est qu’un alias que j’ai dû utiliser pour la différencier des appels à /webmin dans Nginx, car /webmin est l’API Duniter qui permet de contrôler le nœud (elle est d’ailleurs utilisée par la WebUI). /webmin doit être protégée au même titre que la WebUI, c’est elle qui permet le contrôle sous-jacent.

L’admin web graphique est donc /webui, tandis que l’admin programmatique est /webmin. Les fichiers .js utilisés dans /webui font des appels à /webmin.

Normalement ce n’est plus nécessaire en effet. Je n’ai pas testé, mais il suffit simplement d’aller dans Cesium et vérifier qu’on voit bien son propre nœud dans la partie “Réseau”.

Oui très bien, mais je ne suis pas sûr de bien voir la correction avec ce git diff : as-tu simplement remplacé sudo yunohost app setting par ynh_app_setting_set ? Si oui, c’est bon.

Ceci est un bug, il manque une ligne dans le fichier upgrade :

is_cesium_public=$(ynh_app_setting_get "$app" is_cesium_public)

Je pense que l’upgrade fonctionnera après cette correction.

Oui, mais je n’ai pas réussi à le faire tout en gardant l’API accessible. Je ne sais pas si c’est une limite YunoHost, une incompréhension de ma part, ou autre chose.

Le plus simple serait d’avoir l’API sous /api, mais cela nécessiterait l’utilisation de BMAS avec suffixe de chemin (ex. : BMAS cgeek.fr 443 /api), et pour l’instant ni Sakia ni Cesium ne gère ce type de connexion. Donc l’API reste inutilisable dans ce mode.

Si l’API Duniter n’est pas joignable, l’intérêt de la PR devient nul. Donc pour le moment, je me suis contenté de bien préciser que la WebUI se trouve sous /webui.

Après, tu es juge. :slight_smile:

1 Like
  • Pour la configuration Nginx, c’est ok, merci pour les explications.

  • J’ai testé le patch pour Césium. Ça fonctionne bien sans. C’est corrigé dans un commit.

  • J’ai changé pour utiliser le helper.

  • En effet, pour mettre à jour à partir de cette version il n’y a pas de problème. J’ai rajouté la récupération de la variable dans le script d’upgrade.
    Par contre, cette variable n’existait pas avant, dans la version précédente. Du coup, l’app doit bien être réinstallée car la variable est vide et fait arrêté le script. C’est pas un souci mineur.[quote=“cgeek, post:9, topic:1892”]
    Oui, mais je n’ai pas réussi à le faire tout en gardant l’API accessible. Je ne sais pas si c’est une limite YunoHost, une incompréhension de ma part, ou autre chose.

Le plus simple serait d’avoir l’API sous /api, mais cela nécessiterait l’utilisation de BMAS avec suffixe de chemin (ex. : BMAS cgeek.fr 443 /api), et pour l’instant ni Sakia ni Cesium ne gère ce type de connexion. Donc l’API reste inutilisable dans ce mode.

Si l’API Duniter n’est pas joignable, l’intérêt de la PR devient nul. Donc pour le moment, je me suis contenté de bien préciser que la WebUI se trouve sous /webui.
[/quote]

Concernant ce point. Oui, il s’agit bien d’une limitation de YunoHost. Oui, on verra après lorsque BMAS sera adoptée.
J’ai documenté l’accès à l’interface d’admin et à l’API dans le readme.

Voici les commits : Commits · YunoHost-Apps/duniter_ynh · GitHub

1 Like

Je viens d’installer yunohost sur un raspberry pi, vous préférez des retours sur la version full-https ou la précédente?

Utilise la version https, elle gère beaucoup mieux l’interface web d’administration et Césium.
Après, pour les connexions API-nœuds, j’ai pas suffisamment testé ayant des bugs sous la 0.90.8.
J’attends le build ARM 0.90.9 pour tester ça plus en profondeur.
Je pense que ça va être tout bénef.
Sinon, tu peux passer en non https pour la connexion API-nœuds comme indiqué dans ce post.

autant installer celle qui te permettra de débusquer des bugs, et puis il me semble que le https est d’avenir.

Je viens de l’installer, https://duniter.ladouce.leprette.fr/ mais quand je vais dessus, je n’ai que le message suivant qui s’affiche :
{
“duniter”: {
“software”: “duniter”,
“version”: “0.90.8”,
“forkWindowSize”: 100
}
}

Est-ce que ça veut dire que tout va bien?
Si oui, une petite phrase pour le confirmer manque, du genre : “bravo, vous participez au maintien commun de la dune Gtest (ou G1…)”.

il faut que tu ajoute /webui à la fin de ton url

https://duniter.ladouce.leprette.fr/webui

2 Likes

Super, merci. Ce serait mieux que l’url du bouton Du dans son yunohost (côté utilisateur), inclut /webui, non?
En tout cas, bravo, c’est super simple et c’est très satisfaisant de se dire qu’on héberge un noeud sur un serveur perso (même si je faisais déjà tourné un noeud sur mon ordi).

Tu crois ? :smiley:

J’ai bien essayé, mais pour le moment c’est une limitation Duniter/YunoHost.

1 Like

Comme il y a déjà une mise à jour à faire, je me permets de recopier ici la ligne qui permet de mettre à jour Duniter (c’est dans le même genre pour cesium je suppose) sur ça machine. En effet, Moul expliquait que ces applications n’étant pas encore “officiels”, on ne pouvait pas les mettre à jour par l’interface web mais uniquement en ligne de commande.

pour la version full HTTPS:
sudo yunohost app upgrade duniter -u https://github.com/c-geek/duniter_ynh

pour l’autre version (je ne sais pas comment l’appeler)
sudo yunohost app upgrade duniter -u https://github.com/duniter/duniter_ynh

pour cesium (si vous auto hébergé cesium aussi)
sudo yunohost app upgrade cesium -u https://github.com/duniter/cesium_ynh

1 Like

La mise à jour de duniter ne s’est pas bien passé :

root@Yunohost:~# sudo yunohost app upgrade duniter -u https://github.com/c-geek/duniter_ynh
Attention : rm: impossible de supprimer « /usr/bin/duniter-desktop »: Aucun fichier ou dossier de ce type
Erreur : Impossible de mettre à jour duniter
Erreur : Aucune application à mettre à jour

J’essaye la mise à jour de cesium. Je verrai à réparé Duniter ensuite. J’ai un 50 bad gateway désormais sur
https://duniter.ladouce.leprette.fr/ avec webui aussi.

Super bien passé et rapide :
root@Yunohost:~# sudo yunohost app upgrade cesium -u https://github.com/duniter/cesium_ynh
Succès ! cesium a été mis à jour
Succès ! La configuration de SSOwat a été générée
Succès ! Mise à jour terminée

J’ai Cesium 10.1 sur https://ladouce.leprette.fr/cesium
Nickel.
Reste à reprendre Duniter…

Pour l’erreur bad gateway ça ne tient peut-être qu’à un duniter webrestart si l’appli n’a pas été désinstallée.
Je ne peux pas t’en dire plus, je suis sur le repo duniter/duniter_ynh et ça s’est bien passé pour moi