Accéder a Home Assistant depuis l’extérieur en HTTPS avec un NDD Freebox et Let's Encrypt

Salut si tu peux mettre le code dans les balises stp pour voir si c’est pas un problème d’indentation.

Dans supervisor puis file editor va dans configuration de l’addon et regarde si enforced path est a false cela te permet de remonter dans l’arborescence et au dessus peut être tu trouvera le dossier SSL

Salut McFly,

Merci.
Effectivement, j’ai pu remonter l’arborescence en passant enforced path en « false ».
J’ai trouvé le dossier SSL et les fichiers fullchain.pem et privkey.pem, qui si j’en juge par leur date de création, correspondent bien à l’activation de Let’s Encrypt.
Donc je n’y touche pas ?
Pour le code le voici:


# Configure a default setup of Home Assistant (frontend, api, etc)
default_config

http:
    ssl_certificate: /ssl/fullchain.pem
    ssl_key: /ssl/privkey.pem

# Text to speech
tts:
  - platform: google_translate

group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

Merci pour ton aide

En retirant tous les « : » dans le fichier configuration.yaml je n’ai plus l’alerte.
par contre quand je vérifie la config, j’ai ce message d’erreur :
« Error loading /config/configuration.yaml: The configuration file configuration.yaml does not contain a dictionary »

De plus HA est passé en mode sans échec !
A l’aide :joy:

Mets les ::innocent:

default_config:

Salut Clemalex,

Effectivement, avec ces « : » derrière config cela fonctionne mieux !!!

Merci merci.
Maintenant, il faut voir si j’arrive à me reconnecter une fois HA redémarré !
Bonne journée

Salut Clemalex et McFly,

Parfait grâce à vous je peux accéder à HA à distance sur mon smartphone, mon ipad et mon PC ! youpi ! :innocent:
Merci pour votre patience
Très bonne journée à vous

2 « J'aime »

Merci beaucoup pour les explications

1 « J'aime »

Salut à tous,

Je m’explique.

J’ai FREE (box pop) derrière j’ai un routeur Asus qui me fournis une vrai bon WIFI mais aussi quand je change de FAI je n’ai pas tout à refaire :wink:

J’ai un Serveur WEB sur mon Ordi pro en WIFI, mon boss peut y accéder

Sur le box FREE
Port de début 80
Port de fin 80
Port de destination 80
IP Destination mon routeur Asus

sur mon Routeur
Port de début 80
Port de fin 80
Port de destination 80
IP Destination mon Ordi Pro

Côté Home Assistant
J’ai donc à côté un PI4 qui est branché en Ethernet à mon Routeur Asus
Pour l’instant j’y accède de l’extérieur via http://home.[domaine].com:8123

J’aurai préféré ne pas mettre 8123 mais je n’y arrive pas car je suis redirigé vers mon ordi pro :wink: logique

Comment faire ? là je suis dépassé, il faut un PROXY (hardware) entre mon routeur et mon ordi pro / Home assistant ?

j’essai de sécurisé mon accès HA via Let’s Encrypt

certfile: fullchain.pem
challenge: http
dns: {}
domains:
  - home.[mondomaine].com
email: [monemail]@gmail.com
keyfile: privkey.pem

LOG

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] file-structure.sh: executing... 
[cont-init.d] file-structure.sh: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
[15:59:56] INFO: Selected http verification
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for home.[mondomaine].com
Certbot failed to authenticate some domains (authenticator: standalone). The Certificate Authority reported these problems:
  Domain: home.[mondomaine].com
  Type:   unauthorized
  Detail: Invalid response from http://home.[mondomaine].com/.well-known/acme-challenge/_alOp3p04DBdho5yzhjWHjRgrBxI3DkujPpS7xVJdFg [82.65.94.210]: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>404 Not Found</title>\n</head><body>\n<h1>Not Found</h1>\n<p"
Hint: The Certificate Authority failed to download the challenge files from the temporary standalone webserver started by Certbot on port 80. Ensure that the listed domains point to this machine and that it can accept inbound connections from the internet.
Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
[cont-finish.d] executing container finish scripts...
[cont-finish.d] done.
[s6-finish] waiting for services.
[s6-finish] sending all processes the TERM signal.

Si ça vous parle :wink:
merci

Une solution serait de passer par ngnix proxy manager.

