2013-02-04 37 views
3

我有一個加密/ php問題,我希望有人可以幫助我。 我的問題是我有一個簽名的PKCS7塊,我試圖在PHP中進行驗證。 然而,當我運行下面的PHP命令:在PHP中調用openssl_pkcs7_verify時指定輸入格式類型

openssl_pkcs7_verify($myfile, PKCS7_BINARY | PKCS7_NOVERIFY, $signers_file); 

我收到以下錯誤:

p7container = OpenSSL::PKCS7.new(file_contents); 
mystore = OpenSSL::X509::Store.new 
p7container.verify(nil, store, nil, OpenSSL::PKCS7::NOVERIFY) 

它的工作原理:

PKCS7 routines:SMIME_read_PKCS7:no content type 

如果我使用它紅寶石像這樣做。

另外,如果我通過OpenSSL的命令行運行它:

openssl smime -verify -inform der -in my_data_file -noverify 

它也適用。但是,如果我運行以下命令:

openssl smime -verify -in my_data_file -noverify 

這是相同的命令,但不指定通知參數,它失敗前指定的相同的錯誤消息,關於「沒有內容類型」,這使得它看起來我需要指定輸入文件格式。任何想法,我可以通過PHP做到這一點?

預先感謝您的幫助,

回答

2

我通過(使用exec功能)直接從PHP調用OpenSSL的周圍的問題了。確保將2> & 1添加到命令中,以將stderr重定向到標準輸出,因爲消息「驗證成功」發送到標準錯誤。

function verify($signedData, &$data = null) { 
    @mkdir("tmp"); 
    $random = randomString(32); 
    $signedFile = "tmp/" . $random . ".pem"; 
    $file = "tmp/" . $random . ".dat"; 
    file_put_contents($signedFile, $signedData); 
    $output = exec("openssl smime -verify -in $signedFile -inform DER -noverify -out $file 2>&1"); 
    if ($output == "Verification successful") { 
     $data = file_get_contents($file); 
     $result = true; 
    } else { 
     $result = false; 
    } 
    @unlink($signedFile); 
    @unlink($file); 
    return $result; 
} 
+0

Hi @goldmine, 感謝您的回覆。這實際上是我們最終做的,但我們想知道是否有辦法直接在openssl_pkcs7_verify調用中設置-inform選項,特別是因爲可能會有更多的pkcs7調用,而且不一定會要爲每個調用調用命令行工具。 – Hawkeye001

+0

@ Hawkeye001,最接近使用openssl_pkcs7_verify函數的唯一方法是在使用函數之前對文件進行base64編碼(更多詳細信息,請參閱此鏈接http://www.rootmanager.com/iphone-ota-configuration/iphone- ota-setup-with-signed-mobileconfig.html,請參閱「簽署.mobileconfig」文件,討論使用php簽署.mobileconfig:反轉,應該給我們想要的)。不過,我可能會堅持使用exec。 – quentinadam