it-swarm.com.de

OpenSSL funktioniert nicht unter Windows, Fehler 0x02001003 0x2006D080 0x0E064002

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:

  • Installationsanweisungenhttp://www.php.net/manual/de/openssl.installation.php
  • PHP.iniextension=php_openssl.dll
  • Openssl.cnfE:\wamp\php\extras\openssl.cnf
  • % PATH%E:\wamp\php
  • Neustart
  • phpinfo:
    ---- OpenSSL-Unterstützung aktiviert
    ---- OpenSSL-Bibliotheksversion OpenSSL 1.0.1 11.02.2013
    ---- OpenSSL-Header-Version OpenSSL 0.9.8y 5. Februar 2013 
  • Mit und ohne Angabe von config in configargs
  • Mit und ohne Angabe von <Directory E:\wamp\php\extras> in der Apache-Konfiguration
  • openssl.cnf wurde in virtualhost public_html kopiert, darauf hingewiesen und es werden immer noch dieselben Fehler angezeigt
  • Nichts angemeldet error_log
  • Researched: Ich habe die letzten 2 Tage damit verbracht zu recherchieren, überrascht, dass es nicht mehr Informationen darüber gibt, also poste ich hier. Scheint ein Problem mit OpenSSL config oder Apache/php zu sein, die config nicht richtig lesen.

Code: 

$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:

  1. Dank @Gordon kann ich jetzt Open_ssl-Fehler mit openssl_error_string sehen.
  2. Deinstallieren Sie EasyPHP vollständig. Manuell installierte stabile Versionen von PHP/Apache. Gleiche Ergebnisse! Ich mache definitiv etwas falsch mit der Implementierung von openssl unter Windows.
  3. OpenSSL Manually section ... zusätzliche Fehlerinformationen

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>";
    }
48
Brock Hensley

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;
?>
7
Brock Hensley

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");
4
Larzan

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");
4
borrel

Haben Sie OpenSSL über diese Methode installiert? Installieren von OpenSSL unter Windows 

  1. 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. 

  2. Doppelklicken Sie auf "openssl-0.9.7c-bin.exe", um OpenSSL im Verzeichnis\local\gnuwin32 zu installieren. 

  3. Gehen Sie zurück zur selben Seite, laden Sie die "Setup" -Version von "Documentation" herunter und installieren Sie sie in demselben Verzeichnis. 

  4. Ö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.

1
Dwij

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.

1
Stritof

Saubere Lösung:

  1. Laden Sie das Archiv (egal welches) für PHP Windows-Binärdateien von hier herunter: http://windows.php.net/download
  2. Im Inneren finden Sie die Datei /extras/ssl/openssl.cnf
  3. Öffne die Datei openssl.cnf irgendwo (z. B. "C: /WEB/PHP/extras/ssl/openssl.cnf")
  4. Fügen Sie die globale Systemvariable OPENSSL_CONF mit Ihrem verwendeten Pfad hinzu (z. B. "C:\WEB\PHP\extras\openssl.cnf" (ohne Anführungszeichen)).

 enter image description here

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.

1
StanE

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.

0
Stefan Michev