python wrap_socket中的server_hostname是否可以保存IPv4字符串值



我知道,当一台服务器承载多个主机名时,ssl.SSLContext()对象中wrap_socket函数中的server_hostname参数可以用于标识主机名,如下例所示。是否可以使用server_hostname,或者使用值不是主机名字符串而是IPv4地址字符串的server_hostname参数有意义吗?

1( 是否有任何用途或优势可以使我的连接更准确(针对指定的IP(?

2( 服务器是否可以承载许多虚拟IP,以便在server_hostname中指定IPv4地址可以增加价值?

这个例子来自python网站

import socket, ssl
context = ssl.SSLContext()
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_default_certs()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')
ssl_sock.connect(('www.verisign.com', 443))

server_hostname用于启用SNI"服务器名称指示",因此它需要是主机名,而不能是IP地址。

这正是为了能够为运行在同一服务器上的多个主机名(比如网站(提供TLS服务,从而提供IP地址。TLS握手(以及证书交换(发生在任何类型的数据级交换之前,主机名可以给出提示(如HTTP中的host标头(,因此我们需要TLS中的SNI来传递该信息。

所有表现良好的客户端都应该在TLS握手期间提供这些信息,否则他们可能会遇到错误的服务或取回错误的证书。

最新更新