Проблема: 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
Что я пытался:
extension=php_openssl.dll
E:\wamp\php\extras\openssl.cnf
E:\wamp\php
configargs
<Directory E:\wamp\php\extras>
в конфигурации apache openssl.cnf
в virtualhost public_html, указав на это и по-прежнему получаю те же ошибки Код:
$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:
РЕДАКТИРОВАТЬ:
openssl_error_string
с помощью openssl_error_string
ПОСЛЕДНИЕ МЫСЛИ:
Я установил 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, которые я установил на компьютере или во время выполнения сценария, он не обнаружил ошибки в файле. Я смог его разрешить, передав параметр config
в массиве openssl_pkey_new
в 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>"; }
Приведенный ниже код работает как ожидалось. НО, если вы запустили 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 вы можете видеть ошибочные ошибки, поскольку сообщения об ошибках помещаются в очередь:
Будьте внимательны при использовании этой функции для проверки ошибок, поскольку она, как представляется, считывает из буфера> ошибки, которые могут включать ошибки из другого сценария или процесса, который использует функции 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; ?>
несколько вещей здесь:
%PATH%
также должно содержать окна и system32, поэтому ваш% PATH% должен выглядеть так c:\windows;c:\windows\system32;E:\wamp\php
и в e:\wamp\php
должен быть файл dll openssl
также попробуйте версию openssl, соответствующую версии заголовка 0.9.8y 5 Feb 2013
скачать здесь для 32bit и здесь для 64bit
этот код работает для меня:
// 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" => "wez@example.com" ); // 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");
У меня была аналогичная проблема, для меня это помогло установить переменную окружения «OPENSSL_CONF» вручную в начале моего скрипта.
Как-то переменная среды была установлена неправильно или не прошла до моего php (Setup: AMPPS, Win7 64Bit).
Пример, используемый ниже, – это путь, который вы должны использовать со стандартной установкой AMPPS, поэтому, если вы используете AMPPS, просто скопируйте и вставьте:
putenv("OPENSSL_CONF=C:\Program Files (x86)\Ampps\php\extras\openssl.cnf");
Вы установили OpenSSL с помощью этого метода? Установка OpenSSL в Windows
Перейдите на страницу http://gnuwin32.sourceforge.net/packages/openssl.htm и загрузите «Setup» версию «Binaries», 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, вы знаете, что ваша установка выполнена правильно.
Если вы используете Apache 2.4 + mod_fcgid, вы можете указать FcgidInitialEnv
файл OpenSSL, добавив FcgidInitialEnv
в файл httpd.conf:
# OPENSSL CONF FcgidInitialEnv OPENSSL_CONF "D:/apps/php70/extras/ssl/openssl.cnf"
Я не использую предварительно сконфигурированный пакет, такой как WAMP, у меня есть Apache из Apache Lounge и PHP из windows.php.net и настроен мной.
Чистый раствор:
OPENSSL_CONF
с вашим используемым путем (например, «C: \ WEB \ PHP \ extras \ openssl.cnf» (без двойных кавычек)).
Вы должны добавить путь к системной переменной OPENSSL_CONF
. Добавление его в системную переменную Path
недостаточно! В Windows 7 вы найдете диалог настроек в разделе «Панель управления> Система и безопасность> Система> Расширенные настройки системы (меню слева)> Дополнительно (вкладка)> Переменные среды …». Добавьте туда переменную OPENSSL_CONF
.
Перед использованием файла openssl.cnf не требуется готовить файл – он будет работать из коробки. Но вы можете, если хотите точно настроить настройки.
В моем случае копирование файлов в c: \ windows \ system32 помогло мне
libeay32.dll, ssleay32.dll
Их можно найти в OpenSSL_INSTALL_PATH \ bin.
Могу я предложить использовать Virtual Box , создать виртуальную машину и установить стек LAMP. Это даст вам «более реальную» среду. Как и устранение неполадок, OpenSSL проще в Linux.
С учетом сказанного, я считаю, что ваша проблема заключается в том, что вы не можете найти сам файл плагина. Удостоверьтесь, что он живет на правильном пути и существует на вашем компьютере, а процесс Apache работает под правами для его чтения.