2013-09-24 38 views
2

我有一個包含證書本身和私鑰的自簽名簽名。我的目的是檢查這個私鑰是否與證書匹配。我做的是以下幾點:php openssl:如何將私鑰與證書相匹配

$private = openssl_pkey_get_private("path/to/certificate"); 
$public = openssl_pkey_get_public("path/to/certificate"); 
openssl_sign("path/to/certificate", $sig, $private); 

所以我創建基於私鑰和公鑰的文件。所以我需要做的是將此簽名與證書中的現有簽名進行比較。如果它們匹配,則意味着私鑰匹配。但是,我無法從文件中檢索現有簽名信息。我想知道我的方式是否正確,因爲我找不到有關Google的信息。

謝謝。

回答

3

我有一個包含證書本身和私鑰的自簽名簽名。我的目的是檢查這個私鑰是否與證書匹配。我所做的是以下幾點:

證書不包含私鑰。只需公鑰。它們由一個私鑰簽名(在自簽證書的情況下,它是與證書中包含的公鑰對應的私鑰),但它們不包含私鑰。

所以我需要做的是比較這個簽名與證書中的現有簽名。如果它們匹配,則意味着私鑰匹配。

他們不應該匹配。查看phpseclib's X.509 parser並解碼他們提供的樣本證書。根級有三部分。 tbsCertificate,signatureAlgorithm和簽名。簽名是基於tbsCertificate。所以你想要一個tbsCertificate簽名來匹配所有三個字段的簽名。這幾乎是永遠不會發生的。

至於提取簽名本身...你可以使用phpseclib。例如。

<?php 
include('File/X509.php'); 

$x509 = new File_X509(); 
$cert = $x509->loadX509('...'); 

echo $cert['signature'] 
5

如果您只想檢查私鑰和證書是否匹配,您可以撥打openssl_x509_check_private_key。它以證書和私鑰作爲輸入並返回它們是否匹配。看看文檔here

編輯另外,請注意,證書中的簽名是使用組成證書的不同信息到達的,而傳遞給openssl_sign函數的數據只是證書的路徑。因此,即使您最終確定了從證書中提取簽名的方法,它仍然不會與openssl_sign的輸出(絕對不是您傳遞給openssl_sign的$ data)的輸出相匹配。

+0

感謝您的回覆。我想做「真正的」檢查。我想比較簽名,但我無法從證書文件中提取簽名信息。你有什麼想法我可以檢索它嗎? – Dundar

+1

我不認爲在PHP OpenSSL中有直接的方式從證書文件中檢索簽名信息。你可以得到最接近的openssl_x509_parse來從證書中獲取信息。但是,即使這樣也不能檢索簽名。如果您可以親自解析證書來進行試驗,請查看http://bit.ly/17ZIdwC。函數''extractSignature''可能會有所幫助。但是,它期望一個DER編碼證書。 – Karthik

+0

好吧然後我會在自簽名證書的情況下使用openssl_x509_check_private_key函數。但是,如果用戶提供中間證書和真實證書,應該如何檢查匹配? – Dundar