2017-05-09 9 views
7

मैं एक RRSIG सत्यापन करने के लिए कोशिश कर रहा हूँ का उपयोग कर, मैं PHP में openssl lib उपयोग करने के लिए कोशिश कर रहा हूँ। लेकिन मुझे openssl_verify फ़ंक्शन पर सार्वजनिक कुंजी पारित करने में समस्या हो रही है।पीएचपी साथ मान्य RRSIG openssl

यह एक आधार कोड, नेट/DNS2 लाइब्रेरी का उपयोग DNSSEC विकल्प के साथ एक DNS पूछताछ करना है। और DNSKEY और RRSIG प्राप्त करें।

<?php 

require_once 'Net/DNS2.php'; 

$r = new Net_DNS2_Resolver(array('nameservers' => array('127.0.0.1'))); 
$r->dnssec = true; 

try { 
     $result = $r->query('ip4afrika.nl', 'DNSKEY'); 

} catch(Net_DNS2_Exception $e) { 

     echo "::query() failed: ", $e->getMessage(), "\n"; 
     die(); // 
} 

// print_r($result->answer); 

$public_key_bin = base64_decode($result->answer[0]->key) ; 
$public_key_str = $result->answer[0]->key; //echo $public_key_str; die(); 
// $public_key_res = openssl_x509_parse($public_key_bin); 
$public_key_res = openssl_x509_read($public_key_str); 
// $public_key_res = openssl_pkey_get_public($public_key_str); 

while ($msg = openssl_error_string()) echo $msg . PHP_EOL; 

मैं इस त्रुटि संदेश मिलता है,

का उपयोग करते समय:

$public_key_res = openssl_x509_read($public_key_str); 

PHP Warning: openssl_x509_read(): supplied parameter cannot be 
coerced into an X509 certificate! in /src/Net_DNS2-1.4.3/i.php on line 
34 PHP Stack trace: PHP 1. {main}() /src/Net_DNS2-1.4.3/i.php:0 PHP 
2. openssl_x509_read() /src/Net_DNS2-1.4.3/i.php:34 error:0906D06C:PEM routines:PEM_read_bio:no start line 

तो मैं जोड़ने की कोशिश की BEGIN/END हेडर

$public_key_str = '-----BEGIN CERTIFICATE-----' . PHP_EOL . $result->answer[0]->key . PHP_EOL . '-----END CERTIFICATE-----' ; 

और मिल गया इस त्रुटि संदेश,

error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 
error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error 
error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib 

तो यह मैं समारोह गलत प्रारूप खिला कर रहा हूँ लगता है, मैं अभी भी googling रहा हूँ, लेकिन किसी भी मदद का स्वागत किया जाएगा।

अंततः मैं के साथ हस्ताक्षर मान्य करना:

openssl_verify($data, $signature, $public_key_res, 'RSA-SHA256'); 
+0

तुम देखो @ http://php.net/manual/en/function.openssl-verify.php किया। वे अच्छा उदाहरण है –

+0

हाँ मैं @E_p किया था, मेरी समस्या कैसे कुंजी जो मैं कार्य करने के लिए DNS क्वेरी से प्राप्त कर पारित करने के लिए, कोई फर्क नहीं पड़ता जो प्रारूप मैं कोशिश, मैं कुंजी प्रारूप किसी तरह से गलत होने के बारे में त्रुटि मिलती है। – Rabin

+0

क्या यह संभव है, कि जब आप कुंजी प्राप्त करते हैं तो इसमें अतिरिक्त सफेद-स्थान या कुछ ऐसा होता है जो उस समस्या को बना सकता है? –

उत्तर

0

PHP_EOL मंच विशिष्ट है, क्या मंच आप इस कोड का परीक्षण कर रहे हैं, लेकिन स्पष्ट रूप से '\n' के साथ लगातार की जगह की कोशिश यकीन नहीं। देखें कि क्या मदद करता है।

+0

कोई अलग नहीं किया। – Rabin

2

लघु जवाब:

तुम सिर्फ PHP में क्षमता की जरूरत है, तो आप सिर्फ https://github.com/metaregistrar/php-dnssec-validator उपयोग कर सकते हैं।

लांग उत्तर:

कारण आप लोड नहीं कर सकता क्योंकि यह एक अलग स्वरूप में है कुंजी डेटा नहीं है। rfc3110 के अनुसार:

Field    Size 
-----    ---- 
exponent length 1 or 3 octets (see text) 
exponent   as specified by length field 
modulus   remaining space 

जबकि आरएसए सार्वजनिक कुंजी में थोड़ा और अधिक जटिल हैं - प्रतिपादक और मापांक के अलावा, आप सही OID as such (2nd answer) अवश्य लगा दें की जरूरत है।

प्रक्रिया है उसके बाद थोड़ा ऐंठा हुआ:

  1. हस्ताक्षर और चाबी टैग प्राप्त RRSIG रिकॉर्ड जाओ (जो कुंजी का उपयोग करने का निर्धारण करने के)

  2. उपयोग से सार्वजनिक कुंजी हस्ताक्षर सत्यापित करने के लिए सही DNSKEY आरआर।

नहीं है यह भी एक प्रक्रिया का वर्णन किया here (अजगर में)

+0

धन्यवाद अन्य एसओ पोस्ट का तीसरा लिंक बहुत ही जानकारीपूर्ण था। मैं भी अजगर कार्यान्वयन में आया, लेकिन मुझे यह समझ में नहीं आया, आखिरी बिट जो परिभाषित करता है कि यह निर्धारित कैसे हो सकता है कि यह वैध हस्ताक्षर था, बहुत अस्पष्ट है, पीएचपी को इतनी लंबी संख्या के साथ काम करने में समस्या है, इसलिए यही कारण है मैं openssl lib में निर्माण का उपयोग करना चाहता था, जो नौकरी करने में सक्षम होना चाहिए। क्या आप मुझे समझने में मदद कर सकते हैं कि लौटे आरआरएसआईजी को कैसे विच्छेदित किया जाए और इसे किसने बनाया? – Rabin