我有一个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));
}
}
答案 0 :(得分:3)
您已使用TLS。 “SSL”是旧版本协议的名称,“TLS”是新版本的名称。大多数网站不再接受与官方称为“SSL”的协议版本的连接。以下是TLS版本状态的摘要:
您可以调用Net::SSLeay::get_options
来检查SSLv3是否已禁用,即检查您的客户端是否拒绝连接到仅SSLv3服务器。您应该确保在您的客户端上禁用SSLv3:想要破坏您的安全性的攻击者可能伪装成合法服务器,让您的客户端连接,然后利用旧协议的漏洞来成功冒充合法服务器。由于您要连接到特定服务器,如果该服务器支持TLS 1.2,也可以通过调用Net::SSLeay::set_options
来禁用TLS 1.0和1.1。
答案 1 :(得分:1)
这是一个如何切换到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/');
答案 2 :(得分:1)
... = Net :: SSLeay :: get_https3(&#34; $ buba_srv&#34;,443,&#34; /&#34;);
您的代码中没有任何内容限制访问SSL(您可能仅指SSL 3.0)。实际上,除非$Net::SSLeay::ssl_version
明确设置为get_https3
,否则将创建默认SSL上下文,默认情况下将使用底层OpenSSL库支持的最佳SSL / TLS版本,自OpenSSL 1.0.1起为TLS 1.2 (2012年发布)。
因此,如果您的代码尚未使用TLS 1.2(您是否已经检查过?),请检查代码中某处是否设置了$Net::SSLeay::ssl_version
,或者您的OpenSSL版本是否过旧。
除此之外,我真的建议不要使用Net::SSLeay::get_https3
和类似的。这些函数没有正确验证证书(这是记录的),所以你不会意识到他们是否是中间人攻击的人,除非你明确添加自己的验证 - 这不是微不足道的,你的代码甚至没有尝试这样做。
而是使用更高级别的模块,如LWP::UserAgent,这使得简单的HTTPS,使用理智的默认值(至少在当前版本中),并正确验证证书:
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;
您还可以使用HTTP::Tiny或Mojo::UserAgent。但与LWP相反,使用verify_SSL
选项和HTTP::Tiny
以及ca
参数Mojo::UserAgent
时,需要在使用这些模块时明确启用正确的证书验证。