Perl 从SSL切换到TLS连接

Perl 从SSL切换到TLS连接,perl,ssl,tls1.2,Perl,Ssl,Tls1.2,我有一个Perl脚本,它使用SSL将一些文件上传到服务器。现在我们需要将其更改为TLS。因为我不知道怎么做,有人能帮忙吗。下面是处理证书函数的块 sub check_ssl_cert { use Net::SSLeay; Net::SSLeay::set_proxy("proxye.hypo.de",80); # $Net::SSLeay::trace = 9 if ($opt_d); my ($page, $response, $headers, $server_cert) = Net::SS

我有一个Perl脚本,它使用SSL将一些文件上传到服务器。现在我们需要将其更改为TLS。因为我不知道怎么做,有人能帮忙吗。下面是处理证书函数的块

sub check_ssl_cert {
use Net::SSLeay;
Net::SSLeay::set_proxy("proxye.hypo.de",80);
# $Net::SSLeay::trace = 9 if ($opt_d);
my ($page, $response, $headers, $server_cert) = Net::SSLeay::get_https3("$buba_srv", 443, "/");
print DEBUG "\n","#"x80,"\n", 'CERT:  ' . $server_cert . "\n","-"x80,"\n" . $headers . "\n","-"x80,"\n" if ($opt_d);
if (!defined($server_cert) || ($server_cert == 0)) {
    my $subject="Der BuBa Server gibt kein Zertifikat raus. Mit denen red ich nicht.";
    my $message="HTTP Response: <" . $response . ">\n" .
             "HTTP Headers:  ---------------------------------------------------------------\n" .
             $headers .
             "HTTP Body: -------------------------------------------------------------------\n" .
             $page .
             "------------------------------------------------------------------------------\n" ;
    &send_errormail($buba_srv, $subject, $message);
exit 5;
}
my $ssl_subject_name = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_subject_name($server_cert));
my $ssl_issuer_name = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_issuer_name($server_cert)); 
}
子检查\u ssl\u证书{
使用Net::SSLeay;
Net::SSLeay::set_proxy(“proxye.hypo.de”,80);
#$Net::SSLeay::trace=9如果($opt_d);
我的($page、$response、$headers、$server\u cert)=Net::SSLeay::get\u https3($buba\u srv),443,“/”;
打印调试“\n”、“#”x80、“\n”、“CERT:”.$server\u CERT.\n”、“-”x80、“\n”.$headers.\n”、“-”x80、“\n”if($opt\u d);
如果(!已定义($server_cert)| |($server_cert==0)){
my$subject=“Der BuBa服务器gibt kein Zertifikat raus.Mit denen red我不知道。”;
my$message=“HTTP响应:\n”。
“HTTP头:---------------------------------------------------------------\n”。
$headers。
“HTTP正文:----------------------------------------------------------------------------\n”。
$page。
“---------------------------------------------------------------\n”;
&发送错误邮件($buba_srv,$subject,$message);
出口5;
}
我的$ssl\u subject\u name=Net::SSLeay::X509\u name\u一行(Net::SSLeay::X509\u get\u subject\u name($server\u cert));
我的$ssl\U issuer\U name=Net::SSLeay::X509\U name\U单线(Net::SSLeay::X509\U get\U issuer\U name($server\U cert));
}

}

这是一个如何切换到LWP并实施TLS1.2的示例:

use LWP::UserAgent;

my $ua = LWP::UserAgent->new(
    ssl_opts => {
            SSL_version => 'TLSv12:!SSLv2:!SSLv3:!TLSv1:!TLSv11',
    }
);
$ua->timeout(30);
my $response = $ua->get('https://www.example.com/');

这是一个如何切换到LWP并实施TLS1.2的示例:

use LWP::UserAgent;

my $ua = LWP::UserAgent->new(
    ssl_opts => {
            SSL_version => 'TLSv12:!SSLv2:!SSLv3:!TLSv1:!TLSv11',
    }
);
$ua->timeout(30);
my $response = $ua->get('https://www.example.com/');

