Il y a depuis plusieurs années une énorme activité de recherche et
de programmation pour développer des outils de communication sur
l'
Un bon exemple du problème posé par l'actuel système de noms de
domaine est donné dans un
article récent de TechDirt. Les lobbies qui veulent
artificiellement maintenir un modèle d'affaires menacé par l'Internet
sont très prompts à réclamer la suppression («
Comment est-ce que
Bon, et qu'est-ce qui empêche d'enregistrer plein de noms ? Ah, mais je n'ai pas dit que Namecoin était gratuit. Il faut payer, en namecoins. Cette monnaie s'obtient, comme les bitcoins, en minant, ou bien en l'achetant à quelqu'un d'autre. Cette seconde voie est plus facile, j'ai donc acheté mes namecoins sur Kraken.
Maintenant, place à la pratique. Pour créer un nom Namecoin, il
faut installer un nœud Namecoin. Je n'ai pas l'impression qu'il
existe, comme il y a pour Bitcoin,
un logiciel permettant de faire un client léger, ne minant pas et ne
validant pas. J'ai donc installé un nœud complet (la chaîne est bien
plus courte que celle de Bitcoin et il y a moins de mineurs donc le
travail est bien plus raisonnable). Une fois téléchargé et
compilé, le
% namecoin-cli getinfo
{
"version" : 37300,
"balance" : 0.11000000,
"blocks" : 157803,
"timeoffset" : -1,
"connections" : 8,
"proxy" : "",
"generate" : false,
"genproclimit" : -1,
"difficulty" : 1546423251.74634910,
"hashespersec" : 0,
"testnet" : false,
"keypoololdest" : 1389730666,
"keypoolsize" : 101,
"paytxfee" : 0.00000000,
"mininput" : 0.00010000,
"errors" : ""
}
On en est au bloc 157803 (on aurait pu avoir juste le numéro de bloc
avec
% date; namecoin-cli getblockcount
Thu Jan 16 10:01:01 CET 2014
84566
% date; namecoin-cli getblockcount
Thu Jan 16 10:11:11 CET 2014
92468
Mais la vitesse de progression de cette chaîne de blocs n'est pas du
tout prévisible, il vaut mieux être patient. Au bout du compte, une fois qu'on est synchrone (ou même avant mais,
dans ce cas, on ne verra pas ses propres transactions), on peut
commencer à travailler.
D'abord, le fric ! Créons une adresse pour recevoir des namecoins,
en indiquant un nom de compte (vous pouvez en avoir plusieurs, cela ne
sert que localement, pour gérer vos namecoins) :
% namecoin-cli getnewaddress bortzmeyer
Myw9PZkBDjjKpaCjSMnWNGrVd7AnDpQoBY
% namecoin-cli getreceivedbyaddress Myw9PZkBDjjKpaCjSMnWNGrVd7AnDpQoBY
0.00000000
(Vous avez vu, j'ai subtilement affiché mon adresse : si vous aimez
cet article, vous pouvez y envoyer des namecoins. Mais rappelez-vous
que tout est public, cela se verra, par
exemple avec l'explorateur.)
J'envoie ensuite depuis Kraken
des namecoins à cette adresse :
% namecoin-cli getreceivedbyaddress Myw9PZkBDjjKpaCjSMnWNGrVd7AnDpQoBY
0.09500000
Les sous sont arrivés, on va pouvoir créer des noms. (Si on était
sérieux, on commencerait par faire une sauvegarde des fichiers en
% namecoin-cli name_new bortzmeyer
[
"abd0330ed6d82e425...65d77bca37b3",
"3789f...a9d31"
]
Notez bien les deux nombres qui serviront par la suite. À ce stade,
n'est enregistré dans le livre des opérations qu'un
% namecoin-cli name_firstupdate bortzmeyer 3789fa452d9a9d31 abd0330ed6d82e4250a17d0bc8c709461c3a7218d59958efd2d965d77bca37b3 1
02cd4cc2283bbba6586e988ce141e1b6cfa3ceabc7752617fb0a99c15efafb93
(J'ai bien dit
À noter que, si vous aviez fait un
% namecoin-cli name_update bortzmeyer '{"email": "stephane+namecoin@bortzmeyer.org"}'
On peut voir que cela a bien été pris en compte. Du fait que le livre
des transactions est public, tout le monde peut voir toutes les
données :
% namecoin-cli name_filter bortzmeyer
[
{
"name" : "bortzmeyer",
"value" : "{\"email\": \"stephane+namecoin@bortzmeyer.org\"}",
"expires_in" : 35962
},
...
Attention, le JSON envoyé n'est pas testé et des erreurs de syntaxe
idiotes peuvent donc empêcher son interprétation. Il peut être prudent
de vérifier d'abord, par exemple avec .
Prêtez attention au membre
Date: Thu, 22 Jan 2015 09:45:02 -0000
From: alert@namealert.mvps.eu
To: stephane+namealert@bortzmeyer.org
Subject: Your domain d/bortzmeyer will soon expire
One of your Namecoin domains, d/bortzmeyer
will expire in 96 blocks.
Current rate is 150.027387087 blocks per day, so your domain
will expire in approximately 0 days.
(En fait, c'est théorique, Name Alert ne marche apparemment pas bien
et j'ai perdu
Bref, Namecoin reprend un des problèmes les plus énervants du système
des noms de domaine, l'obligation de veiller
à l'expiration et au renouvellement. Pour renouveler, vous
n'avez pas de commande spéciale, vous faites juste un
% namecoin-cli name_update d/bortzmeyer '{"ip":"204.62.14.153", "ip6":"2605:4500:2:245b::42", "email": "stephane+namecoin@bortzmeyer.org"}'
3393a1f8b428053c2b343deec3f3ff5ec10f360e9a7a82ae91606052c5edab76
Bien, nous avons maintenant une base de données fiable, à
l'intégrité vérifiable, et qui contient nos jolis noms. Nous pouvons
associer à ces noms des informations intéressantes comme l'adresse de
courrier ou comme des
domain-insecure: "bit"
stub-zone:
name: "bit"
stub-addr: 178.32.31.41
stub-addr: 78.47.86.43
stub-addr: 95.211.195.245
stub-addr: 2001:1af8:4020:a037:1::1000
stub-addr: 162.243.56.54
La première ligne est nécessaire puisque la racine du DNS est signée
avec
> DiG 9.8.4-rpz2+rl005.12-P1 <<>> ANY explorer.bit
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25144
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;explorer.bit. IN ANY
;; ANSWER SECTION:
explorer.bit. 86162 IN SOA ns0.web-sweet-web.net. root.srv01.web-sweet-web.net. (
2014010900 ; serial
21600 ; refresh (6 hours)
3600 ; retry (1 hour)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
explorer.bit. 86162 IN NS ns1.web-sweet-web.net.
explorer.bit. 86162 IN NS ns0.web-sweet-web.net.
explorer.bit. 86162 IN TXT "v=spf1 a mx ?all"
explorer.bit. 86162 IN A 178.32.102.200
explorer.bit. 86162 IN MX 5 srv01.web-sweet-web.net.
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sun Jan 19 18:29:24 2014
;; MSG SIZE rcvd: 202
]]>
C'est parfait, tout marche. Notez que cela laisse deux gros problèmes
de sécurité : ces serveurs publics faisant autorité pour
Avant de revenir à ces problèmes de sécurité et de montrer la
solution, un mot sur la publication. Est-ce qu'il suffit d'enregistrer
le nom
% namecoin-cli name_update d/bortzmeyer '{"ip":"204.62.14.153", "ip6":"2605:4500:2:245b::42"}'
46c5e87df04a491166d9c4a407007ed32b2a149362f52b7c5a65504362b84f70
Si vous avez vous-même un résolveur qui gère les
> DiG 9.8.4-rpz2+rl005.12-P1 <<>> AAAA bortzmeyer.bit
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42151
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;bortzmeyer.bit. IN AAAA
;; ANSWER SECTION:
bortzmeyer.bit. 86357 IN AAAA 2605:4500:2:245b::42
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sun Jan 19 18:40:44 2014
;; MSG SIZE rcvd: 71
]]>
Et comme j'ai en prime ajouté une directive
Comme on a une copie de toute la base des noms, des opérations
comme de trouver les données sur un nom sont triviales :
% namecoin name_filter d/bortzmeyer
[
{
"name" : "d/bortzmeyer",
"value" : "{\"ip\":\"204.62.14.153\",\"ip6\":\"2605:4500:2:245b::42\"}",
"expires_in" : 35666
}
]
(Notez le JSON dans le JSON...) On peut faire la même interrogation en
ligne via l'explorateur public : ou via n'importe quelle
passerelle comme DNSchain. Contrairement au système actuel des
noms de domaines, qui utilise deux protocoles complètement différents
pour distribuer les données, le
% namecoin name_filter d/explorer
[
{
"name" : "d/explorer",
"value" : "{\"info\":{\"registrar\":\"http://register.dot-bit.org\"},\"email\": \"register@dot-bit.org\",\"ns\":[\"ns0.web-sweet-web.net\",\"ns1.web-sweet-web.net\"],\"map\":{\"\":{\"ns\":[\"ns0.web-sweet-web.net\",\"ns1.web-sweet-web.net\"]}}}",
"expires_in" : 3859
}
]
Nous avions vu que la solution pour accéder aux domaines
% php namescan.php
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20100525+lfs/suhosin.so' - /usr/lib/php5/20100525+lfs/suhosin.so: cannot open shared object file: No such file or directory in Unknown on line 0
New blocks : 1
New names : 22
Write : /home/stephane/namecoin/NamecoinToBind/cache/getinfo_seri
New domains : 1
Write : /home/stephane/namecoin/NamecoinToBind/cache/names_block_seri
Write : /home/stephane/namecoin/NamecoinToBind/cache/bind_tree_seri
PHP Notice: Undefined variable: templateFile in /home/stephane/namecoin/NamecoinToBind/namescan.php on line 106
Write : /etc/bind/dotbit/db.namecoin.bit
PHP Notice: Undefined variable: statDir in /home/stephane/namecoin/NamecoinToBind/namescan.php on line 130
On peut ensuite dire au serveur de noms de charger ce fichier
zone "bit" {
type master;
file "/etc/bind/dotbit/db.namecoin.bit";
};
Attention, plusieurs noms dans Namecoin ont une syntaxe incorrecte
(pas pour le DNS, qui est tolérant, mais pour les règles plus strictes
que BIND suit par défaut) :
Jan 18 17:29:17 ludwigVII named[23967]: /etc/bind/dotbit/db.namecoin.bit:15421: jdt_test.bit: bad owner name (check-names)
Il doit y avoir une option de BIND pour être plus laxiste mais je ne
l'ai pas sous la main, j'ai donc supprimé manuellement. Évidemment, en production, il faudra trouver une solution plus
stable (et faire tourner
Notez qu'il existe une solution pratique pour accéder aux sites
Parmi les fonctions avancées (et, à ma connaissance, absolument pas déployées) de Namecoin, on peut noter un équivalent de DANE, documenté en et discuté en (discussion bien vieille ?) ou encore .
Merci notamment aux participants au canal