2017-09-27 9 views
1

私は、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. 

に署名文字列に相当します。私はどんな助けもありがとう!ありがとう!

+0

を誤解。 SMIMEはpkcs7で署名します。だから私は最初に署名を抽出する必要があります。もしそうなら、それはうまく動作します。 検証では、pkcs7-string全体ではなく、署名が必要です。 – chris01

答えて

関連する問題