Perl调用OpenSSL导出证书至文件需手动回车的自动化解决求助
解决方法
方法1:通过管道传递空输入自动退出
Windows下用echo |给openssl s_client传递空输入,命令完成证书握手后会读取到EOF并自动退出,无需手动回车。修改脚本中的命令行即可:
$commandToExecute = "echo | openssl s_client -connect varcert.test.com:8334"; my $filename = 'C:\F6\certoutput.txt'; my @cmdout = `$commandToExecute`; open(my $cmd, '>', $filename) or die "Could not open file '$filename' $!"; print $cmd @cmdout; close $cmd; # 关闭文件句柄避免资源泄漏
方法2:利用空设备输入+专用参数
如果echo |方式不稳定,可结合Windows的空设备< NUL给openssl传递EOF,同时添加-servername(适配需要SNI的站点)和-quiet(减少冗余输出)参数:
$commandToExecute = "openssl s_client -connect varcert.test.com:8334 -servername varcert.test.com -quiet < NUL"; my $filename = 'C:\F6\certoutput.txt'; open(my $openssl_fh, '-|', $commandToExecute) or die "Failed to run openssl: $!"; open(my $out_fh, '>', $filename) or die "Could not open file '$filename' $!"; print $out_fh <$openssl_fh>; close $openssl_fh; close $out_fh;
方法3:直接导出证书文件(仅需证书时用)
如果目标只是获取证书而非完整的s_client输出,可让openssl直接导出PEM格式证书,完全无交互:
my $cert_file = 'C:\F6\certoutput.pem'; $commandToExecute = "openssl s_client -connect varcert.test.com:8334 -servername varcert.test.com -showcerts < NUL | openssl x509 -outform PEM > $cert_file"; system($commandToExecute) == 0 or die "Certificate export failed: $?";
内容的提问来源于stack exchange,提问作者rick
相关产品推荐
相关产品推荐

