2012-03-05 10 views
14

मैं PHP 5.x में एक स्व-हस्ताक्षरित प्रमाणपत्र बनाना चाहता हूं। मेरे अपने (वैकल्पिक) openssl विन्यास के साथ जो मेरे PHP कोड द्वारा परिभाषित किया जाना चाहिए। PHP स्क्रिप्ट विभिन्न वातावरण (साझा होस्टिंग वेबसर्वर) पर चलती है।क्या OpenSSL को openssl.conf के लिए वास्तव में एक पथ की आवश्यकता है?

आधिकारिक PHP Manual का कहना है:

डिफ़ॉल्ट रूप से, आपके सिस्टम openssl.conf में जानकारी अनुरोध प्रारंभ करने में प्रयोग किया जाता है; आप configargs की config_section_section कुंजी सेट करके कॉन्फ़िगरेशन फ़ाइल अनुभाग निर्दिष्ट कर सकते हैं। आप जिस फ़ाइल का उपयोग करना चाहते हैं उसके पथ में कॉन्फ़िगर कुंजी के मान को सेट करके आप वैकल्पिक openssl कॉन्फ़िगरेशन फ़ाइल भी निर्दिष्ट कर सकते हैं। निम्नलिखित चाबियाँ, अगर configargs में मौजूद है, नीचे तालिका में सूचीबद्ध के रूप में openssl.conf में उनके समकक्ष के रूप में व्यवहार .....

मेरा प्रश्न: वहाँ एक कारण है कि मैं पथ निर्दिष्ट करने के लिए है है स्पष्ट रूप से openssl.conf है, क्योंकि इसके बिना ठीक से काम करने लगता है:

$Configs = array(  
    'digest_alg' => 'sha1', 
    'x509_extensions' => 'v3_ca', 
    'req_extensions' => 'v3_req', 
    'private_key_bits' => 1024, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
    'encrypt_key' => true, 
    'encrypt_key_cipher' => OPENSSL_CIPHER_3DES 
); 

$privkey = openssl_pkey_new(); 
$csr = openssl_csr_new($dn, $privkey, $Configs); 
$sscert = openssl_csr_sign($csr, null, $privkey, 365, $Configs); 

संपादित करें: PHP Manual पर

उपयोगकर्ता में योगदान नोट, इसलिए वे हमेशा एक पथ openssl.cnf को निर्दिष्ट कर सकता ? उदाहरण के लिए:

$configargs = array(
    'config' => '/etc/ssl/openssl.cnf', 
    'digest_alg' => 'md5', 
    'x509_extensions' => 'v3_ca', 
    'req_extensions' => 'v3_req', 
    'private_key_bits' => 666, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
    'encrypt_key' => false, 
); 
+1

.conf फ़ाइल चूक निर्दिष्ट करने के लिए प्रयोग किया जाता है बनाना ताकि आप अधिक एक ही बात में प्रवेश करने की जरूरत नहीं है और आपके द्वारा बनाए गए प्रत्येक प्रमाण के लिए। चूक के बिना जा रहा है ठीक है, बस और अधिक थकाऊ। –

+3

मैं एक PHP/OpenSSL विशेषज्ञ नहीं हूँ, लेकिन ऐसा लगता है कि कुछ विन्यास सेटिंग्स परिभाषित नहीं किया जा सकता/एक PHP स्क्रिप्ट से बदल दिया है। क्या कोई इसे पुष्टि/खारिज कर सकता है? – Mike

उत्तर

10

है कि PHP में $ configargs (PHP मापदंडों आप OpenSSL कार्यों के लिए पारित) द्वारा परिभाषित नहीं किया जा सकता OpenSSL में कई विन्यास सेटिंग्स हैं।

यदि आप वैकल्पिक openssl कॉन्फ़िगरेशन फ़ाइल निर्दिष्ट नहीं करते हैं, तो यह स्वचालित रूप से डिफ़ॉल्ट openssl.cnf ले जाएगा।

अनुशंसा: चूंकि आपकी स्क्रिप्ट विभिन्न सर्वरों पर चलती है, इसलिए आपको हमेशा अपने स्वयं के openssl.cnf का उपयोग करना चाहिए।

