【发布时间】: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 字符串。