Problem: OpenSSL funktioniert nicht in meiner Windows-Umgebung. OpenSSL meldet wiederholt Fehler 0x02001003, 0x2006D080 und 0x0E064002.
Umgebung:
Windows NT x 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586
Apache/2.4.4 (Win32)
PHP/5.4.13 x86
PHP Directory: E:\wamp\php\
Virtual Host Directory: E:\Projects\1\public_html
Was ich versucht habe:
extension=php_openssl.dll
E:\wamp\php\extras\openssl.cnf
E:\wamp\php
configargs
<Directory E:\wamp\php\extras>
in der Apache-Konfigurationopenssl.cnf
wurde in virtualhost public_html kopiert, darauf hingewiesen und es werden immer noch dieselben Fehler angezeigtCode:
$privateKey = openssl_pkey_new();
while($message = openssl_error_string()){
echo $message.'<br />'.PHP_EOL;
}
Ergebnisse:
error:02001003:system library:fopen:No such process
error:2006D080:BIO routines:BIO_new_file:no such file
error:0E064002:configuration file routines:CONF_load:system lib
error:02001003:system library:fopen:No such process
error:2006D080:BIO routines:BIO_new_file:no such file
error:0E064002:configuration file routines:CONF_load:system lib
OpenSSL manuell:
E:\wamp\Apache\bin>openssl.exe pkey
WARNING: can't open config file: c:/openssl-1.0.1e/ssl/openssl.cnf
E:\wamp\Apache\bin>set OPENSSL_CONF="E:\wamp\php\extras\openssl.cnf"
E:\wamp\Apache\bin>openssl.exe pkey
3484:error:0200107B:system library:fopen:Unknown error:.\crypto\bio\bss_file.c:169:fopen('"E:\wamp\php\extras\openssl.cnf"','rb')
3484:error:2006D002:BIO routines:BIO_new_file:system lib:.\crypto\bio\bss_file.c:174:
3484:error:0E078002:configuration file routines:DEF_LOAD:system lib:.\crypto\conf\conf_def.c:199:
EDIT:
openssl_error_string
sehen.ABSCHLIESSENDE GEDANKEN:
Ich habe eine Linux-Box eingerichtet und erhalte die gleichen Fehler. Nachdem ich ein wenig herumgespielt habe, sehe ich, dass, obwohl es Fehler an openssl_pkey_new wirft, es irgendwann meine Test-p12-Datei erstellt. Um es kurz zu machen, die Fehler sind irreführend und es muss mehr mit behandelt werden, wie Sie die openssl-Funktionen verwenden, nicht so sehr die serverseitige Konfiguration.
Schlusscode:
// Create the keypair
$res=openssl_pkey_new();
// Get private key
openssl_pkey_export($res, $privkey);
// Get public key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey["key"];
// Actual file
$Private_Key = null;
$Unsigned_Cert = openssl_csr_new($Info,$Private_Key,$Configs);
$Signed_Cert = openssl_csr_sign($Unsigned_Cert,null,$Private_Key,365,$Configs);
openssl_pkcs12_export_to_file($Signed_Cert,"test.p12",$Private_Key,"123456");
Schließen weg.
Ein Jahr später...
Ich tat es also ein Jahr später wieder, und unabhängig von den PATH-Variablen, die ich auf dem Computer oder während der Skriptausführung eingestellt habe, gab es immer Fehler, wenn die Datei nicht gefunden wurde. Ich konnte es auflösen, indem ich den config
-Parameter im config_args
-Array in openssl_pkey_new
übergab. Hier ist eine Funktion, die die Fähigkeit zur erfolgreichen Verwendung von OpenSSL testet:
/**
* Tests the ability to 1) create pub/priv key pair 2) extract pub/priv keys 3) encrypt plaintext using keys 4) decrypt using keys
*
* @return boolean|string False if fails, string if success
*/
function testOpenSSL($opensslConfigPath = NULL)
{
if ($opensslConfigPath == NULL)
{
$opensslConfigPath = "E:/Services/Apache/httpd-2.4.9-win32-VC11/conf/openssl.cnf";
}
$config = array(
"config" => $opensslConfigPath,
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$res = openssl_pkey_new($config); // <-- CONFIG ARRAY
if (empty($res)) {return false;}
// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey, NULL, $config); // <-- CONFIG ARRAY
// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
if ($pubKey === FALSE){return false;}
$pubKey = $pubKey["key"];
$data = 'plaintext data goes here';
// Encrypt the data to $encrypted using the public key
$res = openssl_public_encrypt($data, $encrypted, $pubKey);
if ($res === FALSE){return false;}
// Decrypt the data using the private key and store the results in $decrypted
$res = openssl_private_decrypt($encrypted, $decrypted, $privKey);
if ($res === FALSE){return false;}
return $decrypted;
}
// Example usage:
$res = testOpenSSL();
if ($res === FALSE)
{
echo "<span style='background-color: red;'>Fail</span>";
} else {
echo "<span style='background-color: green;'>Pass: ".$res."</span>";
}
Der folgende Code funktioniert wie erwartet. ABER wenn Sie openssl_error_string()
nach den openssl-Methoden ausführen, wird error:0E06D06C:configuration file routines:NCONF_get_string:no value
angezeigt. Dies ist ein Hinweis, zu dem ich keine Dokumentation finden konnte.
Beachten Sie außerdem, dass Sie nach http://www.php.net/manual/de/function.openssl-error-string.php möglicherweise fehlerhafte Fehler sehen, da Fehlermeldungen in die Warteschlange gestellt werden:
Seien Sie vorsichtig, wenn Sie diese Funktion zum Überprüfen von Fehlern verwenden, da sie scheinbar aus einem Puffer mit> Fehlern zu lesen ist, der Fehler aus einem anderen Skript oder Prozess enthalten kann, der die Funktionen von openssl> verwendet. (Ich war erstaunt, als ich Fehlermeldungen fand, bevor ich irgendwelche> openssl_ * -Funktionen aufrief).
<?php
/* Create the private and public key */
$res = openssl_pkey_new();
openssl_error_string(); // May throw error even though its working fine!
/* Extract the private key from $res to $privKey */
openssl_pkey_export($res, $privKey);
openssl_error_string(); // May throw error even though its working fine!
/* Extract the public key from $res to $pubKey */
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
$data = 'i.amniels.com is a great website!';
/* Encrypt the data using the public key
* The encrypted data is stored in $encrypted */
openssl_public_encrypt($data, $encrypted, $pubKey);
/* Decrypt the data using the private key and store the
* result in $decrypted. */
openssl_private_decrypt($encrypted, $decrypted, $privKey);
echo $decrypted;
?>
Ich hatte ein ähnliches Problem, für mich half es, die Umgebungsvariable 'OPENSSL_CONF' manuell am Anfang meines Skripts zu setzen.
Irgendwie war die Umgebungsvariable nicht richtig eingestellt oder kam nicht zu meinem PHP (Setup: AMPPS, Win7 64Bit).
Der unten angegebene Beispielspeicherort ist der Pfad, den Sie bei einer Standard-AMPPS-Installation verwenden müssen. Wenn Sie AMPPS verwenden, kopieren Sie ihn einfach:
putenv("OPENSSL_CONF=C:\Program Files (x86)\Ampps\php\extras\openssl.cnf");
ein paar Dinge hier:
%PATH%
sollte auch Fenster und System32 enthalten, sodass% PATH% wie c:\windows;c:\windows\system32;E:\wamp\php
aussehen sollte und in e:\wamp\php
die Datei openssl dll sein sollte
probiere auch die openssl-Version passend zur Header-Version 0.9.8y 5 Feb 2013
download hier für 32bit und hier für 64bit
dieser Code scheint für mich zu funktionieren:
// Create the keypair
$res=openssl_pkey_new();
// Get private key
openssl_pkey_export($res, $privkey);
// Get public key
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey["key"];
$Info = array(
"countryName" => "UK",
"stateOrProvinceName" => "Somerset",
"localityName" => "Glastonbury",
"organizationName" => "The Brain Room Limited",
"organizationalUnitName" => "PHP Documentation Team",
"commonName" => "Wez Furlong",
"emailAddress" => "[email protected]"
);
// Actual file
$Private_Key = null;
$Unsigned_Cert = openssl_csr_new($Info,$Private_Key);
$Signed_Cert = openssl_csr_sign($Unsigned_Cert,null,$Private_Key,365);
openssl_pkcs12_export_to_file($Signed_Cert,"test.p12",$Private_Key,"123456");
Haben Sie OpenSSL über diese Methode installiert? Installieren von OpenSSL unter Windows
Gehen Sie zu http://gnuwin32.sourceforge.net/packages/openssl.htm und laden Sie die "Setup" -Version von "Binaries" (openssl-0.9.7c-bin.exe) herunter.
Doppelklicken Sie auf "openssl-0.9.7c-bin.exe", um OpenSSL im Verzeichnis\local\gnuwin32 zu installieren.
Gehen Sie zurück zur selben Seite, laden Sie die "Setup" -Version von "Documentation" herunter und installieren Sie sie in demselben Verzeichnis.
Öffnen Sie das Befehlszeilenfenster und versuchen Sie den folgenden Befehl: Code:
\local\gnuwin32\bin\openssl -help
openssl:Error: '-help' is an invalid command.
Standard commands
asn1parse ca ciphers crl crl2pkcs7
dgst dh dhparam dsa dsaparam
enc engine errstr gendh gendsa
genrsa nseq ocsp passwd pkcs12
pkcs7 pkcs8 Rand req rsa
rsautl s_client s_server s_time sess_id
smime speed spkac verify version
x509
......
Wenn Sie die Liste der von OpenSSL gedruckten Befehle sehen, wissen Sie, dass Ihre Installation ordnungsgemäß ausgeführt wurde.
Wenn Sie Apache 2.4 + mod_fcgid verwenden, können Sie die OpenSSL-Conf-Datei angeben, indem Sie FcgidInitialEnv
in der httpd.conf-Datei hinzufügen:
# OPENSSL CONF
FcgidInitialEnv OPENSSL_CONF "D:/apps/php70/extras/ssl/openssl.cnf"
Ich verwende kein vorkonfiguriertes Paket wie WAMP, ich habe Apache von Apache Lounge und PHP von windows.php.net und von mir selbst konfiguriert.
Saubere Lösung:
OPENSSL_CONF
mit Ihrem verwendeten Pfad hinzu (z. B. "C:\WEB\PHP\extras\openssl.cnf" (ohne Anführungszeichen)).Sie müssen den Pfad zur Systemvariablen OPENSSL_CONF
hinzufügen. Es reicht nicht aus, es zur Systemvariablen Path
hinzuzufügen. Unter Windows 7 finden Sie den Einstellungsdialog unter: "Systemsteuerung> System und Sicherheit> System> Erweiterte Systemeinstellungen (Menü links)> Erweitert (Registerkarte)> Umgebungsvariablen ...". Fügen Sie dort die Variable OPENSSL_CONF
hinzu.
Es ist nicht erforderlich, die Datei openssl.cnf vor der Verwendung vorzubereiten. Dies funktioniert sofort. Aber Sie können, wenn Sie die Einstellungen fein abstimmen wollen.
In meinem Fall half mir das Kopieren der Dateien nach c:\windows\system32
libeay32.dll, ssleay32.dll
Man kann sie in OpenSSL_INSTALL_PATH\bin finden.