# tools/keygen
https://chaton.g1sms.fr/
La transmutation de clef est un processus qui permet de créer un ensemble cohérent de clés cryptographiques pour différents usages à partir d'une seule clé initiale. Voici ce que produit cette transmutation :
## Clés générées
1. **Clé SSH (ED25519)** : Une nouvelle paire de clés SSH est créée, composée d'une clé privée et d'une clé publique. Cette clé permet une authentification sécurisée pour les connexions SSH.
2. **Clé IPFS (Node ID)** : Une clé IPFS est générée, qui sert d'identifiant unique (IPFSNODEID) pour le nœud IPFS de l'utilisateur. Cette clé permet au nœud de participer au réseau IPFS de manière sécurisée.
3. **Clé G1 (Duniter)** : Une clé compatible avec le réseau Duniter (G1PUB) est créée, permettant à l'utilisateur de participer à ce réseau de cryptomonnaie.
## Cohérence cryptographique
L'aspect crucial de cette transmutation est que toutes ces clés sont dérivées de la même source (NaCl : salt, pepper), assurant ainsi une cohérence cryptographique entre les différentes identités numériques de l'utilisateur. Cela signifie que :
- L'identité SSH de l'utilisateur est liée de manière cryptographique à son identité IPFS.
- Le nœud IPFS de l'utilisateur est directement associé à son identité sur le réseau Duniter (G1).
## Avantages
Cette approche offre plusieurs avantages :
1. **Simplicité de gestion** : L'utilisateur n'a qu'un seul ensemble de secrets à gérer et sauvegarder.
2. **Identité cohérente** : Tous les services (SSH, IPFS, Duniter) utilisent des clés liées, renforçant l'unicité de l'identité numérique de l'utilisateur.
3. **Sécurité renforcée** : L'utilisation de courbes elliptiques (ED25519) offre un haut niveau de sécurité avec des clés de taille réduite.
4. **Interopérabilité** : Cette approche facilite l'intégration et l'utilisation de différents services décentralisés (comme IPFS et Duniter) de manière cohérente.
## Résultat final
Après la transmutation, l'utilisateur dispose d'un ensemble de clés interconnectées qui lui permettent de :
- Se connecter de manière sécurisée via SSH
- Participer au réseau IPFS avec un identifiant unique
- Interagir avec le réseau Duniter (G1) et rejoindre la toile de confiance [/Dragons](/s/Dragons)
cette procédure garantie au collectif auto-hébergeur Web3 que chaque ```/home/user``` possède des connaissances en [/SHELL](/SHELL), [/GIT](/GIT), ( [/Blockchain](/Blockchain) , [/Docker](/Docker) ... la liste s'étoffe selon votre participation et les services que vous activez ...
Tout cela en maintenant une cohérence cryptographique entre ces différentes identités numériques, renforçant ainsi la sécurité et la gestion de son identité en ligne.
* SECURITE :
désactiver la connexion par login/password dans le fichier
```/etc/ssh/sshd_config```
```
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
# optionnel : activer le forward X11
X11Forwarding yes
ClientAliveInterval 60
ClientAliveCountMax 3
```
> "Astroport.ONE" se charge de la relier à IPFS ... Offrant à votre clef, un canal de communication décentralisé, une "toile de confiance dynamique" et un plan d'adressage "Off Grid".
# Link IPFSNODEID & ed25519 SSH user key
Nous allons convertir la clef ssh au format IPFS afin de l'associer au PeerID de votre Station Astroport.
1. Convert id_ed25519 to ipfs & ssh key
Le sha512 du fichier ```~/.ssh/id_ed25519``` est coupé en 2 pour fabriquer salt et pepper pour gérérer une clef par NaCl
```
mkdir -p ~/.zen/game
## Convert SSH key into IPFS key (Node ID)
if [[ -s ~/.ssh/id_ed25519 ]]; then
SSHASH=$(cat ~/.ssh/id_ed25519 | sha512sum | cut -d ' ' -f 1)
SECRET1=$(echo "$SSHASH" | cut -c 1-64) && echo "SECRET1=$SECRET1"
SECRET2=$(echo "$SSHASH" | cut -c 65-128) && echo "SECRET2=$SECRET2"
SSHYNODEID=$(~/.zen/Astroport.ONE/tools/keygen -t ipfs "$SECRET1" "$SECRET2")
echo "SSHYNODEID=$SSHYNODEID" \
~/.zen/Astroport.ONE/tools/keygen -t ipfs \
-o ~/.zen/game/secret.ipns "$SECRET1" "$SECRET2"
## Convert IPFS key to Duniter key (G1 Wallet)
~/.zen/Astroport.ONE/tools/keygen -i ~/.zen/game/secret.ipns -t duniter \
-o ~/.zen/game/secret.dunikey
## CREATE NEW SSH KEY
~/.zen/Astroport.ONE/tools/keygen -t ssh \
-o ~/.zen/game/id_ssh "$SECRET1" "$SECRET2"
```
Résulte la création de clefs jumelles
* ```~/.zen/game/id_ssh(.pub)```
* ```~/.zen/game/secret.dunikey```
* ```~/.zen/game/secret.ipns```
Cette cérémonie de transmutation de clef SSH en une nouvelle vous permet d'être sûr qu'elle ne dérive pas d'une autre clef et vous permet d'en profiter dans sa version IPFS, et G1, mais également Bitcoin et même Monero...
2. IPFS daemon New PeerID & PrivKey
```
PeerID=$(~/.zen/Astroport.ONE/tools/keygen -i ~/.zen/game/secret.ipns -t ipfs)
echo $PeerID
PrivKey=$(~/.zen/Astroport.ONE/tools/keygen -i ~/.zen/game/secret.ipns -t ipfs -s)
echo $PrivKey
```
3. Modify IPFS Node identity
```
~/.zen/Astroport.ONE/stop.sh
# Backup actual Node ID
cat ~/.ipfs/config | jq -r '.Identity.PeerID' \
> ~/.zen/game/ipfsnodeid.bkp
cat ~/.ipfs/config | jq -r '.Identity.PrivKey' \
>> ~/.zen/game/ipfsnodeid.bkp
# Insert new Node ID
cp ~/.ipfs/config ~/.ipfs/config.bkp
jq '.Identity.PeerID="'$PeerID'"' ~/.ipfs/config > ~/.ipfs/config.tmp
jq '.Identity.PrivKey="'$PrivKey'"' ~/.ipfs/config.tmp > ~/.ipfs/config && rm ~/.ipfs/config.tmp
# Verify & restart IPFS daemon
[[ "$(cat ~/.ipfs/config | jq -r '.Identity.PrivKey' )" != "$PrivKey" ]] \
&& blurp="ERROR" \
|| blurp="SUCCESS"
echo ${blurp}
## SUCCESS
## supprimer les anciennes clef de SWARM
rm ~/.zen/game/myswarm_secret.*
## Réactivation Astroport.ONE
~/.zen/Astroport.ONE/start.sh
```
Désormais la "Balise" IPNS de votre Station est liée à votre clef SSH qu'il ne vous reste plus qu'à déplacer vers ```~/.ssh/``` du compte où vous avec installé "Astroport.ONE". Cette "action manuelle" atteste de votre action et permet aux comptes "Capitaine" d'activer leurs propre essaim privé (min 3 machines).
---
> **La jonction "Y" vient de se faire.**
Votre clef se décline depuis SSH vers IPFSNODEID et NODEG1PUB
```
NODEG1PUB=$(cat ~/.zen/game/secret.dunikey | grep 'pub:' | cut -d ' ' -f 2)
echo ${NODEG1PUB}
```
## Toile de confiance **/Dragons**
Les utilisateurs ayant suivi cette procédure forment **une toile de confiance technique** qui pourra être utilisée au travers de "Astroport.ONE"
```
sudo systemctl restart astroport
```
o o
\ /
o o o o o o
\ / | / \ /
o o - o o - o
| / \ / /
o - o o - ♥ - o - o
\ / \ / \ \
o - o o o o o
/ \ \ \ /
o o - o o o - o
/
o
Astroport va utiliser la clef IPFS comme balise de publication avec les autres Stations de l'essaim.
(12345) Etat de synchronisation de la stations avec son essaim :
* http://localhost:12345
* https://astroport.copylaradio.com/12345
---
## DeltaChat
On pourra importer sa clef dans DeltaChat pour établir une messagerie privée email
https://delta.chat/en/help#can-i-reuse-my-existing-private-key
Reference : [how to use gpg key for ssh authentication with an agent?](https://security.stackexchange.com/questions/276688/now-that-sshcontrol-has-been-deprecated-how-to-use-gpg-key-for-ssh-authentica)
---
La suite est optionnelle, elle vous permet de sécuriser vos identité numérique sur clef USB et "clef ssss 3/5"
## PGP SSH key
le principe de la WoT des Dragons est de permettre un accès SSH aux machines relié à l'essaim "Boostrap".
Nous allons créer une clef au format courbe elyptique ED25519 (plus sécurisé que RSA) qui sera ensuite utilisée par SSH comme identifiant "USER".
Au lieu de créer sa clef avec ```ssh-keygen```
```
echo "ENTER EMAIL?"
read EMAIL
ssh-keygen -t ed25519 -C ${EMAIL,,}
```
**Pour utiliser PGP**
https://docs.github.com/fr/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
# OPTION YUBIKEY/NITROKEY
https://xieme-art.org/post/importer-des-clefs-gnupg-dans-sa-nitrokey-pro/
Avec [pgpid](https://codeberg.org/foopgp/pgpid)
<details>
<summary>./bin/pgpid-gen -f "2024-09-18 G1FabLab Tlse" ~/Images/sagittarius.png</summary>
```
Where to print the 4 QRcodes ?
1) HP_DeskJet_2800_series_08DAAC
2) PDF
Reply (1-2) [2] ? 2
Birth date (YYYY-mm-dd) [9-18- G-1F] ? 2024-09-18
<13>Sep 18 12:03:19 pgpid-gen[2653098]: Notice: Displaying face... close it to continue !
<11>Sep 18 12:03:19 pgpid-gen[2653098]: Error: gm display: Unable to load font (-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1).
Did the image correspond to (2024-09-18 G1FabLab Tlse) (y/n) ? y
Public email adress ? sagittarius@g1sms.fr
Public name (or pseudonym) ? sagittarius
Public name (or pseudonym): sagittarius
Public email adress: sagittarius@g1sms.fr
Is that correct (y/n) ? y
Would you like to add an second public email adress (y/n) ? n
<13>Sep 18 12:03:51 pgpid-gen[2653098]: Notice: gpg: le trousseau local « /home/frd/workspace/pgpid/PUB_2024-09-18 G1FabLab Tlse/gnupg/pubring.kbx » a été créé
<13>Sep 18 12:03:51 pgpid-gen[2653098]: Notice: gpg: Generating OpenPGP key for sagittarius
<13>Sep 18 12:03:53 pgpid-gen[2653098]: Notice: gpg: /home/frd/workspace/pgpid/PUB_2024-09-18 G1FabLab Tlse/gnupg/trustdb.gpg : base de confiance créée
<13>Sep 18 12:03:53 pgpid-gen[2653098]: Notice: gpg: répertoire « /home/frd/workspace/pgpid/PUB_2024-09-18 G1FabLab Tlse/gnupg/openpgp-revocs.d » créé
<13>Sep 18 12:03:54 pgpid-gen[2653098]: Notice: gpg: revocation certificate stored as '/home/frd/workspace/pgpid/PUB_2024-09-18 G1FabLab Tlse/gnupg/openpgp-revocs.d/EF3263087774FF459680CECF445634CB3292B199.rev'
<13>Sep 18 12:03:54 pgpid-gen[2653098]: Notice: gpg: vérification de la base de confiance
<13>Sep 18 12:03:54 pgpid-gen[2653098]: Notice: gpg: marginals needed: 3 completes needed: 1 trust model: pgp
<13>Sep 18 12:03:54 pgpid-gen[2653098]: Notice: gpg: profondeur : 0 valables : 1 signées : 0
<13>Sep 18 12:03:54 pgpid-gen[2653098]: Notice: confiance : 0 i., 0 n.d., 0 j., 0 m., 0 t., 1 u.
<13>Sep 18 12:03:54 pgpid-gen[2653098]: Notice: gpg: la prochaine vérification de la base de confiance aura lieu le 2035-09-18
/home/frd/workspace/pgpid
Number of copies ?
1) 2) 3)
Reply (1-3) [1] ? 1
```
</details>
<details>
<summary>./bin/pgpid-qrscan ~/PDF/SECRET-042-job_1.pdf ~/PDF/SECRET-121-job_2.pdf ~/PDF/SECRET-208-job_4.pdf</summary>
```
Birth date (YYYY-mm-dd) ? 2024-09-18
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: données chiffrées avec AES256.CFB
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: le trousseau local « /tmp/pgpid-qrscan.bxvEjs/gnupg/pubring.kbx » a été créé
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: chiffré avec 1 phrase secrète
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: /tmp/pgpid-qrscan.bxvEjs/gnupg/trustdb.gpg : base de confiance créée
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: clef 445634CB3292B199 : clef publique « sagittarius (2024-09-18 G1FabLab Tlse) <sagittarius@g1sms.fr> » importée
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: clef 445634CB3292B199 : clef secrète importée
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: Quantité totale traitée : 1
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: importées : 1
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: clefs secrètes lues : 1
<13>Sep 18 12:12:26 pgpid-qrscan[2664257]: Notice: gpg: clefs secrètes importées : 1
```
</details>
```
export GNUPGHOME=/tmp/pgpid-qrscan.bxvEjs/gnupg/
~/.zen/Astroport.ONE/tools/keygen -g -t ipfs -o ~/.zen/game/secret.ipns sagittarius@g1sms.fr
# CODE : 20240918
```
1. Créer sa clé ed25519 avec gpg
```
## GET EMAIL & PIN password
echo "ENTER EMAIL?"
read EMAIL
EMAIL=${EMAIL,,} # lowercase
echo "ENTER PIN?"
read PIN
gpg --batch --passphrase="${PIN}" --default-new-key-algo "ed25519/cert,sign,auth+cv25519/encr" --quick-generate-key "${EMAIL}"
```
* Configurer son agent gpg
*This is useless on recent GNU/Linux Distribution (since ~2020)*
```
echo "enable-ssh-support" >> ~/.gnupg/gpg-agent.conf
gpg -k --with-keygrip ${EMAIL} |awk '/Keygrip/ {print $3; exit}' >> ~/.gnupg/sshcontrol
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent
echo ${SSH_AUTH_SOCK}
```
* Mettre à jour son .bashrc
```
echo "export SSH_AUTH_SOCK=\$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent" >> ~/.bashrc
```
* Afficher les clés publiques ssh
```
# SSH
ssh-add -L
# PGP
gpg --export-ssh-key ${EMAIL}
```
Désormais votre clef SSH fait partie d'un trousseau PGP.