Sur ta freebox tu ouvres le 443 vers ton asus et sur ton asus tu ouvres aussi le 443 vers ton iplocalha:8123.

Ensuite dans nginx proxy manager tu ajoutes ton domaine home.domaine qui renvoit vers iplocalha:8123 et tu ajoutes aussi un ndd vers ton partage web.

1 « J'aime »

Bonjour,

Merci pour ce tuto, bien pratique pour configurer l’accès depuis l’extérieur en HTTPS.

J’ai une petite question.
Est-ce que le renouvellement se fait automatiquement ?

Je demande, car dans les logs du module complémentaire Let’s Encrypt, à la fin j’ai le message suivant :

This certificate expires on 2022-06-11.
These files will be updated when the certificate renews.
NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.

Merci.

Bonjour,
Pour l’instant je me contente de démarrer le module complémentaire Let’s Encript avant la date d’expiration.
Je viens d’ajouter l’intégration Expiration certificat, une entité avec la date d’expiration (mettre juste le domaine à la configuration).
image

Donc en fonction de la date on peut faire une automatisation pour démarrer l’Add On :wink:
image
Pas le temps ce soir mais je vais m’y pencher.
Bob

Hello @Bob !

Super ! J’ai aussi installé l’intégration Expiration Certificat.

Je n’avais pas pensé à cette solution d’automatiser le lancement d’un Addon.

Ça à l’air d’être une bonne solution. Je suis preneur du code de ton automatisation quand tu l’auras faites.

:wave:

J’ai fait ça avec Node Red, je partage dans la soirée :wink:
Bob

Bon je ne saurai que demain matin si ça fonctionne, je déclenche le flow Node Red au levé du soleil.
Par contre depuis Node Red je ne trouve pas comment appeler le service pour faire une addon_start de let’s encript !


Dans entity_id je n’ai pas Let’s Encript.

Donc j’ai fait un script HA que j’appelle depuis Node Red.

Le script :

alias: Renouvellement Certificat
sequence:
  - service: hassio.addon_start
    data:
      addon: core_letsencrypt
mode: single
icon: mdi:security

Dans Node Red, je prends la date du jour, la date de fin de validité du certificat, je converti en timestamp, je fais la différence et si elle est inférieure ou égale à 5 jours, je lance le script, pour le test j’ai mis 70 jours sachant qu’il est encore valide 64 jours.

Première valeur : date validité
Deuxième valeur : date du jour
Troisième valeur : nombre de jours avant expiration
J’ai laissé le « Inject » pour les tests pour l’instant.

J’utilise des variables globales pour pouvoir faire la différence car je ne vois pas comment différencier deux msg.payload ou msg.topic à l’entrée dans la fonction.

Si au réveil mon script s’est lancé, je partagerai le flow :slight_smile:
En lancement manuel, le script est bienexécuté :
image

Bob

1 « J'aime »

Mick,
Voici mon renouvellement automatique de certificat.
Je suis sous HA OS.
Le script appelé depuis Node Red qui lance l’Add On Let’s Encript et envoi une notification sur mon portable:

alias: Renouvellement Certificat
sequence:
  - service: hassio.addon_start
    data:
      addon: core_letsencrypt
  - service: notify.mobile_app_iphone_de_bob
    data:
      message: Démarrage Let's Encrypt
      title: Certificat SSL
mode: single
icon: mdi:security

Le flow Node Red, après test, remplacer dans le switch le 66 par 2 ou 3 :
Si je passe sun.sun à « below_horizon » dans outil de developpement, ça lance bien le flow et le script, je verrai au couché du soleil ce soir si ça fonctionne bien en automatique :wink:

