2014-09-11 57 views
4

我使用的VWS - PHP Samples和它的作品從本地PC預期,但是當我上傳到服務器上它給我以下錯誤:如何解決錯誤:需要https://請求的OpenSSL支持?

POST 999e93717344885fd7c458301a5b00c9 application/json Thu, 11 Sep 2014 08:14:20 GMT /targetsError: Need OpenSSL support for https:// requests

域名爲HTTPS從GoDaddy的證書啓用,出了什麼問題?

define("SERVER_ACCESS_KEY", "12345678"); 
      define("SERVER_SECRET_KEY", "654321"); 
      define("TARGET_NAME", $campaignname); 
      define("IMAGE_LOCATION", $directory . '/dispatcher.' . $path_parts['extension']); 

      $this->load->library('Vuforia/PostNewTarget'); 

示例代碼是SignatureBuilder.php

<?php 

/** 
* Copyright (c) 2011-2013 Qualcomm Austria Research Center GmbH. All rights Reserved. Nothing in these materials is an offer to sell any of the components or devices referenced herein. Qualcomm is a trademark of QUALCOMM Incorporated, registered in the United States and other countries.Vuforia is a trademark of QUALCOMM Incorporated. Trademarks of QUALCOMM Incorporated are used with permission. 
* Vuforia SDK is a product of Qualcomm Austria Research Center GmbH. Vuforia Cloud Recognition Service is provided by Qualcomm Technologies, Inc.. 
* 
* This Vuforia (TM) sample code provided in source code form (the "Sample Code") is made available to view for reference purposes only. 
* If you would like to use the Sample Code in your web application, you must first download the Vuforia Software Development Kit and agree to the terms and conditions of the License Agreement for the Vuforia Software Development Kit, which may be found at https://developer.vuforia.com/legal/license. 
* Any use of the Sample Code is subject in all respects to all of the terms and conditions of the License Agreement for the Vuforia Software Development Kit and the Vuforia Cloud Recognition Service Agreement. 
* If you do not agree to all the terms and conditions of the License Agreement for the Vuforia Software Development Kit and the Vuforia Cloud Recognition Service Agreement, then you must not retain or in any manner use any of the Sample Code. 
* 
*/ 

class SignatureBuilder{ 

    private $contentType = ''; 
    private $hexDigest = 'd41d8cd95fa11b204e7600998ecf8427e'; // Hex digest of an empty string 

    public function tmsSignature($request , $secret_key){ 

     $method = $request->getMethod(); 
     // The HTTP Header fields are used to authenticate the request 
     $requestHeaders = $request->getHeaders(); 
     // note that header names are converted to lower case 
     $dateValue = $requestHeaders['date']; 

     $requestPath = $request->getURL()->getPath(); 

     // Not all requests will define a content-type 
     if(isset($requestHeaders['content-type'])) 
      $this->contentType = $requestHeaders['content-type']; 

     if ($method == 'GET' || $method == 'DELETE') { 
      // Do nothing because the strings are already set correctly 
     } else if ($method == 'POST' || $method == 'PUT') { 
      // If this is a POST or PUT the request should have a request body 
      $this->hexDigest = md5($request->getBody() , false); 

     } else { 
      print("ERROR: Invalid content type passed to Sig Builder"); 
     } 



     $toDigest = $method . "\n" . $this->hexDigest . "\n" . $this->contentType . "\n" . $dateValue . "\n" . $requestPath ; 

     echo $toDigest; 

     $shaHashed = ""; 

     try { 
      // the SHA1 hash needs to be transformed from hexidecimal to Base64 
      $shaHashed = $this->hexToBase64(hash_hmac("sha1", $toDigest , $secret_key)); 

     } catch (Exception $e) { 
      $e->getMessage(); 
     } 

     return $shaHashed; 
    } 


    private function hexToBase64($hex){ 

     $return = ""; 

     foreach(str_split($hex, 2) as $pair){ 

      $return .= chr(hexdec($pair)); 

     } 

     return base64_encode($return); 
    } 


} 

示例代碼是PostNewTarget.php

<?php 

require_once 'HTTP/Request2.php'; 
require_once 'SignatureBuilder.php'; 

// See the Vuforia Web Services Developer API Specification - https://developer.vuforia.com/resources/dev-guide/retrieving-target-cloud-database 
// The PostNewTarget sample demonstrates how to update the attributes of a target using a JSON request body. This example updates the target's metadata. 

class PostNewTarget{ 

    //Server Keys 
    private $access_key  = SERVER_ACCESS_KEY; 
    private $secret_key  = SERVER_SECRET_KEY; 

    //private $targetId   = "eda03583982a41dcbe9ca7f30731b9b1"; 
    private $url   = "https://vws.vuforia.com"; 
    private $requestPath = "/targets"; 
    private $request;  // the HTTP_Request2 object 
    private $jsonRequestObject; 

    private $targetName  = TARGET_NAME; 
    private $imageLocation = IMAGE_LOCATION; 

