Я пытаюсь сгенерировать токен для запроса Http-запроса на основе закрытого ключа, сгенерированного с использованием OpenSSL RSA (2048), а затем открытого ключа, который генерируется группой, имеющей API, который мы вызываем.Одна сторона строки токена зашифрована с использованием открытого ключа, а другая - с помощью закрытого ключа.Шифрование с закрытым ключом работает с кодом ниже, но вызов Crypt::OpenSSL::RSA->new_public_key(public key string)
завершается неудачно с проблемой «Ошибка: формат нераспознанного ключа».Я не уверен, что не так с ключом, но, учитывая, что другой работает (и предположительно был сгенерирован с использованием того же инструмента Unix OpenSSL), это кажется странным.
Любая помощь будет принята с благодарностью.
Спасибо, Дейв
use strict;
use Time::HiRes qw( gettimeofday );
use Crypt::OpenSSL::RSA;
use Crypt::OpenSSL::X509;
use Crypt::OpenSSL::Random;
use MIME::Base64;
use DateTime;
my $sysTime=undef;
my $sTime=undef;
my $sAPIToken;
my $EDMPrivateKey=qq~
-----BEGIN PRIVATE KEY-----
<private key base 64>
-----END PRIVATE KEY-----
~;
my $DMPublicKey=qq~
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsftmdt4aAZ7B1F7wVjIz0RSO6w1bIX/4
<rest of public key>
-----END PUBLIC KEY-----
~;
sub setTime() {
my $ms;
my $ms2;
my $microSec;
my $tz;
($sysTime,$microSec) = gettimeofday();
# $sysTime=gettimeofday();
$ms=sprintf("%.*s",3,$microSec);
$ms2=$microSec-($ms*1000);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($sysTime);
$sTime=sprintf("%04d-%02d-%02dT%02d:%02d:%02d.%03d-%04d",
$year+1900,$mon+1,$mday,$hour,$min,$sec,$ms,$tz);
$sysTime=$sysTime*1000+$ms;
}
sub setTimeNew() {
my $ms;
my $ms2;
my $microSec;
($sysTime,$microSec) = gettimeofday();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($sysTime);
$ms=sprintf("%.*s",3,$microSec);
$ms2=$microSec-($ms*1000);
my $dt=DateTime->new(
year => $year+1900,
month => $mon+1,
day => $yday,
hour => $hour,
minute => $min,
second => $sec,
nanosecond => $microSec*1000
);
$sysTime=$sysTime*1000+$ms;
$sTime=$dt->strftime("%C%y-%m-%dT%H:%M:%S.%3N%z");
}
sub main() {
my $sTokenPt1;
my $sTokenPt2;
my $sPubStr;
my $rsaPublic = Crypt::OpenSSL::RSA->new_public_key($DMPublicKey);
$rsaPublic->use_sha1_hash();
setTimeNew();
$sTokenPt1 = encode_base64($rsaPrivate->encrypt($sysTime));
$sTokenPt2 = encode_base64($rsaPublic->encrypt($sTime));
printf "%d\n%s\n",$sysTime,$sTime;
$sAPIToken = sprintf("%s,%s",$sTokenPt1,$sTokenPt2);
printf "%d\n%s\nTTOKEN=%s\n",$sysTime,$sTime,$sAPIToken;
}
eval {
main();
};
if ($@) {
printf "Error : %s\n",$@;
}