Java 中怎样在程序中设置代理服务器
从JDK15开始,Java在javanet包下提供了Proxy和ProxySelector两个类,其中Proxy代表一个代理服务器,可以在打开URLConnection连接时指定所用的Proxy实例,也可以在创建Socket连接时指定Proxy实例。而ProxySelector代表一个代理选择器,它提供了对代理服务器更加灵活的控制,它可以对HTTP、HTTPS、FTP、SOCKS等分别设置,而且还可以设置不需要通过代理服务器的主机和地址。通过使用ProxySelector可以达到像在Internet Explorer、FireFox等软件中设置代理服务器类似的效果。
代理服务器的功能就是代理网络用户去取得网络信息。我们使用网络浏览器直接连接其他Internet站点取得网络信息时,通常需要发送Request请求来等到响应。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取得网页数据而是向代理服务器发出请求,Request请求会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并送回给网络浏览器。而且,大部分代理服务器都具有缓冲的功能,就好像一个大的Cache,它有很大的存储空间,它不断将新取得的数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。归纳起来代理服务器主要提供如下两个功能:
突破自身IP限制,对外隐藏自身IP地址。突破IP限制包括访问国外受限站点,访问国内特定单位、团体的内部资源。
提高访问速度,代理服务器提供的缓冲功能可以避免每个用户都直接访问远程主机,从而提高客户端访问速度。
1751 直接使用Proxy创建连接
Proxy有如下一个构造器:Proxy(ProxyType type, SocketAddress sa):创建表示代理服务器的Proxy对象。而sa参数指定代理服务器的地址,其中type是该代理服务器的类型,该服务器类型有如下三种:
(1)ProxyTypeDIRECT:表示直接连接或缺少代理。
(2)ProxyTypeHTTP:表示高级协议的代理,如 HTTP 或 FTP。
(3)ProxyTypeSOCKS:表示 SOCKS(V4 或 V5)代理。
一旦创建了Proxy对象之后,程序就可以在使用URLConnection打开连接时,或创建Socket连接时传入一个Proxy对象,作为本次连接所使用的代理服务器。
其中URL包含了一个URLConnection openConnection(Proxy proxy)方法,该方法使用指定的代理服务器来打开连接;而Socket则提供了一个Socket(Proxy proxy)构造器,该构造器使用指定的代理服务器创建一个没有连接的Socket对象。
下面以URLConnection为例来介绍如何在URLConnection中使用代理服务器。
程序清单:codes/17/17-5/ProxyTestjava
上面代码第一行粗体字代码创建了一个Proxy对象,第二行粗体字代码就是用Proxy对象来打开URLConnection连接。除此之外,该程序的其他地方就是对URLConnection的使用了。由此可见, JDK15提供了对代理服务器很好的支持。
1752 使用ProxySelector选择代理服务器
前面介绍的直接使用Proxy对象可以在打开URLConnection或Socket时指定代理服务器,使用这种方式需要每次打开连接都显式设置代理服务器。如果想让系统打开连接时总是具有默认的代理服务器,则可以使用javanetProxySelector,它可以它根据不同的连接使用不同的代理服务器。
系统默认的ProxySelector会检测各种系统属性和URL协议,然后决定怎样连接不同的主机。当然,程序也可以调用ProxySelector类的setDefaultI()静态方法来设置默认代理服务器,也可以调用getDefault()方法获得系统当前默认的代理服务器。
程序可以通过System类来设置系统的代理服务器属性,关于代理服务器常用的属性名有如下三个:
httpproxyHost:设置HTTP访问所使用的代理服务器地址。该属性名的前缀可以改为https、ftp等,分别用于设置HTTP访问、安全HTTP访问和FTP访问所用的代理服务器地址。
httpproxyPort:设置HTTP访问所使用的代理服务器端口。该属性名的前缀可以改为https、ftp等,分别用于设置HTTP访问、安全HTTP访问和FTP访问所用的代理服务器端口。
httpnonProxyHosts:设置HTTP访问中不需要使用代理服务器的远程主机,可以使用通配符,如果有多个地址,多个地址用竖线(|)分隔。
下面程序示范了通过改变系统属性来改变默认的代理服务器。
程序清单:codes/17/17-5/ ProxySelectorTestjava
上面程序中三行粗体字代码设置Java打开HTTP访问时的代理服务器属性,其中前两行代码设置代理服务器的地址和端口,第三行代码设置该代理HTTP访问哪些主机时不需要使用代理服务器。上面程序的①行代码处直接打开一个URLConnection,但系统会为打开该URLConnection时使用代理服务器。
运行上面程序,将会看到程序长时间等待,因为192168096通常并不是有效的代理服务器(当然,如果读者运行的机器恰好可以使用地址为192168096的代理服务器又另当别论)。
系统提供了默认的ProxySelector子类作为代理选择器,开发者可以实现自己的代理选择器,程序可以通过继承ProxySelector来实现自己的代理选择器。继承ProxySelector需要重写两个方法:
List<Proxy> select(URI uri):实现该方法让代理选择器根据不同的URI来使用不同的代理服务器,该方法就是代理选择器管理网络连接使用代理服务器的关键。
connectFailed(URI uri, SocketAddress sa, IOException ioe):当系统通过默认的代理服务器建立连接失败后,代理选择器将会自动调用该方法。通过重写该方法可以对连接代理服务器失败的情形进行处理。
系统默认的代理服务器选择器也重写了connectFailed方法,它重写该方法的处理策略是:当系统设置的代理服务器失败时,默认代理选择器将会采用直连的方式连接远程资源,所以当运行上面程序等待了足够长时间时,程序依然可以打印出该远程资源的所有内容。
在上网获取信息的过程中,我们接触最多的信息加密传输方式也莫过于 HTTPS 了。每当访问一个站点,浏览器的地址栏中出现绿色图标时,意味着该站点支持 HTTPS 信息传输方式。HTTPS 是我们常见的 HTTP 协议与某个加密协议的混合体,也就是 HTTP+S。这个 S 可以是 TLS(安全传输层协议)、也可以是 SSL(安全套接层),不过我更认可另一个抽象概括的说法,HTTP+Security。
首先,HTTPS并不是这种加密技术的正式名称,HTTPS代表的是“在TLS/SSL上实现的HTTP协议”,因此实现加密的其实是位于HTTP下面的TLS/SSL层。
我们看看TLS/SSL所实现的几个主要机制:
1 证书:通过第三方权威证书颁发机构(如VeriSign)验证和担保网站的身份,防止他人伪造网站身份与不知情的用户建立加密连接。
2 密钥交换:通过公钥(非对称)加密在网站服务器和用户之间协商生成一个共同的会话密钥。
3 会话加密:通过机制(2)协商的会话密钥,用对称加密算法对会话的内容进行加密。
4 消息校验:通过消息校验算法来防止加密信息在传输过程中被篡改。
通过上述机制,用户与网站之间的传输内容受到了保护,因此能够获得很高的安全性。不过,任何密码学手段都不是绝对安全的,上面几个机制中其实都存在可能的风险:
1 证书:如果有人伪造证书,浏览器会发出警告,提示用户该网站的证书可能是伪造的,应该停止访问,但如果你无视浏览器的警告,你的会话信息就有可能被伪造者窃取。此外,如果第三方证书颁发机构遭到攻击,攻击者窃取了已颁发的证书密钥,就可以伪造相应的网站证书,完全骗过浏览器的安全机制,这样的例子的确曾经发生过。
2 密钥交换:RSA,这是一种最普遍使用的公钥加密算法,一般来说安全性很高。
3 会话加密:AES-256(CBC Mode),这是一种非常广泛使用的加密算法,采用256位密钥代表其安全性很高,如果采用128位密钥(AES-128)则安全性就差一些。
4 消息校验:SHA1,这是一种散列算法,SHA1的安全性比MD5要好,但如果采用SHA256则安全性会更好一些。
上面很抽象是不是,我们用“传纸条”这个人人小时候都做过的事来形象的说明一下。
HTTP
假设你现在正坐在教室里上课,现在你非常想和走道旁的迷人的 TA 说一些话,一般这个时候你会用“传纸条”的方式来交流。而这个方式和 TCP/IP 协议基本的工作模式十分相像:
通过小动作引起对方注意;
对方以多种可能的方式(注视、肢体语言等)回应于你;
你确认对方感知到你后,将纸条传给对方;
对方阅读纸条;
对方给予你阅读后的反应;
怎么样,这个流程是不是很熟悉?
如果你要传递纸条的 TA 距离你很远怎么办?HTTP 协议就是指你在纸条上写明你要传给的 TA 是谁,或者 TA 的座位在哪,接着只需要途径的同学拿到纸条后根据纸条上的指示依次将纸条传过去就 OK 了。
这个时候问题来了:途径的同学完全可以观看并知道你在纸条上写了什么。
这就是 HTTP 传输所面临的问题之一:中间人攻击,指消息传递的过程中,处在传递路径上的攻击者可以嗅探或者窃听传输数据的内容。
HTTPS
HTTPS 针对这个问题,采用了“加密”的方式来解决。最著名原始的加密方法就是对称加密算法了,就是双方约定一个暗号,用什么字母替换什么字母之类的。现在一般采用一种叫 AES(高级加密算法)的对称算法。
对称加密算法既指加密和解密需要使用的密钥 key 是一样的。
AES 在数学上保证了,只要你使用的 key 足够长,破解几乎是不可能的(除非光子计算机造出来了)
我们先假设在没有密钥 key 的情况下,密文是无法被破解的,然后再回到这个教室。你将用 AES 加密后的内容噌噌噌地写在了纸条上,正要传出去的时候你突然想到,TA 没有 key 怎么解密内容呀,或者说,应该怎么把 key 给TA?
如果把 key 也写在纸条上,那么中间人照样可以破解窃听纸条内容。也许在现实环境中你有其他办法可以把 key 通过某种安全的渠道送到 TA 的手里,但是互联网上的实现难度就比较大了,毕竟不管怎样,数据都要经过那些路由。
于是聪明的人类发明了另一种加密算法——非对称加密算法。这种加密算法会生成两个密钥(key1 和 key2)。凡是 key1 加密的数据,key1 自身不能解密,需要 key2 才能解密;凡事 key2 加密的数据,key2 自身不能解密,只有 key1 才能解密。
目前这种算法有很多中,最常用的是 RSA。其基于的数学原理是:
两个大素数的乘积很容易算,但是用这个乘积去算出是哪两个素数相乘就很复杂了。好在以目前的技术,分解大数的素因确实比较困难,尤其是当这个大数足够大的时候(通常使用2的10次方个二进制位那么大),就算是超级计算机,解密也需要非常长的时间。
现在就把这种非对称加密的方法应用在我们教室传纸条的场景里。
你在写纸条内容之前先用 RSA 技术生成了一对密钥 k1 和 k2。
你把 k1 用明文传了出去,路经也许有人会截取,但是没有用,k1 加密的数据需要 k2 才可以破解,而 k2 在你自己手中。
k1 传到了目的人,目的人会去准备一个接下来准备用于对称加密(AES)的传输密钥 key,然后用收到的 k1 把 key 加密,传给你。
你用手上的 k2 解出 key 后,全教室只有你和你的目的人拥有这个对称加密的 key,你们俩就可以尽情聊天不怕窃听啦~
这里也许你会有问题,为什么不直接用非对称加密来加密信息,而是加密 AES 的 key 呢?因为非对称加密和解密的平均消耗时间比较长,为了节省时间提高效率,我们通常只是用它来交换密钥,而非直接传输数据。
然而使用非对称加密真的可以防范中间人攻击吗?虽然看上去很安全,但是实际上却挡不住可恶的中间人攻击。
假设你是 A,你的目的地是 B,现在要途径一个恶意同学M。中间人的恶意之处在于它会伪装成你的目标。
当你要和 B 完成第一次密钥交换的时候,M 把纸条扣了下来,假装自己是B并伪造了一个 key,然后用你发来的 k1 加密了 key 发还给你。
你以为你和 B 完成了密钥交换,实际上你是和 M 完成了密钥交换。
同事 M 和 B 完成一次密钥交换,让 B 以为和 A 你完成了密钥交换。
现在整体的加密流程变成了A(加密链接1)->M(明文)->B(加密链接2)的情况了,这时候 M 依然可以知道A和B传输的全部消息。
这个时候就是体现 HTTPS 和传纸条的区别了。在教室里,你是和一位与你身份几乎对等的的对象来通信;而在访问网站时,对方往往是一个比较大(或者知名)的服务者,他们有充沛的资源,或许他们可以向你证明他们的合法性。
此时我们需要引入一个非常权威的第三方,一个专门用来认证网站合法性的组织,可以叫做 CA(Certificate Authority)。各个网站服务商可以向 CA 申请证书,使得他们在建立安全连接时可以带上 CA 的签名。而 CA 得安全性是由操作系统或者浏览器来认证的。
你的 Windows、Mac、Linux、Chrome、Safari 等会在安装的时候带上一个他们认为安全的 CA 证书列表,只有和你建立安全连接的网站带有这些CA的签名,操作系统和浏览器才会认为这个链接是安全的,否则就有可能遭到中间人攻击。
一旦某个 CA 颁发的证书被用于的非法途径,那么这个 CA 之前颁发过的所有证书都将被视为不安全的,这让所有 CA 在颁发证书时都十分小心,所以 CA 证书在通常情况下是值得信任的。
正如声网agoraio Web SDK考虑数据安全问题,限制了http访问getUserMedia接口,只能通过https方式访问。所以会出现用http在Chrome浏览器(47以上版本)中访问Agora服务失败,我该怎么办?
Agora Web解决方案基于WebRTC技术建立浏览器间的音视频通信,在WebRTC协议中,浏览器通过getUserMedia接口获取视频(通过摄像头)和音频(通过麦克风)数据,Google Chrome是支持WebRTC的主流浏览器之一,在v47及以上版本,考虑到数据安全问题,限制了http访问getUserMedia接口,只能通过https方式访问。除了chrome浏览器外,Opera浏览器在v34版本后也跟进了对http的限制,Firefox暂时没有此更新。但是考虑到https是WebRTC协议推荐的安全访问方式,建议客户统一通过https来访问Agora Web服务,也能兼容各浏览器平台。
在计算机领域中,代理就是作为用户与目标服务器之间的中介的中间传输web服务器。Agent(英语:Proxy)也称网络Agent,是一种特殊的网络服务,它允许一个网络终端(通常为客户机)与另一个终端(通常为服务器)的非直接连接。有些网关、路由器等网络设备具有代理网络的功能。代理服务通常被认为有助于保护网络终端的隐私性和安全性,防止攻击。
下面给大家分享https代理使用地址:
17542128269999高匿名HTTP福建省南平市 联通
1061102122439999高匿名HTTP江苏省宿迁市 电信
4986571089999高匿名HTTP江苏省扬州市 电信
17111291209999高匿名HTTP河南省商丘市 电信
175441091199999高匿名HTTP福建省南平市 联通
112111217759999高匿名HTTP福建省宁德市 联通
113124872259999高匿名HTTP山东省烟台市 电信
110243271109999高匿名HTTP河北省唐山市 联通
1421168219999高匿名HTTP中国 广东省 中山市 电信
36248132779999高匿名HTTP福建省宁德市 联通
1152212461069999高匿名HTTP浙江省温州市 电信
175421231509999高匿名HTTP福建省宁德市 联通
1231691132519999高匿名HTTP山东省淄博市 电信
大家如果有使用HTTP**的需求,不妨试试以上我给大家推荐的这些地址哦~
无偿ip资源:裙587746481
初看OkHttp源码,由于对Address、Route、Proxy、ProxySelector、RouteSelector等理解不够,读源码非常吃力,看了几遍依然对于寻找复用连接、创建连接、连接服务器、连接代理服务器、创建隧道连接等逻辑似懂非懂,本篇决定梳理一遍相关的概念及基本原理。
● HTTP/11(HTTPS)
● HTTP/2
● SPDY
一个http请求的流程(直连):
1、输入url及参数;
2、如果是url是域名则解析ip地址,可能对应多个ip,如果没有指定端口,则用默认端口,http请求用80;
3、创建socket,根据ip和端口连接服务器(socket内部会完成3次TCP握手);
4、socket成功连接后,发送http报文数据。
一个https请求的流程(直连):
1、输入url及参数;
2、如果是url是域名则解析ip地址,可能对应多个ip,如果没有指定端口,则用默认端口,https请求用443;
3、创建socket,根据ip和端口连接服务器(socket内部会完成3次TCP握手);
4、socket成功连接后进行TLS握手,可通过java标准款提供的SSLSocket完成;
5、握手成功后,发送https报文数据。
1、分类
● HTTP代理:普通代理、隧道代理
● SOCKS代理:SOCKS4、SOCKS5
2、HTTP代理分类及说明
普通代理
HTTP/11 协议的第一部分。其代理过程为:
● client 请求 proxy
● proxy 解析请求获取 origin server 地址
● proxy 向 origin server 转发请求
● proxy 接收 origin server 的响应
● proxy 向 client 转发响应
其中proxy获取目的服务器地址的标准方法是解析 request line 里的 request-URL。因为proxy需要解析报文,因此普通代理无法适用于https,因为报文都是加密的。
隧道代理
通过 Web 代理服务器用隧道方式传输基于 TCP 的协议。
请求包括两个阶段,一是连接(隧道)建立阶段,二是数据通信(请求响应)阶段,数据通信是基于 TCP packet ,代理服务器不会对请求及响应的报文作任何的处理,都是原封不动的转发,因此可以代理 HTTPS请求和响应。
代理过程为:
● client 向 proxy 发送 CONNET 请求(包含了 origin server 的地址)
● proxy 与 origin server 建立 TCP 连接
● proxy 向 client 发送响应
● client 向 proxy 发送请求,proxy 原封不动向 origin server 转发请求,请求数据不做任何封装,为原生 TCP packet
3、SOCKS代理分类及说明
● SOCKS4:只支持TCP协议(即传输控制协议)
● SOCKS5: 既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。
SOCK4能做到的SOCKS5都可得到,但反过来却不行,比如我们常用的聊天工具QQ在使用代理时就要求用SOCKS5代理,因为它需要使用UDP协议来传输数据。
有了上面的基础知识,下面分析结合源码分析OkHttp路由相关的逻辑。OkHttp用Address来描述与目标服务器建立连接的配置信息,但请求输入的可能是域名,一个域名可能对于多个ip,真正建立连接是其中一个ip,另外,如果设置了代理,客户端是与代理服务器建立直接连接,而不是目标服务器,代理又可能是域名,可能对应多个ip。因此,这里用Route来描述最终选择的路由,即客户端与哪个ip建立连接,是代理还是直连。下面对比下Address及Route的属性,及路由选择器RouteSelector。
描述与目标服务器建立连接所需要的配置信息,包括目标主机名、端口、dns,SocketFactory,如果是https请求,包括TLS相关的SSLSocketFactory 、HostnameVerifier 、CertificatePinner,代理服务器信息Proxy 、ProxySelector 。
Route提供了真正连接服务器所需要的动态信息,明确需要连接的服务器IP地址及代理服务器,一个Address可能会有很多个路由Route供选择(一个DNS对应对个IP)。
Address和Route都是数据对象,没有提供操作方法,OkHttp另外定义了RouteSelector来完成选择的路由的操作。
1、读取代理配置信息:resetNextProxy()
读取代理配置:
● 如果有指定代理(不读取系统配置,在OkHttpClient实例中指定),则只用1个该指定代理;
● 如果没有指定,则读取系统配置的,可能有多个。
2、获取需要尝试的socket地址(目标服务器或者代理服务器):resetNextInetSocketAddress()
结合Address的host和代理,解析要尝试的套接字地址(ip+端口)列表:
● 直连或者SOCK代理, 则用目标服务器的主机名和端口,如果是HTTP代理,则用代理服务器的主机名和端口;
● 如果是SOCK代理,根据目标服务器主机名和端口号创建未解析的套接字地址,列表只有1个地址;
● 如果是直连或HTTP代理,先DNS解析,得到InetAddress列表(没有端口),再创建InetSocketAddress列表(带上端口),InetSocketAddress与InetAddress的区别是前者带端口信息。
3、获取路由列表:next()
选择路由的流程解析:
● 遍历每个代理对象,可能多个,直连的代理对象为ProxyDIRECT(实际是没有中间代理的);
● 对每个代理获取套接字地址列表;
● 遍历地址列表,创建Route,判断Route如果在路由黑名单中,则添加到失败路由列表,不在黑名单中则添加到待返回的Route列表;
● 如果最后待返回的Route列表为空,即可能所有路由都在黑名单中,实在没有新路由了,则将失败的路由集合返回;
● 传入Route列表创建Selection对象,对象比较简单,就是一个目标路由集合,及读取方法。
为了避免不必要的尝试,OkHttp会把连接失败的路由加入到黑名单中,由RouteDatabase管理,该类比较简单,就是一个失败路由集合。
1、创建Address
Address的创建在RetryAndFollowUpInteceptor里,每次请求会声明一个新的Address及StreamAllocation对象,而StreamAllocation使用Address创建RouteSelector对象,在连接时RouteSelector确定请求的路由。
每个Requst都会构造一个Address对象,构造好了Address对象只是有了与服务器连接的配置信息,但没有确定最终服务器的ip,也没有确定连接的路由。
2、创建RouteSelector
在StreamAllocation声明的同时会声明路由选择器RouteSelector,为一次请求寻找路由。
3、选择可用的路由Route
下面在测试过程跟踪实例对象来理解,分别测试直连和HTTP代理HTTP2请求路由的选择过程:
● 直连请求流程
● HTTP代理HTTPS流程
请求url: https://wwwjianshucom/p/63ba15d8877a
1、构造address对象
2、读取代理配置:resetNextProxy
3、解析目标服务器套接字地址:resetNextInetSocketAddress
4、选择Route创建RealConnection
5、确定协议
测试方法:
● 在PC端打开Charles,设置端口,如何设置代理,网上有教程,比较简单;
● 手机打开WIFI,选择连接的WIFI修改网络,在高级选项中设置中指定了代理服务器,ip为PC的ip,端口是Charles刚设置的端口;
● OkHttpClient不指定代理,发起请求。
1、构造address对象
2、读取代理配置:resetNextProxy
3、解析目标服务器套接字地址:resetNextInetSocketAddress
4、选择Route创建RealConnection
5、创建隧道
由于是代理https请求,需要用到隧道代理。
从图可以看出,建立隧道其实是发送CONNECT请求,header包括字段Proxy-Connection,目标主机名,请求内容类似:
6、确定协议,SSL握手
1、代理可分为HTTP代理和SOCK代理;
2、HTTP代理又分为普通代理和隧道代理;普通代理适合明文传输,即http请求;隧道代理仅转发TCP包,适合加密传输,即https/http2;
3、SOCK代理又分为SOCK4和SOCK5,区别是后者支持UDP传输,适合代理聊天工具如QQ;
4、没有设置代理(OkHttpClient没有指定同时系统也没有设置),客户端直接与目标服务器建立TCP连接;
5、设置了代理,代理http请求时,客户端与代理服务器建立TCP连接,如果代理服务器是域名,则解释代理服务器域名,而目标服务器的域名由代理服务器解析;
6、设置了代理,代理https/http2请求时,客户端与代理服务器建立TCP连接,发送CONNECT请求与代理服务器建立隧道,并进行SSL握手,代理服务器不解析数据,仅转发TCP数据包。
如何正确使用 HTTP proxy
OkHttp3中的代理与路由
HTTP 代理原理及实现(一)
有两种方案来解决这个问题:
1使用支持多个域名的SSL证书(多域名证书或通配符证书)
wosign多域名SSL证书能够在一张证书中最多支持绑定100个域名。当需要为同一台物理服务器上的多个不同域名的主机配置SSL证书时,可通配置一张共享的多域名证书来实现IP地址和端口的共享。只需将所有虚拟站点的域名绑定到这张多域名证书中即可。
2开启SNI支持
SNI 是“Server Name
Indication”的缩写,全称“主机名称指示”。开启SNI,可以允许一个443端口共享给多个虚拟站点,并且每一个虚拟站点都允许独立配置其唯一的证书密钥对。其优点是每个站点独享唯一密钥对,更安全。缺点是SNI受客户端及服务端程序版本限制,部分客户端及服务端程序无法支持。
TLS主机名指示扩展(SNI,RFC6066)允许浏览器和服务器进行SSL握手时,将请求的主机名传递给服务器,因此服务器可以得知需要使用哪一个证书来服务这个连接。但SNI只得到有限的浏览器和服务器支持。
更多相关SSL证书部署配置问题建议咨询SSL厂商wosign ca
0条评论