web-dev-qa-db-fra.com

Quel est le nombre maximum de caractères pour un nom d'hôte sous Unix?

Je me demande quel est le nombre maximum de caractères pour un nom d'hôte dans un système Unix. De plus, y a-t-il une variable définie qui peut être utilisée dans la programmation Unix pour appeler ce numéro? (c'est-à-dire le nombre de caractères autorisés pour un nom d'hôte).

Je programme en C.

50
CompilingCyborg

Vous pouvez généralement taper:

getconf Host_NAME_MAX

De plus, vous pouvez généralement inclure limits.h à votre application et lire la valeur de define.

Bien que la norme POSIX indique qu'il est garanti de ne pas dépasser 255 octets, cela ne signifie pas nécessairement que chaque implémentation y adhérera.

man gethostname sur votre plateforme pour obtenir des informations plus détaillées.

62
Michael

tl; dr :

Le code doit traiter les noms d'hôte jusqu'à 255 octets de long; les administrateurs doivent conserver la longueur du nom d'hôte (à l'exclusion du domaine) dans les 19 octets et la longueur du nom de domaine (à l'exclusion des noms d'hôte) dans les 23 octets.

  • Les noms d'hôte peuvent être aussi longs que 255 octets (certains systèmes peuvent les limiter à 64)
  • Les noms d'hôte utilisés dans DNS peuvent être aussi longs que 253 octets comme un nom de domaine complet (FQDN = Host.example.com), dans quel cas:
    • La première étiquette DNS (en supprimant . et tout ce qui vient du nom d'hôte) ne peut contenir que 63 octets
    • La limite de 253 octets s'applique au FQDN entier, même si seule la première étiquette est utilisée pour le nom d'hôte Unix
  • Les noms d'hôtes utilisés dans les adresses e-mail ne doivent pas dépasser 245 octets (pour la limite de nom d'utilisateur traditionnelle à 8 caractères) ou 221 octets (longueur maximale de nom d'utilisateur moderne de 32) en tant que nom de domaine complet
  • Les noms d'hôte utilisés pour les certificats TLS/SSL du serveur ne doivent pas dépasser 64 octets en tant que nom de domaine complet
  • Les noms d'hôte utilisés pour les adresses e-mail dans les certificats générés par OpenSSL ne doivent pas dépasser 31 octets (pour la limite de nom d'utilisateur traditionnelle à 8 caractères) en tant que nom de domaine complet ( les noms d’utilisateur supérieurs à 8 réduisent cette limite)
  • S'il y a des caractères non ASCII dans la soustraction du nom d'hôte 4 pour chaque étiquette de domaine non ASCII (partie entre . caractères) de toutes les limites ci-dessus et soustrayez 1 à 2 octets supplémentaires (sans compter la surcharge de codage UTF-8 de 1 à 2 octets supplémentaires par caractère) pour chaque caractère non ASCII.

Version longue:

Comme le dit @Michael, les noms d'hôte POSIX sont généralement limités à 255 octets, et comme le souligne @zrvan, DNS limite la longueur de chaque étiquette dans RFC 1035 - cependant, cette limite est en réalité 63 (à la fois dans RFC 1035 section 2.3.1 et comme précisé dans RFC 2181 section 11 ).

Il existe d'autres limites qui entrent en jeu lorsque vous utilisez des noms d'hôtes qui seront utilisés dans DNS, comme noms d'hôtes dans les certificats SSL ou les adresses e-mail.

Premièrement, la limite de longueur du nom de domaine complet (FQDN) est de 255 octets lorsqu'elle est représentée dans le protocole DNS comme

"une série d'étiquettes, ... terminées par une étiquette de longueur zéro. ... Une étiquette se compose d'un octet de longueur suivi de ce nombre d'octets représentant le nom lui-même" - Blog MSDN "The Old New Thing" " (en citant la RFC 1035, avec une illustration utile)