您已经在使用TLS。“SSL”是协议旧版本的名称,“TLS”是新版本的名称。大多数网站不再接受与官方称为“SSL”的协议版本的连接。以下是TLS版本状态的摘要:

  • SSLv1:所以它甚至没有公开发布
  • SSLv2:古老而埋葬
  • SSLv3:坏了,不要使用,除非你有一个古老的设备,你不能升级,并且是在一个保护良好的网络,而不是面向互联网
  • TLSv1.0:已弃用,但仍可安全使用
  • TLSv1.1:已弃用,但仍可安全使用
  • TLSv1.2:推荐
  • TLSv1.3:即将发布

您可以调用以检查SSLv3是否已禁用,即检查您的客户端是否将拒绝连接到仅限SSLv3的服务器。您应该确保在您的客户端上禁用SSLv3:想要破坏您的安全的攻击者可能会假装是合法服务器,让您的客户端连接,然后利用旧协议的漏洞成功模拟合法服务器。由于您正在连接到特定的服务器,如果该服务器支持TLS 1.2,也可以通过调用
Net::SSLeay::set_options
禁用TLS 1.0和1.1,您已经在使用TLS了。“SSL”是协议旧版本的名称,“TLS”是新版本的名称。大多数网站不再接受与官方称为“SSL”的协议版本的连接。以下是TLS版本状态的摘要:

  • SSLv1:所以它甚至没有公开发布
  • SSLv2:古老而埋葬
  • SSLv3:坏了,不要使用,除非你有一个古老的设备,你不能升级,并且是在一个保护良好的网络,而不是面向互联网
  • TLSv1.0:已弃用,但仍可安全使用
  • TLSv1.1:已弃用,但仍可安全使用
  • TLSv1.2:推荐
  • TLSv1.3:即将发布
您可以调用以检查SSLv3是否已禁用,即检查您的客户端是否将拒绝连接到仅限SSLv3的服务器。您应该确保在您的客户端上禁用SSLv3:想要破坏您的安全的攻击者可能会假装是合法服务器,让您的客户端连接,然后利用旧协议的漏洞成功模拟合法服务器。由于您正在连接到特定服务器,如果该服务器支持TLS 1.2,也可以通过调用
Net::SSLeay::set_options
禁用TLS 1.0和1.1

…=Net::SSLeay::get_https3($buba_srv),443,“/”

您的代码中没有任何内容仅限制对SSL的访问(您可能指的是SSL 3.0)。事实上,除非明确以不同方式设置
$Net::SSLeay::ssl\u version
,否则
get\u https3
将创建默认ssl上下文,默认情况下使用底层OpenSSL库支持的最佳ssl/TLS版本,即自OpenSSL 1.0.1(2012年发布)以来的TLS 1.2

因此,如果您的代码尚未使用TLS 1.2(您检查过吗?),请检查您的代码中是否设置了
$Net::SSLeay::ssl_version
,或者您的OpenSSL版本是否太旧

除此之外,我真的建议不要使用
Net::SSLeay::get\u https3
和类似的工具。这些函数没有正确地验证证书(这是文档化的),所以如果您明确地添加了自己的验证,那么您将不会意识到它们是中间人攻击,这不是微不足道的,并且您的代码甚至没有尝试这样做。 取而代之的是使用更高级别的模块,如简化HTTPS操作、使用sane默认值(至少在当前版本中)以及正确验证证书:

use LWP::UserAgent; 
my $ua = LWP::UserAgent->new;
$ua->proxy(https => "http://proxye.hypo.de:80");
my $response = $ua->get("https://$buba_srv/");
my $page = $response->decoded_content;
my $headers = $response->headers->as_string;
您也可以使用或。但与LWP相反,在使用这些模块时,您需要通过使用
HTTP::Tiny
verify\u SSL
选项和
ca
参数
Mojo::UserAgent
显式启用适当的证书验证

…=Net::SSLeay::get_https3($buba_srv),443,“/”

您的代码中没有任何内容仅限制对SSL的访问(您可能指的是SSL 3.0)。事实上,除非以不同的方式显式设置
$Net::SSLeay::ssl\u version
get\u https3
将创建默认ssl上下文,默认情况下,该上下文将使用底层的最佳ssl/TLS版本