寻找支持SNI的Net::SSLeay->get_https()替代Perl模块
推荐的Perl高层模块方案
1. LWP::UserAgent
这是Perl生态中最常用的HTTP客户端高层模块,底层基于IO::Socket::SSL,天然支持SNI,无需深入SSL细节。你可以用它替代Net::SSLeay->get_https(),调用方式简洁,参数适配性强:
use LWP::UserAgent; my $ua = LWP::UserAgent->new; # 多数场景下模块会自动根据host设置SNI,需手动指定时添加以下配置 $ua->ssl_opts( SSL_hostname => '目标域名', ); # POST请求示例,对应原get_https的host、path、port、数据字段 my $response = $ua->post( "https://目标域名:端口/path", Content => { key1 => 'value1', key2 => 'value2', }, ); if ($response->is_success) { print $response->content; } else { die $response->status_line; }
如果是GET请求,直接替换为$ua->get()即可,参数逻辑和原调用一致。
2. HTTP::Tiny
轻量级的高层HTTP客户端,底层同样支持SNI,代码更简洁,适合对资源占用有要求的场景:
use HTTP::Tiny; my $http = HTTP::Tiny->new( SSL_options => { SSL_hostname => '目标域名', }, ); # POST表单请求示例,对应原参数 my $response = $http->post_form( "https://目标域名:端口/path", { key1 => 'value1', key2 => 'value2' } ); if ($response->{success}) { print $response->{content}; } else { die "$response->{status} $response->{reason}"; }
GET请求直接使用$http->get(),参数逻辑与原调用匹配。
3. 基于Net::SSLeay的半高层改造(无需换模块)
如果不想替换原有模块,可以手动用Net::SSLeay的API构造请求并设置SNI,仅需少量改动即可保留原有核心依赖:
use Net::SSLeay; Net::SSLeay::initialize(); # 创建socket并连接目标服务器 my ($socket, $ctx) = Net::SSLeay::open_tcp('目标域名', 端口); Net::SSLeay::set_servername($socket, '目标域名'); # 设置SNI # 构造HTTP请求,对应原get_https的path和数据字段 my $request = "POST /path HTTP/1.1\r\n"; $request .= "Host: 目标域名\r\n"; $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; my $data = 'key1=value1&key2=value2'; $request .= "Content-Length: " . length($data) . "\r\n"; $request .= "\r\n"; $request .= $data; Net::SSLeay::write($socket, $request); my $response = Net::SSLeay::read($socket); print $response; Net::SSLeay::close($socket); Net::SSLeay::cleanup();
内容的提问来源于stack exchange,提问作者DougJ
相关产品推荐
相关产品推荐

