为什么SSL Web访问在交互式shell中以root用户身份运行,而在后提交脚本中不是用户`apache`?

时间:2011-03-06 16:48:34

标签: perl unix ssl

我有一个Perl程序,旨在从subversion post-commit脚本运行,该脚本需要连接到基于HTTPS的Web API。

当我以交互式shell的形式测试程序时,它的工作正常。

当它从post-commit脚本运行时,它会出错,LWP的响应就是“500 Connect failed”。

有一些证据表明,从post-commit脚本运行时,SS未启用,因为当我设置$ENV{HTTPS_DEBUG} =1;并以root身份运行时,我会看到调试输出,例如

  

SSL_connect:before / connect initialization

但是从post-commit脚本中打印出非SLL调试信息。

  • post-commit脚本以用户apache运行。
  • 我正在运行CentOS 64位。

自从我完成任何Unix工作已经有好几年了,所以我不确定在这种情况下让SSL工作的下一步是什么。

3 个答案:

答案 0 :(得分:2)

环境的差异让我怀疑。与运行cron作业一样,环境,INC路径或perl解释器本身可能完全不同,无法找到Crypt :: SSLeay或您用于SSL支持的任何其他内容。

作为故障排除步骤,请尝试在shell和post-commit挂钩中使用此程序,以查看两者之间是否存在环境差异。这将转储几个运行时变量,这些变量显示perl对tempfile的了解情况。

#!/usr/bin/perl

use Data::Dumper;
use File::Temp qw( tempfile );
use strict;
use warnings;

my $tempdir = '/tmp';            # Change this if necessary.

my( $fh, $fname ) = tempfile( "tempXXXXXX", DIR => $tempdir, UNLINK => 0 );
print $fh Data::Dumper->Dump( [ \@INC, \%INC, $^X, $0, $], \@ARGV, \%ENV ],
                              [ qw( @INC %INC ^X 0 ] @ARGV %ENV ] ) ] );
close( $fh );

# Change this if the post-commit hook doesn't pass stdout back to you.
print "Wrote data to $fname.\n";

__END__

如果它们大不相同,那么下一步就是使后提交挂钩中的环境与shell下的环境相同,例如:通过设置use lib qw( /path/to/where/ssl/modules/are/installed );,使用指向其他Perl解释器的完整路径或任何适当的内容,在脚本的use部分添加PERL5LIB行。如果您不熟悉某些变量的说明,请参阅perldoc perlvar

答案 1 :(得分:0)

这不是Perl问题。 Perl只做它所说的。弄清楚在Perl上面说什么是“http:”vs“https:”,然后对其进行排序。您不需要“配置Perl ...以使用SSL”。

答案 2 :(得分:0)

我不得不这样做:

setsebool httpd_can_network_connect=on

允许httpd进程建立网络连接