2016-10-20 3 views
1

のCentOS-6.8 perlの、v5.10.1(*)はx86_64-linuxのスレッドのマルチこのスクリプトではどのようにOpenSSLが呼び出されますか?

のために構築された私は、CSPと呼ばれるPerlスクリプトを更新しようとしています。スクリプトに関する私の経験は、まれに新しいサーバー証明書が必要なときにスクリプトを実行することに限られています。元の脚本、Leif Johanssonの著者に連絡したが、私は応答を受けなかった。私が現在取り組んでいる、以下を参照している修正プロジェクトは、https://github.com/byrnejb/rcsp/tree/csp040にあります。

これは背景です。 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 protected] \ 
    --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 

で終わる:

しかし、ca.keyおよびca.crtの予想出力はで引数として示されるディレクトリには見られない
[CSP][HLL_ROOT] Successfully initialized self-signed CA HLL_ROOT 

上記のコマンド。

$ find /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT -name ca\.\* 
$ 

しかし、これらの正確なコマンドをコピーしてbashセッションシェルに貼り付けると、それらは機能します。

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) 

openssl req -config /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT/tmp/csp-8154.conf -x509 -sha512 -days 7318 -key /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT/private/ca.key -passin pass:'a test' -new -out /home/byrnejb/Projects/Software/rcsp/ca_test_a/csp/HLL_ROOT/ca.crt 

利回り:

$ 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パー

+0

ご質問には多すぎるコードがありません。 '$ self'はオブジェクトであり、' $ self - > {openssl} 'はそのオブジェクトの属性です。それは、別のオブジェクトを含みます。なぜなら、その上に 'cmd'メソッドを呼び出すからです。 '$ self - > {openssl}'の他の出現箇所、できればそれが定義されている箇所を探してください。プログラムの先頭に 'use'と' require'文を含めてください。 – simbabque

+0

あなたは正しいと私は最初からそれを知っていた。このスクリプト全体は、序論の公開githubリポジトリhttps://github.com/byrnejb/rcspにあります。私がここに掲示したものは、それがそのまま残っています。 –

+0

そして私は、私の質問に技術的に正解があることを発見しました。システムコールは、ちょうど私が掲示した追加のコード断片に示されているように、スクリプトの末尾にあります。私は、スクリプトのどの部分がコマンドラインの作成場所からどのように呼び出されるのか分かりません。そして、それは本質的に私が私に説明する必要があるものです。 –

答えて

0

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は引数の区切り文字として空白を使用します。これを処理する正しい方法は、代わりに引数を渡すために配列を使用するコードをリファクタリングすることです。

関連する問題