[{"id":"1c21385eb72b028f","type":"tab","label":"Certificat","disabled":false,"info":"","env":[]},{"id":"cba922d97d245edc","type":"debug","z":"1c21385eb72b028f","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":910,"y":200,"wires":[]},{"id":"f2b9ad5c95cf94bf","type":"api-current-state","z":"1c21385eb72b028f","name":"Expiration certificat","server":"443ff1c5.63d78","version":2,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.cert_expiry_timestamp_mondomaine_fr","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":390,"y":200,"wires":[["642f1eec7ca4c701"]]},{"id":"9b1e1efe9b9c8efa","type":"ui_date_picker","z":"1c21385eb72b028f","name":"","label":"date","group":"7581546f.42c224","order":2,"width":0,"height":0,"passthru":true,"topic":"topic","topicType":"msg","className":"","x":350,"y":280,"wires":[["ccc10d5dde56fc26"]]},{"id":"642f1eec7ca4c701","type":"function","z":"1c21385eb72b028f","name":"Expir","func":"msg.payload = msg.payload.substring(0,msg.payload.length -15);\nmsg.payload = Date.parse(msg.payload) /1000;\nglobal.set('dateexpir', msg.payload);\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":200,"wires":[["cba922d97d245edc","403ea73e67190e45"]]},{"id":"1cd3b498c4ccc80a","type":"debug","z":"1c21385eb72b028f","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":910,"y":280,"wires":[]},{"id":"ccc10d5dde56fc26","type":"function","z":"1c21385eb72b028f","name":"Jour","func":"msg.payload = msg.payload /1000 ;\nmsg.payload = parseFloat(msg.payload).toFixed(0);\nmsg.payload = Number(msg.payload);\nglobal.set('datejour', msg.payload);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":280,"wires":[["1cd3b498c4ccc80a"]]},{"id":"403ea73e67190e45","type":"function","z":"1c21385eb72b028f","name":"DiffDate","func":"var datejour = global.get('datejour');\nvar dateexpir = global.get('dateexpir');\nvar tempsval = dateexpir - datejour;\ntempsval = ((tempsval /3600) /24);\ntempsval = parseFloat(tempsval).toFixed(0);\nmsg.payload = tempsval;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":740,"y":420,"wires":[["0cb5cb5bc50ed3d6","98e564e8e0240c5d"]]},{"id":"0cb5cb5bc50ed3d6","type":"debug","z":"1c21385eb72b028f","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":910,"y":420,"wires":[]},{"id":"98e564e8e0240c5d","type":"switch","z":"1c21385eb72b028f","name":"","property":"payload","propertyType":"msg","rules":[{"t":"lte","v":"66","vt":"str"},{"t":"gt","v":"66","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":750,"y":340,"wires":[["d35cac400d66e9f6"],[]]},{"id":"d35cac400d66e9f6","type":"api-call-service","z":"1c21385eb72b028f","name":"","server":"443ff1c5.63d78","version":3,"debugenabled":false,"service_domain":"script","service":"renouvellement_certificat","entityId":"","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":980,"y":340,"wires":[[]]},{"id":"31743c2828fef00c","type":"inject","z":"1c21385eb72b028f","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payloadType":"date","x":100,"y":180,"wires":[["f2b9ad5c95cf94bf","9b1e1efe9b9c8efa"]]},{"id":"031da89e7b5514d5","type":"server-state-changed","z":"1c21385eb72b028f","name":"","server":"443ff1c5.63d78","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sun.sun","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"below_horizon","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"10","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"date"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":120,"y":300,"wires":[["f2b9ad5c95cf94bf","9b1e1efe9b9c8efa"],[]]},{"id":"443ff1c5.63d78","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30},{"id":"7581546f.42c224","type":"ui_group","name":"Utilities","tab":"a577685a.d0bd48","order":3,"disp":true,"width":"6","collapse":false},{"id":"a577685a.d0bd48","type":"ui_tab","name":"Arbeitszimmer","icon":"dashboard","order":3}]

Top ! Merci à toi !

J’ai plus qu’a me pencher sur Node Red.
Je débute sur HA donc j’ai pas encore exploré toutes les possibilités. Mais ça m’as l’air assez puissant ce truc.

Ça fonctionne :+1:
Tu peux y aller, je verrai pour mettre un message avec la nouvelle date d’expiration.
Bonne soirée

Bonsoir,
Petit correctif, il fallait convertir en number dans le noeud « DiffDate »:

var datejour = global.get('datejour');
var dateexpir = global.get('dateexpir');
var tempsval = dateexpir - datejour;
tempsval = ((tempsval /3600) /24);
tempsval = parseFloat(tempsval).toFixed(0);
msg.payload = Number(tempsval);
return msg;

Bob

Hello la communauté!
J’ai une question qui me taraude :
Serait-il possible selon vous de mettre en œuvre cet accès si on n’est pas en IP full-stack chez Free çad que j’ai une IP fixe publique de type 9x.1xx.1xx.2xx (Ports 32768 à 49151) ?
Ou bien est-il impératif de passer par une IP full-stack?
Merci