Module java.base
Package javax.net.ssl

Class SNIHostName

java.lang.Object
javax.net.ssl.SNIServerName
javax.net.ssl.SNIHostName

public final class SNIHostName extends SNIServerName
该类的实例表示Server Name Indication(SNI)扩展中的类型为host_name的服务器名称。

如TLS扩展(RFC 6066)的第3节“Server Name Indication”中所述,“HostName”包含服务器的完全限定的DNS主机名,客户端可以理解。主机名的编码服务器名称值使用ASCII编码表示为字节字符串,不带尾部点。这允许通过使用在RFC 5890中定义的A标签(国际化域名应用程序(IDNA)的有效字符串的ASCII兼容编码(ACE)形式)支持国际化域名(IDN)。

请注意,SNIHostName对象是不可变的。

自版本:
1.8
参见:
  • Constructor Details

    • SNIHostName

      public SNIHostName(String hostname)
      使用指定的主机名创建一个SNIHostName

      请注意,根据RFC 6066,主机名的编码服务器名称值符合StandardCharsets.US_ASCII。在此方法中,hostname可以是用户友好的国际化域名(IDN)。使用IDN.toASCII(String, int)来强制执行主机名中ASCII字符的限制(请参阅RFC 3490,RFC 1122,RFC 1123)并将hostname转换为ASCII兼容编码(ACE),如下所示:

           IDN.toASCII(hostname, IDN.USE_STD3_ASCII_RULES);
       

      如果hostname参数违规,则是非法的:

      • hostname为空,
      • hostname以尾部点结尾,
      • hostname不符合RFC 3490规范的有效国际化域名(IDN)。
      参数:
      hostname - 此服务器名称的主机名
      抛出:
      NullPointerException - 如果hostnamenull
      IllegalArgumentException - 如果hostname是非法的
    • SNIHostName

      public SNIHostName(byte[] encoded)
      使用指定的编码值创建一个SNIHostName

      此方法通常用于解析请求的SNI扩展中的编码名称值。

      根据RFC 6066,主机名的编码名称值是符合StandardCharsets.US_ASCII的。然而,在SNI扩展的先前版本(RFC 4366)中,编码主机名以使用UTF-8编码的字节字符串表示。为了版本兼容性,此方法允许encoded参数的字符集可以是StandardCharsets.UTF_8,以及StandardCharsets.US_ASCII。使用IDN.toASCII(String)来将encoded参数转换为ASCII兼容编码(ACE)主机名。

      强烈建议仅在解析请求的SNI扩展中的编码名称值时使用此构造函数。否则,为了符合RFC 6066,请始终使用StandardCharsets.US_ASCII兼容的字符集,并强制执行对encoded参数中主机名的ASCII字符的限制(请参阅RFC 3490,RFC 1122,RFC 1123),或者改用SNIHostName(String)

      如果encoded参数违规,则是非法的:

      请注意,encoded字节数组会被克隆以防止后续修改。

      参数:
      encoded - 此服务器名称的编码主机名
      抛出:
      NullPointerException - 如果encodednull
      IllegalArgumentException - 如果encoded是非法的
  • Method Details

    • getAsciiName

      public String getAsciiName()
      返回此SNIHostName对象的符合StandardCharsets.US_ASCII的主机名。

      请注意,根据RFC 6066,返回的主机名可能是包含A标签的国际化域名。有关详细A标签规范的更多信息,请参阅RFC 5890。

      返回:
      SNIHostName对象的符合StandardCharsets.US_ASCII的主机名
    • equals

      public boolean equals(Object other)
      将此服务器名称与指定对象进行比较。

      根据RFC 6066,DNS主机名不区分大小写。仅当两个服务器主机名在不区分大小写的比较中具有相同的名称类型且主机名相等时,它们才相等。

      覆盖:
      equals 在类中 SNIServerName
      参数:
      other - 要与此实例比较的其他服务器名称对象。
      返回:
      如果且仅如果other被视为等于此实例,则返回true
      参见:
    • hashCode

      public int hashCode()
      返回此SNIHostName的哈希码值。

      哈希码值是使用此SNIHostName的不区分大小写的主机名生成的。

      覆盖:
      hashCode 在类中 SNIServerName
      返回:
      SNIHostName的哈希码值。
      参见:
    • toString

      public String toString()
      返回对象的字符串表示,包括此SNIHostName对象中的DNS主机名。

      表示的确切细节未指定且可能会更改,但以下内容可能被视为典型:

           "type=host_name (0), value=<hostname>"
       
      "<hostname>"是主机名的ASCII表示,可能包含A标签。例如,伪主机名的返回值可能如下所示:
           "type=host_name (0), value=www.example.com"
       
           "type=host_name (0), value=xn--fsqu00a.xn--0zwm56d"
       

      请注意,表示的确切细节未指定且可能会更改。

      覆盖:
      toString 在类中 SNIServerName
      返回:
      对象的字符串表示。
    • createSNIMatcher

      public static SNIMatcher createSNIMatcher(String regex)
      SNIHostName创建一个SNIMatcher对象。

      此方法可用于服务器验证可接受的SNIHostName。例如,

           SNIMatcher matcher =
               SNIHostName.createSNIMatcher("www\\.example\\.com");
       
      将接受主机名"www.example.com"。
           SNIMatcher matcher =
               SNIHostName.createSNIMatcher("www\\.example\\.(com|org)");
       
      将接受主机名"www.example.com"和"www.example.org"。
      参数:
      regex - 表示要匹配的主机名的正则表达式模式
      返回:
      一个SNIMatcher对象,用于SNIHostName
      抛出:
      NullPointerException - 如果regexnull
      PatternSyntaxException - 如果正则表达式的语法无效