Bash 在这个脚本中如何调用OpenSSL以及在哪里调用OpenSSL?

Bash 在这个脚本中如何调用OpenSSL以及在哪里调用OpenSSL?,bash,perl,openssl,centos6,Bash,Perl,Openssl,Centos6,centos-6.8 perl,v5.10.1(*)为x86_64-linux-thread-multi构建 我正在尝试更新一个名为CSP的Perl脚本。我对该脚本的经验仅限于在少数需要新服务器证书的情况下运行它。我联系了原剧本的作者Leif Johansson,但没有收到回复。修改后的项目,我目前正在工作和参考下面可以找到在 这就是背景。我的Perl编程经验微不足道。因此,我在这里提出的问题可能很幼稚 我在/blib/lib/CSP.pm中有这些代码片段: . . . package CSP;

centos-6.8 perl,v5.10.1(*)为x86_64-linux-thread-multi构建

我正在尝试更新一个名为CSP的Perl脚本。我对该脚本的经验仅限于在少数需要新服务器证书的情况下运行它。我联系了原剧本的作者Leif Johansson,但没有收到回复。修改后的项目,我目前正在工作和参考下面可以找到在

这就是背景。我的Perl编程经验微不足道。因此,我在这里提出的问题可能很幼稚

我在
/blib/lib/CSP.pm
中有这些代码片段:

. . .
package CSP;

use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);

require Exporter;
require AutoLoader;
use IO::File;
use Term::Prompt;
use POSIX qw(strftime);
use Date::Calc qw(Day_of_Week Gmtime Add_Delta_Days Add_Delta_DHMS);
use Sys::Hostname;

@ISA = qw(Exporter AutoLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
@EXPORT = qw();
@EXPORT_OK = qw($_openssl);
$VERSION = '0.40';


# Preloaded methods go here.

# Autoload methods go after =cut, and are processed by the autosplit program.

$CSP::_openssl='openssl';

. . .

$CSP::_openssl='openssl';
. . .
sub genkey
  {
    my $self = shift;
    my $args = shift;

    $self->die("Required parameter keyfile missing")
      unless $args->{keyfile};

    $args->{keysize} = 4096 unless $args->{keysize} > 0;
    $args->{keypass} = "'" . $self->getPassword("Private key password",1) . "'"
      unless $args->{keypass};

    $self->warn("# Password argument: $args->{keypass}\n") if $ENV{CSPDEBUG};

    my $cmd = "-out $args->{keyfile} $args->{keysize}";
    $cmd = "-des3 -passout pass:$args->{keypass} ".$cmd if defined($args->{keypass});
    $self->{openssl}->cmd('genrsa',$cmd,$args);
  }

 ## Generate and optionally self-sign the request
  my $process;
  my $what;
  my $common_args = "-$args->{digest} -days $args->{days} ".
    " -key $cakey -passin pass:$args->{keypass}";
  if ($args->{csrfile})
    {
      $self->{openssl}->cmd('req',"-new $common_args -out $args->{csrfile}",$args);
      $what = "generated CA request for";
    }
  else
    {
      $self->{openssl}->cmd('req',"-x509 $common_args -new -out $cacert",$args);
      $what = "initialized self-signed";
    }

  $self->warn("Successfully $what CA $self->{name}")
    if $args->{verbose};
      }
  }

sub checkCA
  {
    my $self = shift;
    my $dir = $self->caDir();

    $self->die("Uninitialized CA: missing or unreadable ca certificate in $dir")
      unless -r "$dir/ca.crt";

    $self->die("Uninitialized CA: missing or unreadable ca private key in $dir")
      unless -r "$dir/private/ca.key";

    $dir;
  }
. . .
在脚本文件的结尾处:

. . .
    $self->{csp} = $csp;

    $cmd = '' if $cmd eq 'dummy';

    my $engine = "-engine opensc" if $ENV{CSP_OPENSC};

    my $redirect = ($args->{verbose} == 0 && $rw ne 'r' ? ">/dev/null 2>&1" : "");
    warn "${lp}$self->{openssl} $cmd $cfgcmd $cmdline ${redirect}${rp}"
      if $ENV{CSPDEBUG};
    if ($rw eq 's')
      {
  $self->{rc} = system("$self->{openssl} $cmd $engine $cfgcmd $cmdline ${redirect}");
      }
    else
      {
  open $self->{fh},"${lp}$self->{openssl} $cmd $engine $cfgcmd $cmdline ${redirect}${rp}" or
    $self->{csp}->die("Unable to execute: $!");
      }

    $self;
  }
. . .
当我在调试打开的情况下使用以下命令行运行此命令时:

csp HLL_ROOT init \
  --keysize=4096 \
  --days=7318 \
  --url=ca.harte-lyne.ca \
  --email=certificates@harte-lyne.ca \
  --digest=sha512 \
  --verbose \
  "CN=HLL_ROOT,OU=Networked Data Services,O=Harte & Lyne Limited,L=Hamilton,ST=Ontario,C=CA,DC=harte-lyne,DC=ca"
