Unixシステムでのホスト名の最大文字数はどのくらいかと思います。さらに、Unixプログラミングでその番号を呼び出すために使用できる定義済み変数はありますか? (つまり、ホスト名に使用できる文字数)。
私はCでプログラミングしています。
通常、次のように入力できます。
getconf Host_NAME_MAX
さらに、通常、アプリケーションにlimits.hを含めて、定義の値を読み取ることができます。
POSIX規格では255バイトを超えないことが保証されていますが、それは必ずしも各実装がそれに準拠することを意味するわけではありません。
プラットフォームでman gethostnameを実行して、より詳細な情報を取得します。
tl; dr:
コードは最大255バイトのホスト名を処理する必要があります。管理者は、ホスト名の長さ(ドメインを除く)を19バイト以内に、ドメイン名の長さ(ホスト名を除く)を23バイト以内に保つ必要があります。
Host.example.com
)と同じ長さ253バイトにすることができます。 ____。].
およびそれ以降を削除)は、最大63バイトのみ.
文字の間の部分)ごとに4を引き、さらに1を引きます非ASCII文字ごとに-2バイト(1文字あたり1〜2バイトのUTF-8エンコードオーバーヘッドは含まれません)。ロングバージョン:
@Michaelが言うように、POSIXホスト名は通常255バイトに制限されており、@ zrvanが指摘するように、DNSは RFC 1035 の各ラベルの長さを制限しますが、実際にはその制限はです63( RFC 1035セクション2.3.1 の両方、および RFC 2181セクション11 で明確化されたとおり)。
DNSで使用されるホスト名を、SSL証明書または電子メールアドレスのホスト名として使用する場合、他の制限が作用します。
最初に、完全修飾ドメイン名(FQDN)の長さ制限は、DNSプロトコルで次のように表される場合、255オクテットです。
「一連のラベル、...長さゼロのラベルで終了します。..ラベルは、長さオクテットの後に名前自体を表すその数のオクテットが続きます」- MSDNブログ "The Old New Thing " (RFC 1035を引用、有用な図解付き)
これらの長さプレフィックス(最終的な長さゼロラベルのプレフィックスを含む)を使用すると、完全修飾ドメイン名の実際の制限は253バイトです。
ホスト名がTLS/SSL証明書を必要とするサーバーのDNS名としても使用される場合、制限がはるかに短くなります。 付録A.1 RFC 5280およびその前身であるRFC 3280および2459は、X.509証明書のさまざまなフィールドの上限を指定しています。サーバー証明書の場合はサーバーの完全修飾ドメイン名である共通名フィールドのub-common-name-length
制限は、64バイトです。
OpenSSLを使用して、長さが40バイトを超える電子メールアドレスフィールドを持つSSL証明書を生成すると、次のエラーが表示されます。
文字列が長すぎるため、40バイト未満にする必要があります
OpenSSLによって生成された証明書の電子メールアドレスでホスト名が使用される場合、@
およびユーザー名も40バイト以内に収まる必要があります(エラーの「より小さい」は実際には「以下」である必要があります) )は、ユーザー名の最大長が8バイトの場合、ホスト名FQDNの最大長が31バイトであることを意味します。ユーザー名の最大長が8バイトより長い場合、ホスト名の最大長はそれに応じて減少します- Linuxの最新の制限である32 は、FQDNの最大長7になりますこれは、bit.lyのようなURL短縮サービスの場合でも非実用的です。
電子メールアドレスX.509サブジェクト代替名の長さ制限として40のOpenSSLの選択は、最短の代替名構文E.163-4(電話番号用)との互換性のために選択されている可能性があります。おそらく、TLS/SSL実装(おそらくOpenSSLを含む)がseより長い電子メールアドレスを持つ証明書をサポートしている可能性があります。 RFC 3280では128バイトの別の上限(ub-emailaddress-length
)があり、RFC 5280では255バイトに増加しました。これは実際には、X.509証明書に別の従来の電子メールアドレスを埋め込むためのものですが、多くの実装がrfc822Address電子メールIA5Stringsの上限を使用していても驚くことではありません。
OpenSSLは将来この制限を増やす可能性がありますが、 OpenSSL Request Tracker にはこれに関する問題はなく、変更される可能性は低いようです。
TLS/SSLを使用しない場合でも、 最大電子メールアドレスの長さ254 は、従来の8バイトのホスト名FQDNの最大長245バイトを意味しますバイトのユーザー名制限;または221バイトで、現在のユーザー名の最大長は32です。
これらすべての最大値の最小値と 2012中央値.comドメイン長11 (偶然にexample.comの正確な長さ)を取得すると、最初のラベルのホスト名の最大長はになります[email protected]
などの40バイトの電子メールアドレスの場合、19バイト。
すべての電子メールアドレスがMXレコードとMTAアドレスの書き換えを使用してトップレベルドメイン名にマッピングされている場合、より合理的なユーザー名/エイリアスの長さ制限を16と仮定すると、最大ドメイン名の長さは23になります[email protected]
などの40バイトの電子メールアドレスの場合。
最後に、非ASCIIホスト名には、DNSで使用するIDN(国際化ドメイン名)エンコードが必要です。これには、非ASCII文字を含むドメインラベルごとに4文字のxn--
プレフィックスを使用したエンコードと、非ASCII文字ごとに1〜2バイトの拡張(UTF-8から生じる大きなサイズに加えて)エンコーディング)。ホスト名に非ASCII文字が含まれている場合、それに応じて上記の制限をすべて減らす必要があります。
RFC 1035 によると、FQDNの長さは255文字に制限されており、各ラベル(ホスト名のドットで区切られたノード)は63文字に制限されているため、実際には、 63です。
この値を取得するには、ターミナルでgetconf Host_NAME_MAX
を実行します。
ホスト名は通常 255バイトに制限 です。 Host_NAME_MAX
で定義されている_POSIX_Host_NAME_MAX
(または<limits.h>
)には、特定の値が含まれます。
すべてをまとめたサンプルコードを次に示します。
#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);
}