の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パー
ご質問には多すぎるコードがありません。 '$ self'はオブジェクトであり、' $ self - > {openssl} 'はそのオブジェクトの属性です。それは、別のオブジェクトを含みます。なぜなら、その上に 'cmd'メソッドを呼び出すからです。 '$ self - > {openssl}'の他の出現箇所、できればそれが定義されている箇所を探してください。プログラムの先頭に 'use'と' require'文を含めてください。 – simbabque
あなたは正しいと私は最初からそれを知っていた。このスクリプト全体は、序論の公開githubリポジトリhttps://github.com/byrnejb/rcspにあります。私がここに掲示したものは、それがそのまま残っています。 –
そして私は、私の質問に技術的に正解があることを発見しました。システムコールは、ちょうど私が掲示した追加のコード断片に示されているように、スクリプトの末尾にあります。私は、スクリプトのどの部分がコマンドラインの作成場所からどのように呼び出されるのか分かりません。そして、それは本質的に私が私に説明する必要があるものです。 –