然后我看到:

openssl genrsa  -des3 -passout pass:'a test' -out /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT/private/ca.key 4096
其次是:

openssl genrsa  -des3 -passout pass:'a test' -out /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT/private/ca.key 4096
最后是:

[CSP][HLL_ROOT] Successfully initialized self-signed CA HLL_ROOT
但是,在上述命令中显示为参数的目录中找不到ca.key和ca.crt的预期输出

$ find /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT -name ca\.\*
$ 
然而,如果我将这些确切的命令复制并粘贴到bash会话shell中,它们就可以工作了

openssl genrsa  -des3 -passout pass:'a test' -out /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT/private/ca.key 4096
Generating RSA private key, 4096 bit long modulus
.....................................++
........................++
e is 65537 (0x10001)

收益率:

$ find /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT -name ca\.\*
/home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT/private/ca.key
/home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT/ca.crt
在我看来,这些命令是正确创建的,但是没有调用openssl实用程序。由于在生成这些命令的部分中没有分支代码,我得出结论:构造
$self->{openssl}->cmd('req',“-x509$common_args-new-out$cacert”,$args)
是对openssl的实际调用,但我不知道这意味着如何工作

这是怎么回事?为什么它不起作用


是否应该检查openssl的返回代码?

根据@simbabque注释进行openssl调用的位置如下:

1398    use IPC::Run qw( start pump finish timeout new_appender new_chunker);
        . . .
1418    sub cmd
1419      {
1420        my $self = shift;
1421        my $cmd = shift;
1422        my $cmdline = shift;
1423        my $args = shift;
1424        
1425        my $conf;
1426        my $cfgcmd;
        . . .
1448        $self->{_handle}->pump while length ${$self->{_in}};
        . . .

潜在的困难是在密码短语中使用嵌入的空白。编写时,代码将参数作为串联字符串传递给
IPC:Run
。对于作为字符串IPC传递的参数:Run使用空白作为参数分隔符。正确的处理方法是重构代码,使用数组来传递参数。

Per@simbabque comment进行openssl调用的地方是:

1398    use IPC::Run qw( start pump finish timeout new_appender new_chunker);
        . . .
1418    sub cmd
1419      {
1420        my $self = shift;
1421        my $cmd = shift;
1422        my $cmdline = shift;
1423        my $args = shift;
1424        
1425        my $conf;
1426        my $cfgcmd;
        . . .
1448        $self->{_handle}->pump while length ${$self->{_in}};
        . . .

潜在的困难是在密码短语中使用嵌入的空白。编写时,代码将参数作为串联字符串传递给
IPC:Run
。对于作为字符串IPC传递的参数:Run使用空白作为参数分隔符。处理这个问题的正确方法是重构代码,使用数组来传递参数。

我是这个包的原始作者,我很久以前就放弃了它,原因很明显。去看看更易于维护的东西(即使它基本上只是bash脚本)

我是该软件包的原始作者,我很久以前就放弃了它,原因显而易见。去看看更易于维护的东西(即使它基本上只是bash脚本)

我们缺少太多的代码来回答您的问题
$self
是对象,
$self->{openssl}
是该对象的属性。它又包含另一个对象,因为它正在对其调用方法
cmd
。请查找其他出现的
$self->{openssl}
,最好是定义它的地方。还包括程序顶部的所有
use
require
语句。你是对的,我从一开始就知道这一点。整个脚本可在介绍中给出的公共github存储库中获得:。我在这里发布的内容太长了,我发现了我提出的问题在技术上的正确答案。系统调用位于脚本的末尾,如我刚刚发布的附加代码片段所示。我只是不知道如何从创建命令行的地方调用脚本的这一部分。这基本上就是我需要向我解释的。我用请求的脚本头信息更新了代码片段。有几十行包含
$self->{openssl}
。定义语句是什么样子的?我在github上已经找到了。它是一个CSP::OpenSSL对象。该类在同一文件中定义。在这个.pm文件中有几个
s。它正在向某个方向推进。这可能就是它发出命令的地方。我还在读代码。我们缺少太多的代码,无法回答您的问题
$self
是对象,
$self->{openssl}
是该对象的属性。它又包含另一个对象,因为它正在对其调用方法
cmd
。请查找其他出现的
$self->{openssl}
,最好是定义它的地方。还包括程序顶部的所有
use
require
语句。你是对的,我从一开始就知道这一点。整个脚本可在介绍中给出的公共github存储库中获得:。我在这里发布的内容太长了,我发现了我提出的问题在技术上的正确答案。系统调用位于脚本的末尾,如我刚刚发布的附加代码片段所示。我只是不知道如何从创建命令行的地方调用脚本的这一部分。这基本上就是我需要向我解释的。我用请求的脚本头信息更新了代码片段。有几十行包含
$self->{openssl}
。定义语句是什么样子的?我在github上已经找到了。它是一个CSP::OpenSSL对象。该类在同一文件中定义。在这个.pm文件中有几个
s。它正在向某个方向推进。这可能就是它发出命令的地方。我还在读代码。