【问题标题】:Verifying a SMIME-signature with Perl and OpenSSL使用 Perl 和 OpenSSL 验证 SMIME 签名
【发布时间】:2018-03-09 09:00:55
【问题描述】:

我尝试制作一个“手动”验证 SMIME 消息的 Perl 脚本。 我真的尝试了很多,但它不起作用。

大多数时候验证 “签名比密钥长” 或者只是给出一个错误的回报。

如果我在控制台上使用 OpenSSL,它就像一个魅力。

CER=mycert
KEY=mykey
MSG=msg.txt
PLA=plain.txt

# create keys with:
# openssl req -x509 -nodes -newkey rsa:1024 -keyout mykey -out mycert

echo -n "test" > $PLA

# sign
openssl cms -sign -md sha1 -subject "test" -from "sam"  -to "alice" 
  -signer $CER -inkey $KEY -in $PLA -out $MSG

# verify
openssl smime -verify -purpose any -in $MSG -CAfile $CER 
  -CApath /etc/ssl/certs

>> Verification successful

生成并验证 msg.txt

To: alice
From: sam
Subject: test
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/pkcs7-signature";     
micalg="sha1"; boundary="----654C4F221B45801BF9249BC8B2EBC320"

This is an S/MIME signed message

------654C4F221B45801BF9249BC8B2EBC320
test
------654C4F221B45801BF9249BC8B2EBC320
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIIEZgYJKoZIhvcNAQcCoIIEVzCCBFMCAQExCTAHBgUrDgMCGjALBgkqhkiG9w0B
BwGgggJfMIICWzCCAcSgAwIBAgIJAJeRsnkW7iHCMA0GCSqGSIb3DQEBCwUAMEUx

我在这里缩短它。

Eep0LlT+ThDmdSWm8OIPA4f5UCI5+jWB91Nf5CqKFhuua2obZmAOqZXcX4E6VdLV
taorGZL0OCiGuUY94QJEdoJZ7rlpkwFBBVE=

------654C4F221B45801BF9249BC8B2EBC320--

现在我尝试用非常简单的 Perl 来展示它。我简化了它,去掉了 MIME 处理,只使用 msg.txt 中的内联值。

use strict;
use warnings;
use Crypt::OpenSSL::X509;
use Crypt::OpenSSL::RSA;
use MIME::Base64;

my $in = "msg.txt";
my $crt = "mycert";

my $cert = Crypt::OpenSSL::X509->new_from_file ($crt);
my $pubkey = $cert->pubkey ();
my $rsa = Crypt::OpenSSL::RSA->new_public_key ($pubkey);

my $ct = "test";

my $sig = "MIIEZgYJKoZIhvcNAQcCoIIEVzCCBFMCAQExCTAHBgUrDgMCGjALBgkqhkiG9w0B
BwGgggJfMIICWzCCAcSgAwIBAgIJAJeRsnkW7iHCMA0GCSqGSIb3DQEBCwUAMEUx

我跳过了其余的。相当于msg.txt中的signature-string

Eep0LlT+ThDmdSWm8OIPA4f5UCI5+jWB91Nf5CqKFhuua2obZmAOqZXcX4E6VdLV
taorGZL0OCiGuUY94QJEdoJZ7rlpkwFBBVE=";

$sig = decode_base64 ($sig);   # make it binary
if ($rsa->verify ($ct, $sig))
{
  print "\nverified!\n";
}

# verify fails with "Signature longer than key" or returns false.

我不知道为什么它不起作用。我会很感激任何帮助,谢谢!

【问题讨论】:

  • 我有一些重大的误解。 SMIME 与 pkcs7 签约。所以我需要先提取签名。如果是这样,它工作正常。所以验证需要一个签名,而不是整个 pkcs7 字符串。

标签: perl openssl smime


【解决方案1】:

我建议你使用 openssl 函数 PKCS7_verify() https://github.com/openssl/openssl/blob/master/demos/smime/smver.c#L63

您可以在我当前的项目中查看如何通过 FFI 将 openssl 函数直接绑定到 perl - https://github.com/0x62ash/crypt-openssl-cms/blob/master/lib/Crypt/OpenSSL/CMS.pm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2020-06-11
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多