2 Stimmen

OpenADR 2.0a Pull VEN - TLS-Sicherheitshandshake-Probleme mit cURL in PHP?

Ich erstelle ein "Pull VEN in the cloud" für die OpenADR 2.0a-Zertifizierung. Alle ersten Tests habe ich abgeschlossen, aber ich habe mit dem Test S1_1400_TH_VTN viele Probleme. Wenn ich die Sicherheit des Test-Harness-VTN auf HTTP_SHA256_Security setze, erhalte ich einen "Handshake-Fehler". Wenn ich jedoch die Sicherheit auf HTTP_SHA1_Security ändere, erhalte ich einen "Zertifikat unbekannt"-Fehler. Was mache ich falsch?

HINWEIS: Diese Frage wird gestellt, in der Erwartung, dass andere möglicherweise auf dasselbe Problem stoßen, da derzeit im Web nur sehr wenige Daten zu OpenADR 2.0 verfügbar sind.

Nur zur Information: Mein lokaler Server für die Tests verwendete PHP 5.3.28, cURL 7.31.0 und OpenSSL 0.9.8y.

2voto

Kevin Nelson Punkte 7384

Zunächst einmal, wenn Sie Ihr Zertifikat von NetworkFX erhalten haben, haben Sie wahrscheinlich standardmäßig das SHA256-Zertifikat erhalten, das TLS 1.2 ist. In diesem Fall müssen Sie sicherstellen, dass die von PHP verwendete OpenSSL-Instanz mindestens Version 1.0.1 oder höher ist. Vorherige Versionen unterstützen kein TLS 1.2 und können die Zertifikate nicht verarbeiten. Um die von PHP verwendete OpenSSL-Version zu überprüfen, können Sie ausführen und dann nach dem String "SSL-Version" suchen. Wenn Sie unter 1.0.1 liegen, müssen Sie definitiv das SHA1-Zertifikat von NetworkFX erhalten oder Ihre OpenSSL-Instanz aktualisieren. Die gute Nachricht ist, dass derzeit nur TLS 1.0 für die Zertifizierung 2.0a erforderlich ist, sodass ein Upgrade nicht erforderlich ist.

Zweitens, wenn Sie Ihre Zertifikate von NetworkFX erhalten haben, sind sie wahrscheinlich im DER-Format. PHP-cURL verwendet standardmäßig PEM, aber Sie können das Format technisch gesehen in DER ändern

curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'DER');
curl_setopt($curl, CURLOPT_SSLKEYTYPE, 'DER');

Die erste Option für CURLOPT_SSLCERTTYPE (den öffentlichen Schlüssel) funktionierte gut mit DER. Aber beim privaten Schlüssel erhielt ich die Meldung "private Schlüsseldatei konnte nicht gesetzt werden", als ich das DER-Format verwendete. Daher musste ich den privaten Schlüssel mit openssl ins PEM-Format konvertieren (das Folgende wandelt ein RSA-Zertifikat von DER in PEM um. Wenn Sie ein ECC-Zertifikat haben, sollten Sie den Befehl relativ einfach online finden können):

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

Nachdem das erledigt ist, sollten Sie in der Lage sein, folgendermaßen an den VTN zu posten, indem Sie cURL in PHP verwenden:

// z. B. '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);

//SICHERHEIT
if( strpos($vtnBaseURL,'https') !== false ) {
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //sollte in der Produktion true sein
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);     //sollte in der Produktion 2 sein
    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, 'pfad/zum/zert.pem');
    curl_setopt($curl, CURLOPT_SSLKEY, 'pfad/zum/privatschlüssel.pem');
}

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X