2012-04-05 29 views
5

में openssl_pkcs12_export साथ निर्यात श्रृंखला यह एक प्रमाणपत्र और निजी कुंजी, प्रमाणपत्र श्रृंखला (रूट प्रमाणपत्र और/या मध्यवर्ती) के साथ साथ एक .pfx को निर्यात करने के लिए PHP के openssl_pkcs12_export() का उपयोग कर सकता है?पीएचपी

अद्यतन: मैं php openssl विस्तार के लिए स्रोत पर एक नज़र लिया है, और पाया कि openssl_pkcs12_export() प्रलेखन, friendly_name और extracerts में लोगों की तुलना में अन्य 2 आर्ग का समर्थन करता है। यह ext/openssl/openssl.c से है, बाहर लाइनों 1914-1920 (PHP-5.4.0) की जाँच करें:

1878 /* {{{ proto bool openssl_pkcs12_export(mixed x509, string &out, mixed priv_key, string pass[, array args]) 
1879 Creates and exports a PKCS12 to a var */ 
1880 PHP_FUNCTION(openssl_pkcs12_export) 
1881 { 
1882   X509 * cert = NULL;                                     
1883   BIO * bio_out; 
1884   PKCS12 * p12 = NULL; 
1885   zval * zcert = NULL, *zout = NULL, *zpkey, *args = NULL; 
1886   EVP_PKEY *priv_key = NULL; 
1887   long certresource, keyresource; 
1888   char * pass; 
1889   int pass_len; 
1890   char * friendly_name = NULL; 
1891   zval ** item; 
1892   STACK_OF(X509) *ca = NULL; 
1893 
1894   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zzzs|a", &zcert, &zout, &zpkey, &pass, &pass_len, &args) == FAILURE) 
1895     return; 
1896 
1897   RETVAL_FALSE; 
1898 
1899   cert = php_openssl_x509_from_zval(&zcert, 0, &certresource TSRMLS_CC); 
1900   if (cert == NULL) { 
1901     php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot get cert from parameter 1"); 
1902     return; 
1903   } 
1904   priv_key = php_openssl_evp_from_zval(&zpkey, 0, "", 1, &keyresource TSRMLS_CC); 
1905   if (priv_key == NULL) { 
1906     php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot get private key from parameter 3"); 
1907     goto cleanup; 
1908   } 
1909   if (cert && !X509_check_private_key(cert, priv_key)) { 
1910     php_error_docref(NULL TSRMLS_CC, E_WARNING, "private key does not correspond to cert"); 
1911     goto cleanup; 
1912   } 
1913 
1914   /* parse extra config from args array, promote this to an extra function */ 
1915   if (args && zend_hash_find(Z_ARRVAL_P(args), "friendly_name", sizeof("friendly_name"), (void**)&item) == SUCCESS) 
1916     friendly_name = Z_STRVAL_PP(item); 
1917 
1918   if (args && zend_hash_find(Z_ARRVAL_P(args), "extracerts", sizeof("extracerts"), (void**)&item) == SUCCESS) 
1919     ca = php_array_to_X509_sk(item TSRMLS_CC); 
1920   /* end parse extra config */ 
1921 
1922   p12 = PKCS12_create(pass, friendly_name, priv_key, cert, ca, 0, 0, 0, 0, 0); 
1923 
1924   bio_out = BIO_new(BIO_s_mem()); 
1925   if (i2d_PKCS12_bio(bio_out, p12)) { 
1926     BUF_MEM *bio_buf; 
1927 
1928     zval_dtor(zout); 
1929     BIO_get_mem_ptr(bio_out, &bio_buf); 
1930     ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length, 1); 
1931 
1932     RETVAL_TRUE; 
1933   } 
1934 
1935   BIO_free(bio_out); 
1936   PKCS12_free(p12); 
1937   php_sk_X509_free(ca); 
1938 
1939 cleanup: 
1940 
1941   if (keyresource == -1 && priv_key) { 
1942     EVP_PKEY_free(priv_key); 
1943   } 
1944   if (certresource == -1 && cert) { 
1945     X509_free(cert); 
1946   } 
1947 } 
1948 /* }}} */ 

हालांकि, मैं काफी यकीन है कि कैसे तर्क के रूप में अतिरिक्त प्रमाण पत्र ... किसी भी सुराग पारित करने के लिए नहीं कर रहा हूँ?

मुझे पता है अगर यह लाइन नंबर

उत्तर

5

यह a bug that has been brought up है लगभग दो महीने पहले के बिना आसान पठनीय है करते हैं।

$args = array(
       'extracerts' => $CAcert, 
       'friendly_name' => 'My signed cert by CA certificate' 
      ); 
openssl_pkcs12_export($signed_csr, $cerificate_out, $private_key_resource, $passphrase, $args); 

$CAcert क्या है:

शुक्र है वह डॉक्स के लिए एक नमूना पैच प्रदान करता है? आंतरिक रूप से यह एक फ़ंक्शन को पास कर दिया जाता है जो takes an array and turns it into a x509 और वह फ़ंक्शन यह भी पता लगाता है कि यह कैर्ट या एक प्रमाण का सरणी है या नहीं। यदि आप सरणी पास कर रहे हैं, तो प्रत्येक तत्व x509 संसाधन होना चाहिए, या यदि आप सरणी पास नहीं कर रहे हैं तो $ CAcert एक संसाधन होना चाहिए। openssl_x509_read संभव है कि आप यहां क्या उपयोग करना चाहते हैं क्योंकि यह $CAcert में अपेक्षित x509 संसाधन प्रकार देता है।

कुछ लोगों का कहना है कि अद्यतन डॉक्स रखने पीएचपी परियोजना का सबसे कठिन भागों में से एक है। यदि आप सी के साथ बहुत अच्छे नहीं हैं और PHP को बेहतर बनाने में मदद करना चाहते हैं तो यह शुरू करने के लिए एक अच्छी जगह है।

+0

अच्छा, धन्यवाद। इस संदर्भ में $ कैर्कर्ट किस प्रकार का चर होगा? Openssl_x509_read() या क्या के साथ पढ़ने वाले पीईएम से बस एक स्ट्रिंग या आउटपुट? एक उदाहरण प्रदान करें आप –

+0

@ MathiasR.Jessen आंतरिक '$ CAcert' http://lxr.php.net/opengrok/xref/PHP_5_4/ext/openssl/openssl.c#1741 के लिए पारित हो जाता है कर सकते हैं अगर और इस का पता लगाता है अगर यह चेतावनी या एकल प्रमाण की एक सरणी, प्रत्येक तत्व 'x509 संसाधन' होना चाहिए। मैंने पहले इसे लागू नहीं किया है, लेकिन मुझे संदेह है कि 'openssl_x509_read' की आपकी धारणा सही है क्योंकि यह उस संसाधन प्रकार को लौटाती है। – Incognito

+1

कूल, मैं इस दृष्टिकोण का उपयोग करके कार्यान्वित करने की कोशिश करूंगा और वापस आऊंगा, धन्यवाद –