Avec ces préfixes de longueur (y compris celui de l'étiquette finale de longueur zéro), la limite réelle pour un nom de domaine complet est de 253 octets.

Si votre nom d'hôte sera également utilisé comme nom DNS pour un serveur pour lequel vous avez besoin d'un certificat TLS/SSL, il y a une limite beaucoup plus courte qui vous affectera. Appendice A.1 de la RFC 5280 et ses RFC prédécesseurs 3280 et 2459 spécifient les limites supérieures pour différents champs d'un certificat X.509; le ub-common-name-length la limite pour le champ Nom commun, qui pour les certificats de serveur est le nom de domaine complet du serveur, est de 64 octets.

Si vous utilisez OpenSSL pour générer un certificat SSL avec un champ d'adresse de messagerie de plus de 40 octets, vous verrez cette erreur:

la chaîne est trop longue, elle doit être inférieure à 40 octets

Si un nom d'hôte sera utilisé dans les adresses électroniques pour les certificats générés par OpenSSL, le @ et le nom d'utilisateur devront également tenir dans les 40 octets (le "moins de" dans l'erreur devrait vraiment être "pas plus de"), ce qui, pour une longueur maximale de nom d'utilisateur de 8 octets, implique une longueur maximale du nom de domaine complet du nom d'hôte de 31 octets. Si la longueur maximale du nom d'utilisateur est supérieure à 8 octets, la longueur maximale du nom d'hôte est diminuée en conséquence - la limite Linux moderne de 32 donnerait une longueur FQDN maximale de 7 qui n'est pas pratique, même pour les services de raccourcissement d'URL comme bit.ly.

Le choix OpenSSL d'un 40 comme limite de longueur pour une autre adresse e-mail X.509 peut être choisi pour la compatibilité avec la syntaxe alternative la plus courte possible, E.163-4 (pour les numéros de téléphone), et c'est il est probable que les implémentations TLS/SSL (y compris peut-être même OpenSSL) prennent en charge utilisez des certificats avec des adresses e-mail plus longues. Il existe une limite supérieure distincte (ub-emailaddress-length) de 128 octets dans RFC 3280, augmenté à 255 octets dans RFC 5280; il s'agit en fait d'une autre incorporation héritée des adresses e-mail dans les certificats X.509, mais il ne serait pas surprenant que de nombreuses implémentations utilisent également cette limite supérieure pour les IA5Strings e-mail rfc822Address.

Alors qu'OpenSSL pourrait augmenter cette limite à l'avenir, il n'y a pas de problème pour cela dans OpenSSL Request Tracker , et il semble peu probable qu'il soit modifié.

Même si vous n'utilisez pas TLS/SSL, le longueur maximale de l'adresse e-mail de 254 implique une longueur maximale de nom de domaine complet du nom d'hôte de 245 octets pour une limite de nom d'utilisateur traditionnelle de 8 octets; ou 221 octets pour une limite de longueur maximale de nom d'utilisateur moderne de 32.

En prenant le minimum de tous ces maximums et un longueur médiane du domaine .com 2012 de 11 (par coïncidence la longueur exacte de example.com), et vous obtenez une longueur maximale de nom d'hôte de première étiquette de 19 octets pour une adresse e-mail de 40 octets comme [email protected].

Si toutes vos adresses de messagerie sont mappées à un nom de domaine de niveau supérieur avec des enregistrements MX et une réécriture d'adresses MTA, en supposant une limite de longueur de nom d'utilisateur/alias plus raisonnable de 16, vous obtenez une longueur maximale de nom de domaine de 23 octets pour une adresse e-mail de 40 octets comme [email protected].

Enfin, les noms d'hôtes non ASCII nécessitent un codage IDN (nom de domaine internationalisé) pour une utilisation avec DNS; cela implique un encodage avec 4 caractères xn-- préfixe pour chaque étiquette de domaine avec des caractères non ASCII, et une expansion de 1 à 2 octets pour chaque caractère non ASCII (en plus de la plus grande taille résultant du codage UTF-8). Si votre nom d'hôte contient des caractères non ASCII, vous devez réduire toutes les limites ci-dessus en conséquence.

49
Alex Dupuy

Selon RFC 1035 la longueur d'un nom de domaine complet est limitée à 255 caractères, et chaque étiquette (nœud délimité par un point dans le nom d'hôte) est limitée à 63 caractères, donc en fait la limite que vous recherchez est 63.

Vous pouvez obtenir cette valeur en exécutant getconf Host_NAME_MAX dans le terminal.

18
zrvan

Les noms d'hôtes sont généralement limités à 255 octets . Host_NAME_MAX (ou _POSIX_Host_NAME_MAX) défini dans <limits.h> contiendra la valeur spécifique.

12
一二三

Voici un exemple de code qui rassemble tout cela:

#include <limits.h>
#include <unistd.h>
#include <stdio.h>

char Host[HOST_NAME_MAX + 1];

Host[HOST_NAME_MAX] = 0;

if (gethostname(Host, sizeof(Host) - 1) == 0)
{
    printf("hostname is %s\n", Host);
}
2
Randall Cook

Git 2.13 (Q2 2017) illustre cette limite de longueur de nom en C et rappelle que POSIX ne spécifie pas si le tampon sera terminé par null.
Il introduit une nouvelle fonction, xgethostname(), qui assure qu'il y a toujours un \0 à la fin du tampon.

Voir commit 5781a9a (18 avril 2017) par David Turner (csusbdt) .
(Fusionné par David Turner - csusbdt - in commit 5781a9a , 19 avril 2017)

utilisation Host_NAME_MAX pour dimensionner les tampons pour gethostname (2)

POSIX limite la longueur des noms d'hôtes à Host_NAME_MAX.
Exportez la définition de secours de daemon.c et utilisez cette constante pour rendre tous les tampons utilisés avec gethostname (2) assez grands pour tout résultat possible et un NUL de terminaison.

0
VonC