Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php APNS证书_Php_Sockets_Apple Push Notifications_Ssl Certificate_Apns Php - Fatal编程技术网

Php APNS证书

Php APNS证书,php,sockets,apple-push-notifications,ssl-certificate,apns-php,Php,Sockets,Apple Push Notifications,Ssl Certificate,Apns Php,我正在尝试为apple推送通知创建服务器端连接。 首先,我要求用户(可能是ios开发人员)提供苹果提供的.cer和.p12文件,使其成为.pem文件 下面是.pem证书的创建过程 $dir = $this->directory.'/certificates'; $password = 'a_user_password'; $certificate = $dir.'/certificate.cer'; $key_password = $dir.'/key.p12'; exec('ope

我正在尝试为apple推送通知创建服务器端连接。 首先,我要求用户(可能是ios开发人员)提供苹果提供的.cer和.p12文件,使其成为.pem文件

下面是.pem证书的创建过程

$dir =  $this->directory.'/certificates';
$password = 'a_user_password';
$certificate = $dir.'/certificate.cer';
$key_password =  $dir.'/key.p12';

exec('openssl x509 -inform der -in '.$certificate.' -out '.$dir.'/certificate.pem');
exec('openssl pkcs12 -nocerts -out '.$dir.'/key.pem -in '.$key_password.' -passout pass:'.$password.' -passin pass:'.$password);

$filename = $key_password;
$results = array();
$worked = openssl_pkcs12_read(file_get_contents($filename), $results, $obj->password);
if($worked) {
   $current = file_get_contents($dir.'/key.pem');
   $current .= $results['pkey'];
   file_put_contents($dir.'/key.pem', $current);
} else {
   echo openssl_error_string();
}
exec('cat '.$dir.'/certificate.pem '.$dir.'/key.pem > '.$dir.'/apns_certificate.pem');
到目前为止,一切顺利。我已经通过以下命令行测试了上述生成的apns_certificate.pem在apple上是否成功:

s_client -connect gateway.sandbox.push.apple.com:2195 -cert certificate.pem -key key.pem
但是,, 当我试图通过PHP与apns连接时,我不能。下面是我尝试过的最后一段php代码,我已经看到它对其他人起到了作用:

$this->certificate = ROOT.'/certificates/apns_certificate.pem';
$this->socket = 'ssl://gateway.push.apple.com:2195';
if (!file_exists($this->certificate)) {
        $this->error = 'Certificate file not found';
        return false;
    }

    $this->stream_context = stream_context_create();
    $this->stream_options = array(
        'ssl' => array(
            'local_cert' => $this->certificate,
            'passphrase' => 'a_user_password', //same with the one used in my previous code
        )
    );
    $success = stream_context_set_option($this->stream_context, $this->stream_options);
    if ($success == false) {
        $this->error = 'Secure connection failed';
        return false;
    }

    $this->socket_client = stream_socket_client($this->socket, $con_error, $con_error_string, $this->timeout, STREAM_CLIENT_CONNECT, $this->stream_context);

    if ($this->socket_client === false) {
        $this->error = $con_error_string;
        return false;
    } else {
        return true;
    }
上面的代码返回一个错误: 警告:流\u套接字\u客户端():SSL操作失败,代码为1。OpenSSL错误消息:错误:14094416:SSL例程:SSL3\u读取字节:sslv3警报证书未知 警告:流\u套接字\u客户端():无法连接到ssl://gateway.push.apple.com:2195


提前感谢您的帮助

以上代码是正确的。证书有错误。p12。我还将.p12转换文件的exec更改为:

exec('openssl pkcs12 -out '.$dir.'/key.pem -in '.$key_password.' -passout pass:'.$password.' -passin pass:'.$password.' -nodes');