Comments 8
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
Вот за это я и люблю все руководства.
Ребят, не нужно плевать на безопасность, а?
Не претендую на истину в последней инстанции, но как-то так, с проверками хоста и прочими плюшками, возможно, будет лучше:
И совсем для ленивых (кто не хочет выдирать сертификаты с сайтов Яндекса):
/**
* Yandex API wrapper.
* - First of all you need to register new console application @link https://oauth.yandex.ru/client/new
* with redirect_url https://oauth.yandex.ru/verification_code
* - Next - take <access_code>:
* https://oauth.yandex.ru/authorize?response_type=code&client_id=<client_id>
* - Use $this->getTokenByCode() to obtain access_token
*/
class YandexApiBase
{
private $client_id;
private $client_secret;
public $access_token;
public function __construct($token, $id=null, $secret=null)
{
$this->client_id = $id;
$this->client_secret = $secret;
$this->access_token = $token;
}
/**
* @param string $code
* @throws YandexApiException on fail
*/
public function getTokenByCode($code)
{
$data = self::rawRequest('POST', 'https://oauth.yandex.ru/token', array(
'grant_type'=>'authorization_code',
'code'=>$code,
'client_id'=>$this->client_id,
'client_secret'=>$this->client_secret,
));
if (!$data)
throw new YandexApiException("Can't take access_token by application code");
$data = json_decode($data);
if (isset($data['error']))
throw new YandexApiException("Shit happens: {$data['error']}");
if (!isset($data['access_token']))
throw new YandexApiException("No errors, but token not send: ".CVarDumper::dumpAsString($data));
return $data;
}
protected function request($method='GET', $url, $options = array())
{
$url .= (strpos($url, '?')===false ? '?' : '&') . http_build_query(array('oauth_token'=>$this->access_token));
return json_decode(self::rawRequest($method, $url, $options), true);
}
/**
* Send request with token
* @param $url
* @param array $options
* @param string $method
*/
protected static function rawRequest($method='GET', $url, $options = array())
{
//Default options for all requests
$curlOpt = array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_MAXREDIRS => 3,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 20,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_CAPATH => dirname(__FILE__).'/cert',
CURLOPT_CAINFO => dirname(__FILE__).'/cert/solid-cert.crt',
);
switch (strtoupper($method)){
case 'DELETE':
$curlOpt[CURLOPT_CUSTOMREQUEST] = "DELETE";
case 'GET':
if (!empty($options))
$url .= (strpos($url, '?')===false ? '?' : '&') . http_build_query($options);
break;
case 'PUT':
$body = http_build_query($options);
$fp = fopen('php://temp/maxmemory:256000', 'w');
if (!$fp)
throw new YandexApiException('Could not open temp memory data');
fwrite($fp, $body);
fseek($fp, 0);
$curlOpt[CURLOPT_PUT] = 1;
$curlOpt[CURLOPT_BINARYTRANSFER] = 1;
$curlOpt[CURLOPT_INFILE] = $fp; // file pointer
$curlOpt[CURLOPT_INFILESIZE] = strlen($body);
break;
case 'POST':
$curlOpt[CURLOPT_HTTPHEADER] = array('Content-Type: application/x-www-form-urlencoded; charset=UTF-8;');
$curlOpt[CURLOPT_POST] = true;
$curlOpt[CURLOPT_POSTFIELDS] = http_build_query($options);
break;
default:
throw new YandexApiException("Unsupported request method '$method'");
}
$curl = curl_init($url);
curl_setopt_array($curl, $curlOpt);
$return = curl_exec($curl);
$err_no = curl_errno($curl);
if ($err_no === 0) {
curl_close($curl);
return $return;
} else {
$err_msg = curl_error($curl);
curl_close($curl);
throw new YandexApiException($err_msg, $err_no);
}
}
}
class YandexApiException extends Exception {}
И совсем для ленивых (кто не хочет выдирать сертификаты с сайтов Яндекса):
-----BEGIN CERTIFICATE-----
MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEPjCCA6egAwIBAgIEBycT9TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
b2JhbCBSb290MB4XDTA3MDExNzE1MTYyMFoXDTE0MDExNzE1MTU0NlowWzESMBAG
CgmSJomT8ixkARkWAnJ1MRYwFAYKCZImiZPyLGQBGRYGeWFuZGV4MRIwEAYKCZIm
iZPyLGQBGRYCbGQxGTAXBgNVBAMTEFlhbmRleEV4dGVybmFsQ0EwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOf3icODyZl7NcIpHKuJQ5ol5X/roVHJiG
0s2wu3vXYmyEYTFQLGM1qr/yjOAKnNtwpQMr98+quO7SWs8TvtxT+mf75lptRuD2
JawD2Vrkqq/gv92L0lyg6vfmWgovWhGftKjy6S8LPTGhsypfPEvCjBzG3IcyIlUP
S/4VIvk5hXLNFlvR9iPjMZ6Pfs1MfU+GwudBWkG4HefSTcrsJV4j/l/eORIkCc36
yWWTJrCUTTigx50qeRjiH6Aq8UxEhaNNU6GROgEQyarDT0n78Zu4v8/S6bRBhL+q
yDMTUDuXzLseDNr5i1w8g6NZ9XbvmMF4fl5SGAKKNtLFxfeDqsoXAgMBAAGjggFv
MIIBazASBgNVHRMBAf8ECDAGAQH/AgEBMFMGA1UdIARMMEowSAYJKwYBBAGxPgEA
MDswOQYIKwYBBQUHAgEWLWh0dHA6Ly93d3cucHVibGljLXRydXN0LmNvbS9DUFMv
T21uaVJvb3QuaHRtbDAOBgNVHQ8BAf8EBAMCAYYwgYkGA1UdIwSBgTB/oXmkdzB1
MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBD
eWJlclRydXN0IEdsb2JhbCBSb290ggIBpTBFBgNVHR8EPjA8MDqgOKA2hjRodHRw
Oi8vd3d3LnB1YmxpYy10cnVzdC5jb20vY2dpLWJpbi9DUkwvMjAxOC9jZHAuY3Js
MB0GA1UdDgQWBBTbQScwTxr1Wz6EVsjshZizUSwtJzANBgkqhkiG9w0BAQUFAAOB
gQAZuNLEObDlHdW3QJbokq5ANrTp9/WLLdRONjFK0tPkHq5FjeyX4GgPVvAUTuQa
ydC35nz7H+1SGZBp9F+pT9YnaNH6lKl7o8mXPOCznQYeIvGCgI4L1uv37QtBvbri
B/I8h+FY/43FMjAnk9ciR1xgbARK4bUKZaPd9MdU+/TY7w==
-----END CERTIFICATE-----
Чтобы не морочиться с сертификатами, можно использовать Automatically converted CA Certs from mozilla.org.
А чем Вы сертификаты выдирали?
FireFox + блокнот =)
Заходим на страницу oauth.yandex.ru/, открываем список сертификатов, сохраняем в файлики, файлы склеиваем.
Либо поиграться с вытаскиванием через код:
Но так достается только OAuth сертификат, дальше копать в сторону автоматического выдергивания всех не стал. быстрее FireFox + блокнот =)
Заходим на страницу oauth.yandex.ru/, открываем список сертификатов, сохраняем в файлики, файлы склеиваем.
Либо поиграться с вытаскиванием через код:
public function actionIndex($domain){
$context = stream_context_create (array("ssl" => array("capture_peer_cert" => true)));
$run = stream_socket_client("ssl://$domain:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
$cont = stream_context_get_params($run);
if (isset($cont["options"]["ssl"]["peer_certificate"])) {
openssl_x509_export($cont["options"]["ssl"]["peer_certificate"], $output);
return $output;
} else {
return false;
}
}
Но так достается только OAuth сертификат, дальше копать в сторону автоматического выдергивания всех не стал. быстрее FireFox + блокнот =)
У меня это происходило из бэкофиса сайта, по этой причине не видел смысла в значении «1» или «2» для CURLOPT_SSL_VERIFYHOST и true для CURLOPT_SSL_VERIFYPEER.
Но если делать это, как сервис «для всех», то согласен, что лучше подстраховаться.
Но если делать это, как сервис «для всех», то согласен, что лучше подстраховаться.
Sign up to leave a comment.
Работа с API Яндекс.Вебмастер