    function PostNewTarget(){ 

     $this->jsonRequestObject = json_encode(array('width'=>320.0 , 'name'=>$this->targetName , 'image'=>$this->getImageAsBase64() , 'application_metadata'=>base64_encode("Vuforia test metadata") , 'active_flag'=>1)); 

     $this->execPostNewTarget(); 

    } 

    function getImageAsBase64(){ 

     $file = file_get_contents($this->imageLocation); 

     if($file){ 

      $file = base64_encode($file); 
     } 

     return $file; 

    } 

    public function execPostNewTarget(){ 

     $this->request = new HTTP_Request2(); 
     $this->request->setMethod(HTTP_Request2::METHOD_POST); 
     $this->request->setBody($this->jsonRequestObject); 

     $this->request->setConfig(array(
       'ssl_verify_peer' => false 
     )); 

     $this->request->setURL($this->url . $this->requestPath); 

     // Define the Date and Authentication headers 
     $this->setHeaders(); 


     try { 

      $response = $this->request->send(); 

      if (200 == $response->getStatus() || 201 == $response->getStatus()) { 
       echo $response->getBody(); 
      } else { 
       echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' . 
         $response->getReasonPhrase(). ' ' . $response->getBody(); 
      } 
     } catch (HTTP_Request2_Exception $e) { 
      echo 'Error: ' . $e->getMessage(); 
     } 


    } 

    private function setHeaders(){ 
     $sb = new SignatureBuilder(); 
     $date = new DateTime("now", new DateTimeZone("GMT")); 

     // Define the Date field using the proper GMT format 
     $this->request->setHeader('Date', $date->format("D, d M Y H:i:s") . " GMT"); 

     $this->request->setHeader("Content-Type", "application/json"); 
     // Generate the Auth field value by concatenating the public server access key w/ the private query signature for this request 
     $this->request->setHeader("Authorization" , "VWS " . $this->access_key . ":" . $sb->tmsSignature($this->request , $this->secret_key)); 

    } 
} 

Loaded Modules

Configure Command

,當我嘗試安裝OpenSSL的

yum install php-openssl openssl 
Loaded plugins: fastestmirror, security 
Loading mirror speeds from cached hostfile 
* base: centos.mirrors.atwab.net 
* extras: centos.mirrors.atwab.net 
* updates: centos.mirrors.atwab.net 
base                                                    | 3.7 kB  00:00  
extras                                                   | 3.3 kB  00:00  
updates                                                   | 3.4 kB  00:00  
updates/primary_db                                                | 5.3 MB  00:00  
Setting up Install Process 
No package php-openssl available. 
Package openssl-1.0.1e-16.el6_5.15.x86_64 already installed and latest version 
Nothing to do 

我想這個代碼,看看是OpenSSL是可用的:

if (!extension_loaded('openssl')) { 
    echo "no openssl extension loaded."; 
} 

結果是:

no openssl extension loaded.

這是on CentOS - PHP Version 5.2.17

+0

'HTTP_Request2()'函數是否使用cURL? – jsa 2014-09-13 12:21:52

+0

有關** HTTP_Request2()梨**的更多信息http://pear.php.net/package/HTTP_Request2/redirected – Waqleh 2014-09-13 14:02:13

+0

這將是一個否,那麼。 但是,我建議你使用cURL,因爲它更容易編碼。 :) – jsa 2014-09-13 14:48:06

回答

1

Error: Need OpenSSL support for https:// requests

此錯誤時HTTP_Request2沒有找到您stream transports listssl發生。 OpenSSL PHP extension必須是installed才能使用https stream protocol wrapper

這與Apache的mod_ssl無關或您的網站是否通過https提供服務。這是關於PHP連接到網址"https://vws.vuforia.com"來執行請求。

+0

你能告訴我如何安裝** OpenSSL PHP擴展**嗎? – Waqleh 2014-09-14 09:50:08

+0

很高興知道它被編譯然後:) – 2014-09-23 11:33:18

2

如果您使用RHEL Linux的例如CentOS的yum install php-openssl openssl

如果你不使用的CentOS或RHEL,請您用這樣我就可以得到正確的命令你,如果不工作只是一個yum update

什麼評論

,你可以嘗試使用Ubuntu上同樣易於得到,而不是百勝如apt-get install openssl

檢查你的php.ini文件 extension=php_openssl.so如果它不存在添加它...

+0

是的,它是** CentOS **我試過yum命令,你可以看到問題的結果。 – Waqleh 2014-09-15 12:53:27

+0

已更新,向您展示如何檢查安裝到php中的openssl。你有沒有安裝yum或編譯你的自我? – 2014-09-15 13:00:26

+0

我將** extension =「php_openssl.so」**添加到php.ini文件的末尾,因爲它不在那裏重新啓動apache,並且什麼也沒做。關於** yum **或**編譯**我不知道,但我沒有在這臺服務器上安裝任何東西。 – Waqleh 2014-09-15 13:20:31

相關問題