Date de publication du RFC : Juin 2021
Auteur(s) du RFC : S. Hollenbeck (Verisign Labs), A. Newton (AWS)
Chemin des normes
Réalisé dans le cadre du groupe de travail IETF regext
Première rédaction de cet article le 16 juin 2021
Le protocole d'information RDAP, qui vise à remplacer whois, est décrit dans un ensemble de RFC. Celui présenté ici normalise la façon de former les requêtes RDAP. Celles-ci ont la forme d'une URL, puisque RDAP repose sur l'architecture REST. Ce RFC remplace l'ancienne norme sur les requêtes RDAP, qui était dans le RFC 7482, mais il n'y a pas de changement significatif.
RDAP peut être utilisé pour beaucoup de sortes d'entités différentes mais ce RFC ne couvre que ce qui correspond aux usages actuels de whois, les préfixes d'adresses IP, les AS, les noms de domaine, etc. Bien sûr, un serveur RDAP donné ne gère pas forcément tous ces types d'entités, et il doit renvoyer le code HTTP 501 (Not implemented) s'il ne sait pas gérer une demande donnée. Ce RFC ne spécifie que l'URL de la requête, le format de la réponse est variable (JSON, XML...) et le seul actuellement normalisé, au-dessus de JSON, est décrit dans le RFC 9083. Quant au protocole de transport, le seul actuellement normalisé pour RDAP (dans le RFC 7480) est HTTP. D'autre part, ces RFC RDAP ne décrivent que le protocole entre le client RDAP et le serveur, pas « l'arrière-cuisine », c'est-à-dire l'avitaillement (création, modification et suppression) des entités enregistrées. RDAP est en lecture seule et ne modifie pas le contenu des bases de données qu'il interroge.
Passons aux choses concrètes. Une requête RDAP est un
URL (RFC 3986). Celui-ci est obtenu en ajoutant un chemin
spécifique à une base. La base (par exemple
https://rdap.example.net/
) va être obtenue par
des mécanismes divers, comme celui du RFC 7484, qui spécifie un registre que vous pouvez
trouver en ligne. On met ensuite un chemin qui dépend du type
d'entité sur laquelle on veut se renseigner, et qui indique
l'identificateur de l'entité. Par exemple, avec la base ci-dessus,
et une recherche du nom de domaine
internautique.fr
, on construirait un URL
complet
https://rdap.example.net/domain/internautique.fr
. Il
y a cinq types d'entités possibles :
ip
: les préfixes IP (notez qu'on peut chercher
un préfixe en donnant juste une des adresses IP couvertes par ce
préfixe),autnum
: les numéros de systèmes autonomes,domain
: un nom de domaine (notez que cela peut être un
domaine dans in-addr.arpa
ou
ipv6.arpa
),nameserver
: un serveur de
noms,entity
: une entité quelconque, comme
un bureau d'enregistrement, ou un contact
identifié par un handle.
La requête est effectuée avec la méthode HTTP
GET
(les méthodes permettant de modifier le
contenu du registre n'ont pas de sens ici, les modifications dans le
registre sont plutôt faites avec EPP). Pour juste savoir si un
objet existe, on peut aussi utiliser la méthode
HEAD
. Si on n'obtient pas de code 404, c'est
que l'objet existe.
Pour ip
, le chemin dans l'URL est
/ip/XXX
où XXX
peut être
une adresse IPv4 ou
IPv6 sous forme texte. Il peut aussi y avoir
une longueur de préfixe à la fin donc
/ip/2001:db8:1:a::/64
est un chemin
valable. Ainsi, sur le service RDAP du RIPE-NCC,
https://rdap.db.ripe.net/ip/2001:4b98:dc0:41::
est un URL possible. Testons-le avec curl (le format de sortie, en JSON, est décrit dans
le RFC 9083, vous aurez peut-être
besoin de passer le résultat à travers jq
pour l'afficher joliment) :
% curl https://rdap.db.ripe.net/ip/2001:4b98:dc0:41:: { "handle" : "2001:4b98:dc0::/48", "startAddress" : "2001:4b98:dc0::/128", "endAddress" : "2001:4b98:dc0:ffff:ffff:ffff:ffff:ffff/128", "ipVersion" : "v6", "name" : "GANDI-HOSTING-DC0", "type" : "ASSIGNED", "country" : "FR", "rdapConformance" : [ "rdap_level_0" ], "entities" : [ { "handle" : "GAD42-RIPE", "vcardArray" : [ "vcard", [ [ "version", { }, "text", "4.0" ], [ "fn", { }, "text", "Gandi Abuse Department" ], [ "kind", { }, "text", "group" ], [ "adr", { "label" : "63-65 Boulevard Massena\n75013 Paris\nFrance" ...
J'ai utilisé curl mais, notamment pour formater plus joliment la sortie de RDAP, les vrais utilisateurs se serviront plutôt d'un client RDAP dédié comme RDAPBrowser sur Android, ou nicinfo. Voici une vue de RDAPbrowser:
Pour autnum
, on met le numéro de
l'AS après
/autnum/
(au format
« asplain
» du RFC 5396). Toujours dans l'exemple RIPE-NCC,
https://rdap.db.ripe.net/autnum/208069
permet de
chercher de l'information sur l'AS
208069 :
% curl https://rdap.db.ripe.net/autnum/208069 { "handle" : "AS208069", "name" : "ATAXYA", "type" : "DIRECT ALLOCATION", "entities" : [ { "handle" : "mc40833-RIPE", "roles" : [ "administrative", "technical" ], "objectClassName" : "entity" }, { ...
Pour les noms de domaines, on met le nom après
/domain/
. Ainsi, sur le serveur RDAP d'Afilias,
https://rdap.afilias.net/rdap/info/domain/rmll.info
nous donnera de l'information sur le domaine
rmll.info
. On peut mettre un nom en
Unicode donc
https://rdap.example.net/domain/potamochère.fr
est valable, mais il devra être encodé comme l'explique la section
6.1, plus loin (en gros, UTF-8 en
NFC). Si on ne veut pas lire cette
information sur l'encodage, on peut aussi utiliser la forme
Punycode, donc chercher avec
https://rdap.example.net/domain/xn--potamochre-66a.fr
. Un
exemple réel, en Russie :
% curl https://api.rdap.nic.рус/domain/валфекс.рус ... { "eventAction": "registration", "eventDate": "2018-12-26T07:53:41.776927Z" }, ... "adr", { "type": "Registrar Contact" }, "text", [ "", "", "125476, g. Moskva, ul. Vasilya Petushkova, dom 3, str. 1", "", "", "", "RU" ] ] ...
(Attention, le certificat ne sera accepté par curl que si curl a été compilé avec l'option « IDN ».)
On peut aussi se servir de RDAP pour les noms de domaines qui servent à traduire une adresse IP en nom :
% curl https://rdap.db.ripe.net/domain/1.8.a.4.1.0.0.0.0.d.1.4.1.0.0.2.ip6.arpa { "handle" : "0.d.1.4.1.0.0.2.ip6.arpa", "ldhName" : "0.d.1.4.1.0.0.2.ip6.arpa", "nameServers" : [ { "ldhName" : "dns15.ovh.net" }, { "ldhName" : "ns15.ovh.net" } ], "rdapConformance" : [ "rdap_level_0" ], "entities" : [ { "handle" : "OK217-RIPE", "roles" : [ "administrative" ] }, { "handle" : "OTC2-RIPE", "roles" : [ "zone", "technical" ] }, { "handle" : "OVH-MNT", "roles" : [ "registrant" ] } ], "remarks" : [ { "description" : [ "OVH IPv6 reverse delegation" ] } ], ...
Pour un serveur de noms, on met son nom après
/nameserver
donc, chez Afilias :
% curl https://rdap.afilias.net/rdap/info/nameserver/rmll1.rmll.info { ... "ipAddresses": { "v4": [ "80.67.169.65" ] }, "lang": "en", "ldhName": "rmll1.rmll.info", ...
Pour entity
, on indique juste un
identificateur. Voici un exemple :
% curl http://rdg.afilias.info/rdap/entity/81 { "handle": "81", "lang": "en", ... "roles": [ "registrar" ], "vcardArray": [ "vcard", [ [ "version", {}, "text", "4.0" ], [ "fn", {}, "text", "Gandi SAS" ], [ "adr", {}, "text", [ "", "", "63-65 boulevard Massena", "Paris", "", "F-75013", "FR" ] ...
Certains registres, qui stockent d'autres types d'objets,
pourront ajouter leurs propres requêtes, en prenant soin
d'enregistrer les préfixes de ces requêtes dans le
registre IANA. Par exemple, le logiciel de gestion de
registres FRED permet
d'interroger le registre sur les clés DNSSEC avec les requêtes
/fred_keyset
(la syntaxe des requêtes locales est identificateur du préfixe +
tiret bas + type cherché).
Dernière possibilité, un chemin spécial indique qu'on veut
récupérer de l'aide sur ce serveur RDAP particulier. En envoyant
help
(par exemple
https://rdap.example.net/help
), on obtient un
document décrivant les capacités de ce serveur, ses conditions
d'utilisation, sa politique vis-à-vis de la vie
privée, ses possibilités d'authentification (via les
mécanismes de HTTP), l'adresse
où contacter les responsables, etc. C'est l'équivalent de la
fonction d'aide qu'offrent certains serveurs whois, ici celui de
l'AFNIC :
% whois -h whois.nic.fr -- -h ... %% Option Function %% ------- ------------------------------------- %% -r turn off recursive lookups %% -n AFNIC output format %% -o old fashioned output format (Default) %% -7 force 7bits ASCII output format %% -v verbose mode for templates and help options %% (may be use for reverse query) %% -T type return only objects of specified type %% -P don't return individual objects in case of contact search %% -h informations about server features %% -l lang choice of a language for informations (you can specify US|EN|UK for %% english or FR for french) %% ...
Pour RDAP, voyez par exemple
(qui renvoie de
l'HTML), ou,
plus austères et se limitant à un renvoi à une page Web,
https://rdap.nic.bzh/help
ou
http://rdap.apnic.net/help
.https://rdap.nic.cz/help
Toutes les recherches jusque-là ont été des recherches exactes
(pas complètement pour les adresses IP, où on pouvait chercher un
réseau par une seule des adresses contenues dans le réseau). Mais on
peut aussi faire des recherches plus ouvertes, sur une partie de
l'identificateur. Cela se fait en ajoutant une requête (la partie
après le point
d'interrogation) dans l'URL et en ajoutant un
astérisque (cf. section 4.1). Ainsi,
https://rdap.example.net/domains?name=foo*
cherchera tous les domaines dont le nom commence par la chaîne de
caractères foo
. (Vous avez noté que c'est
/domains
, au pluriel, et non plus
/domain
?) Voici un exemple d'utilisation :
% curl https://rdap.afilias.net/rdap/info/domains\?name=rm\* ... "errorCode": 422, "title": "Error in processing the request", "description": [ "WildCard search is not supported on sub-zone or tld" ] ...
Eh oui, les requêtes ouvertes comme celle-ci posent à la fois des problèmes techniques (la charge du serveur) et politico-juridiques (la capacité à extraire de grandes quantités de la base de données). Elles sont donc typiquement utilisables seulement après une authentification.
On peut aussi chercher un domaine d'après ses serveurs de noms,
par exemple
https://rdap.example.net/domains?nsLdhName=ns1.example.com
chercherait tous les domaines délégués au serveur DNS
ns1.example.com
. Une telle fonction peut être
jugée très indiscrète et le serveur RDAP est toujours libre de
répondre ou pas mais, ici, cela marche, on trouve bien le domaine
qui a ce serveur de noms :
% curl https://rdap.afilias.net/rdap/info/domains\?nsLdhName=ns0.abul.org ... "domainSearchResults": [ { "objectClassName": "domain", "handle": "D10775367-LRMS", "ldhName": "rmll.info", ...
Deux autres types permettent ces recherches ouvertes,
/nameservers
(comme dans
https://rdap.example.net/nameservers?ip=2001:db8:42::1:53
,
mais notez qu'on peut aussi chercher un serveur par son nom) et
/entities
(comme dans
https://rdap.example.net/entities?fn=Jean%20Dupon*
) :
% curl http://rdg.afilias.info/rdap/entities\?fn=go\* { "entitySearchResults": [ { "fn": "Go China Domains, Inc.", ... "fn": "Gotnames.ca Inc.", ...
Notez que ce type de recherche peut représenter un sérieux danger pour la vie privée (comme noté dans le RFC, par exemple en section 4.2) puisqu'elle permet, par exemple de trouver tous les titulaires prénommés Jean. Elle est donc parfois uniquement accessible à des clients authentifiés, et de confiance.
La section 4 détaille le traitement des requêtes. N'oubliez pas qu'on travaille ici sur HTTP et que, par défaut, les codes de retour RDAP suivent la sémantique HTTP (404 pour un objet non trouvé, par exemple). Il y a aussi quelques cas où le code à retourner est moins évident. Ainsi, si un serveur ne veut pas faire une recherche ouverte, il va répondre 422 (Unprocessable Entity).
Vous avez noté plus haut, mais la section 6 le rappelle aux
distraits, que le nom de domaine peut être exprimé en
Unicode ou en ASCII. Donc,
https://rdap.example.net/domain/potamochère.fr
et
https://rdap.example.net/domain/xn--potamochre-66a.fr
sont deux requêtes acceptables.
Enfin, la section 8 rappelle quelques règles de sécurité comme :
Les changements depuis le RFC 7482 sont peu nombreux et sont surtout de clarification.
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)