вы нашли решение своей задачи?
может быть эта проблема аналогична вашей и вы сможете подсказать выход из тупика...
ниже представлен тестовый пример, который подписывает тестовые данные и тут же проверяет подпись.
проблема в том, что подпись является невалидной.
my $data = '1234567890';
my $user = '18b729e9d7485c1b12964e2ef3fba8a8'; # идентификатор юзера, по которому находится сертияикат (ниже)
# ищем сертификат
my $Store = Win32::OLE->new('CAPICOM.Store') or die "Cannot start CAPICOM.Store";
$Store->Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY );
my $Certificates = $Store->Certificates;
my $certificate;
for ( my $i = 1 ; $i <= $Certificates->Count() ; $i++ ) {
my $Certificate = $Certificates->Item($i);
if ( hashSubjectName( $Certificate->SubjectName() ) eq $user ) {
$certificate = $Certificate;
last;
}
}
print $certificate->SubjectName(); # да, наш сертификат, имеет приватный ключ $Certificate->HasPrivateKey()
# подписываем выше найденным сертификатом
my $Signer = Win32::OLE->new('CAPICOM.Signer') or die "Cannot start CAPICOM.Signer";
$Signer->LetProperty( 'Certificate', $certificate );
my $SignedData = Win32::OLE->new('CAPICOM.SignedData') or die "Cannot start CAPICOM.SignedData";
$SignedData->LetProperty( 'Content', $data ); # или $SignedData->Content($data) ?
my $signature = $SignedData->Sign( $Signer, 1, CAPICOM_ENCODE_BASE64 );
print $signature; # что-то есть
# проверяем подпись
my $SignedData = Win32::OLE->new('CAPICOM.SignedData') or die "Cannot start CAPICOM.SignedData";
$SignedData->LetProperty( 'Content', $data ); #или $SignedData->Content($data) ?
print $SignedData->Verify( $signature, 1, CAPICOM_VERIFY_SIGNATURE_ONLY );
# возвращается undef, что значает, что подпись неверна (и так ли это?)
если вывести все переменные сертификата из подписи(!) -
$SignedData->Certificates(1);
- то окажется, что он похож на исходный сертификатор (которым подписывали), НО он не имеет приватного ключа ($Certificate->HasPrivateKey())
в каком месте я допускаю ошибку?
имеет смысл использовать CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE ?
заранее спасибо.