OpenSSL не работает в Windows, ошибки 0x02001003 0x2006D080 0x0E064002

Проблема: OpenSSL не работает в моей среде Windows. OpenSSL многократно сообщает об ошибках 0x02001003, 0x2006D080 и 0x0E064002.

Окружающая среда:

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

Что я пытался:

  • Инструкции по установке http://www.php.net/manual/en/openssl.installation.php
  • PHP.ini extension=php_openssl.dll
  • Openssl.cnf E:\wamp\php\extras\openssl.cnf
  • % PATH% E:\wamp\php
  • перезагружается
  • phpinfo:
    ---- Поддержка OpenSSL включена
    ---- OpenSSL Library Version OpenSSL 1.0.1e 11 Фев 2013
    ---- OpenSSL Версия заголовка OpenSSL 0.9.8y 5 февраля 2013 г.
  • С указанием и без указания config в configargs
  • С указанием и без указания <Directory E:\wamp\php\extras> в конфигурации apache
  • Скопирован openssl.cnf в virtualhost public_html, указал на это и по-прежнему получает те же ошибки
  • Ничего не зарегистрировано error_log
  • Исследовано: Я провел последние 2 дня, исследуя это, удивленный тем, что на нем больше нет информации, поэтому я публикую здесь. Кажется, проблема связана с конфигурацией OpenSSL или apache/php, которая неправильно считывает конфигурацию.

Код:

$privateKey = openssl_pkey_new();
while($message = openssl_error_string()){
    echo $message.'<br />'.PHP_EOL;
}

Результаты:

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 Вручную:

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:

  • Благодаря @Gordon теперь я могу видеть ошибки open_ssl с помощью openssl_error_string
  • Полностью удалить EasyPHP. Вручную установлены стабильные версии PHP/Apache. Те же результаты! Определенно, что-то я делаю неправильно с внедрением openssl в windows.
  • OpenSSL Вручную раздел... дополнительная информация об ошибке

ЗАКЛЮЧИТЕЛЬНЫЕ МЫСЛИ:
Я установил linux box, и я получаю те же ошибки. После некоторых игр я вижу, что, хотя он бросает ошибки в openssl_pkey_new, он в конечном итоге создает мой тестовый файл p12. Короче говоря, ошибки вводят в заблуждение, и ему приходится больше иметь дело с тем, как вы используете функции openssl, не так много конфигурации на стороне сервера.

Конечный код:

// 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");

Закрыть.

Через год...

Таким образом, я обнаружил, что делаю это снова год спустя, и независимо от любых переменных PATH, которые я установил на компьютере или во время выполнения script, он не обнаружил ошибки в файле. Я смог разрешить его, передав параметр config в массиве config_args в openssl_pkey_new. Вот функция, которая проверяет возможность успешного использования OpenSSL:

    /**
     * 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>";
    }

Ответ 1

Приведенный ниже код работает, как ожидалось. НО, если вы запустите openssl_error_string() после методов openssl, он показывает error:0E06D06C:configuration file routines:NCONF_get_string:no value, который является некоторым уведомлением, о котором я не смог найти.

Обратите внимание, что в соответствии с http://www.php.net/manual/en/function.openssl-error-string.php вы можете увидеть ошибочные ошибки, поскольку сообщения об ошибках поставлены в очередь:

Будьте внимательны при использовании этой функции для проверки ошибок, поскольку она, как представляется, считывает из буфера из > ошибок, которые могут включать ошибки из другого script или процесса, который использует функции openssl > . (Я с удивлением обнаружил, что он сохранял сообщения об ошибках, прежде чем я вызвал какие-либо функции > openssl_ *)

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

Ответ 2

несколько вещей здесь:

%PATH% также должен содержать окна и system32, поэтому ваш% PATH% должен выглядеть как c:\windows;c:\windows\system32;E:\wamp\php, а в e:\wamp\php должен быть файл dll openssl

также попробуйте версию openssl, соответствующую версии заголовка 0.9.8y 5 Feb 2013 скачать здесь для 32bit и здесь для 64-битного

этот код работает для меня:

// 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");

Ответ 3

У меня была аналогичная проблема, для меня это помогло установить переменную окружения "OPENSSL_CONF" вручную в начале моего script.

Как-то переменная среды была установлена ​​неправильно или не прошла до моего php (Setup: AMPPS, Win7 64Bit).

Нижеприведенное расположение примера - это путь, который вы должны использовать со стандартной установкой AMPPS, поэтому, если вы используете AMPPS, просто скопируйте и вставьте:

putenv("OPENSSL_CONF=C:\Program Files (x86)\Ampps\php\extras\openssl.cnf");

Ответ 4

Установили ли вы OpenSSL с помощью этого метода? Установка OpenSSL в Windows

  • Перейдите в http://gnuwin32.sourceforge.net/packages/openssl.htm и загрузите версию "Binaries" "Setup", openssl-0.9.7c-bin.Exe.

  • Дважды щелкните файл openssl-0.9.7c-bin.exe, чтобы установить каталог OpenSSL в \local\gnuwin32.

  • Вернитесь на ту же страницу, загрузите "Setup" версию "Документация" и установите ее в тот же каталог.

  • Откройте окно командной строки и попробуйте выполнить следующую команду: Код:

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

Если вы видите список команд, напечатанных OpenSSL, вы знаете, что ваша установка выполнена правильно.

Ответ 5

Если вы используете Apache 2.4 + mod_fcgid, вы можете указать файл conf в OpenSSL, добавив FcgidInitialEnv в файл httpd.conf:

# OPENSSL CONF
FcgidInitialEnv OPENSSL_CONF "D:/apps/php70/extras/ssl/openssl.cnf"

Я не использую предварительно сконфигурированный пакет, такой как WAMP, у меня есть Apache из Apache Lounge и PHP из windows.php.net и настроен мной.

Ответ 6

Чистое решение:

  • Загрузите архив (не матовый) для двоичных файлов PHP Windows: http://windows.php.net/download
  • Внутри файла находится файл /extras/ssl/openssl.cnf
  • Извлечь openssl.cnf где-нибудь (например, "C:/WEB/PHP/extras/ssl/openssl.cnf" )
  • Добавьте глобальную системную переменную OPENSSL_CONF с вашим используемым путем (например, "C:\WEB\PHP\extras\openssl.cnf" (без двойных кавычек)).

введите описание изображения здесь

Вы должны добавить путь к системной переменной OPENSSL_CONF. Добавить его в системную переменную Path недостаточно! В Windows 7 вы найдете диалог настроек в разделе "Панель управления > Система и безопасность > Системa > Расширенные настройки системы (меню слева) > Дополнительно (вкладка) > Переменные среды...". Добавьте туда переменную OPENSSL_CONF.

Не нужно готовить файл openssl.cnf перед использованием - он будет работать из коробки. Но вы можете, если хотите точно настроить настройки.

Ответ 7

В моем случае копирование файлов в c:\windows\system32 помогло мне

libeay32.dll, ssleay32.dll

Их можно найти в OpenSSL_INSTALL_PATH\bin.

Ответ 8

Могу я предложить использовать Виртуальный блок, создать виртуальную машину и установить стек LAMP. Это даст вам "более реальную" среду. Как и устранение неполадок, OpenSSL проще в Linux.

С учетом сказанного, я считаю, что ваша проблема заключается в том, что вы не можете найти сам файл плагина. Убедитесь, что он живет на правильном пути и существует на вашем компьютере, а процесс Apache работает под правами для его чтения.