OpenADR 2.0a用PHP中的cURL拉出VEN - TLS安全握手问题?

时间:2014-08-12 16:59:46

标签: php curl

我正在云中创建一个"拉VEN"对于OpenADR 2.0a认证,我已完成所有首批测试,但我在测试S1_1400_TH_VTN时遇到了很多问题。当我将测试工具VTN的安全性设置为HTTP_SHA256_Security时,我得到一个"握手失败"错误,但当我将安全性更改为HTTP_SHA1_Security时,我得到一个未知的证书"错误。我做错了什么?

注意:这个问题的编写是因为其他人可能遇到同样的问题,因为目前网络上关于OpenADR 2.0的数据非常少。

仅供参考:我测试的本地服务器使用的是PHP 5.3.28,cURL 7.31.0和OpenSSL 0.9.8y。

1 个答案:

答案 0 :(得分:2)

首先,如果您从NetworkFX获得了证书,那么您可能默认收到SHA256证书,即TLS 1.2。如果是这种情况,则需要确保PHP使用的openssl实例至少为1.0.1或更高版本。之前的版本不支持TLS 1.2,并且无法解析证书。要检查PHP使用的openssl版本,可以运行<?php phpinfo() ?>,然后查找字符串“SSL Version”。如果你低于1.0.1,那么你肯定需要从NetworkFX获得SHA1证书或升级你的openssl实例。好消息是 - 目前 - 2.0a认证只需要TLS 1.0,因此您无需升级。

其次,如果您从NetworkFX获得了证书,那么它们可能会采用DER格式。 PHP-cURL默认使用PEM,但您可以在技术上使用

将格式更改为DER
curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'DER');
curl_setopt($curl, CURLOPT_SSLKEYTYPE, 'DER');

CURLOPT_SSLCERTTYPE(公钥)的第一个选项,使用DER工作正常。但是,对于私钥,使用DER格式,我收到消息“无法设置私钥文件”。所以,我必须使用openssl将私钥转换为PEM格式(下面将把RSA证书从DER转换为PEM。如果你有ECC证书,你应该能够很容易地在线找到命令):

openssl rsa -inform der -in certificate.der -out certificate.pem

一旦完成,您应该能够使用PHP中的cURL发布到VTN:

// e.g. 'https://localhost:8080/OpenADR2/Simple/EiEvent'
$curl       = curl_init($vtnBaseURL.'/OpenADR2/Simple'.$path);
curl_setopt($curl, CURLOPT_POSTFIELDS, $xml); //-d
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Host: my.host.com',
    'Content-Type: application/xml; charset=utf-8',
    "Content-Length: ".strlen($xml)
) ); //-H
curl_setopt($curl, CURLOPT_VERBOSE, false); //-v
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

//SECURITY
if( strpos($vtnBaseURL,'https') !== false ) {
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //should be true in production
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);     //should be 2 in production
    curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:TLS_RSA_WITH_AES_128_CBC_SHA256:TLS_RSA_WITH_AES_128_CBC_SHA');
    curl_setopt($curl, CURLOPT_SSLCERT, 'path/to/cert.pem');
    curl_setopt($curl, CURLOPT_SSLKEY, 'path/to/privkey.pem');
}

$response   = curl_exec($curl);
$error      = curl_error($curl);
curl_close($curl);