私は、SMIMEメッセージを「手動で」検証するPerlスクリプトを作成しようとしています。 私は本当にたくさん試しましたが、うまくいきません。PerlとOpenSSLでSMIME署名を確認する
ほとんどの場合、確認は 「署名よりも長い鍵」 を入れているか、誤ったリターンを返します。
コンソールでOpenSSLを使用すると、それは魅力的です。
私はここでそれを短く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
msg.txtを生成し、検証し
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
。
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
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-string全体ではなく、署名が必要です。 – chris01