बस एक साधारण टेक्स्ट फ़ाइल बनाएं और इसमें निम्न 4 पंक्तियां डालें। फिर आप जिस ओपनएसएसएल फ़ंक्शन का उपयोग कर रहे हैं उसे उस पथ को पास करें (ऊपर अपना दूसरा उदाहरण देखें)।

distinguished_name = req_distinguished_name 
[req_distinguished_name] 
[v3_req] 
[v3_ca] 

ऐसा लगता है कि ये 4 लाइनें न्यूनतम openssl.cnf में होनी चाहिए।

6

इसका उत्तर एसएसएल की भूमिका से संबंधित है। यह क्लाइंट और सर्वर के बीच एचटीएमएल/एचटीएमएल बातचीत के आसपास एक "खोल" है। अपाचे इसे चलाता है। यह वास्तव में "भूमि" में नहीं है। जब आप कुंजी जोड़ी को फिर से बनाने का चुनाव करते हैं, तो आप वास्तव में कर रहे हैं कि क्लाइंट/सर्वर को एसएसएल कुंजी जोड़े की एक नई जोड़ी के साथ अपनी वार्तालाप दोबारा शुरू करने के लिए मजबूर करने के लिए शिन में अपाचे को लात मार रहा है।

कुछ होश में यह एक session_id

मेरा प्रश्न रीमेकिंग की तरह एक सा रूप में देखा जा सकता है: वहाँ एक कारण है कि मैं स्पष्ट रूप से openssl.conf के लिए पथ निर्दिष्ट करने के लिए है, क्योंकि यह ठीक से काम करने लगता है है, इसके बिना:

स्वयं हस्ताक्षरित प्रमाण पत्र का निर्माण यहां नहीं किया जा रहा है, इसकी पुन: निर्माण है। इसलिए जब आप पथ नहीं देते हैं, तो यह ठीक है क्योंकि यह पहले से ही अपाचे से एक रास्ता था।

+2

क्या होगा यदि मैं एक कॉन्फ़िग फ़ाइल जो सभी config-मूल्यों नहीं रखता है निर्दिष्ट करें: यह डिफ़ॉल्ट config फ़ाइल से डिफ़ॉल्ट मान लेते हैं? – HomeCoder

+0

काफी ईमानदारी से, मुझे यकीन है कि यह कैसे पीएचपी OpenSSL असर होगा, सिद्धांत रूप में यह ठीक से उन गुणों के वारिस करना असंभव होगा नहीं हूँ। लेकिन PHP पर्याप्त चालाक हो सकता है। हालांकि मैं इसे से संकोच और अपने खुद के लिए रखेंगे parameters- आप आसानी से ब्राउज़र में एक अमान्य प्रमाणपत्र चेतावनी लग सकती है – conners

2

जो OpenSSL बिना PHP में स्व-हस्ताक्षरित प्रमाणपत्र (phpseclib, a pure PHP X.509 implementation की आवश्यकता है) ...

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

// create private key/x.509 cert for stunnel/website 
$privKey = new Crypt_RSA(); 
extract($privKey->createKey()); 
$privKey->loadKey($privatekey); 

$pubKey = new Crypt_RSA(); 
$pubKey->loadKey($publickey); 
$pubKey->setPublicKey(); 

$subject = new File_X509(); 
$subject->setPublicKey($pubKey); 
$subject->setDNProp('id-at-organizationName', 'phpseclib demo cert'); 
$subject->setDomain('www.whatever.com'); 

$issuer = new File_X509(); 
$issuer->setPrivateKey($privKey); 
$issuer->setDN($subject->getDN()); 

$x509 = new File_X509(); 
$x509->setStartDate('-1 month'); 
$x509->setEndDate('+1 year'); 
$x509->setSerialNumber(chr(30)); 

$result = $x509->sign($issuer, $subject); 
echo "the stunnel.pem contents are as follows:\r\n\r\n"; 
echo $privKey->getPrivateKey(); 
echo "\r\n"; 
echo $x509->saveX509($result); 
echo "\r\n"; 
संबंधित मुद्दे