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
-
%ПУТЬ%
E:\wamp\php
- Перезагружен
-
пхинфо:
---- Включена поддержка OpenSSL
---- Версия библиотеки OpenSSL OpenSSL 1.0.1e 11 февраля 2013
---- Версия заголовка OpenSSL OpenSSL 0.9.8y 5 февраля 2013 - С указанием и без указания конфигурации в
configargs
- С указанием и без указания
<Directory E:\wamp\php\extras>
в конфигурации apache - Скопировал
openssl.cnf
в virtualhost public_html, указал на это и все равно получал те же ошибки - Ничего не вошло в систему журнал ошибок
- Исследовано: Я провел последние 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
Открыть вручную:
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:
РЕДАКТИРОВАТЬ:
- Благодаря @Gordon теперь я могу видеть ошибки open_ssl с помощью
openssl_error_string
- Полностью удалите EasyPHP. Вручную установленные стабильные версии PHP/Apache. Те же результаты! Определенно что-то я делаю не так с реализацией openssl в Windows.
- Раздел OpenSSL вручную... дополнительная информация об ошибке
ЗАКЛЮЧИТЕЛЬНЫЕ МЫСЛИ:
Я настроил окно Linux и получаю те же ошибки. После некоторой игры я вижу, что, хотя он выдает ошибки в 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");
Закройся подальше.
Год спустя...
Таким образом, я обнаружил, что делаю это снова год спустя, и независимо от того, какие переменные ПУТИ я установил на компьютере или во время выполнения сценария, он продолжал выдавать ошибку о том, что файл не найден. Я смог решить эту проблему с помощью передача параметра 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>";
}
8 answers
Приведенный ниже код работает должным образом. НО если вы запустите 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;
?>
У меня была аналогичная проблема, для меня это помогло установить переменную среды 'OPENSSL_CONF' вручную в начале моего скрипта.
Каким-то образом переменная среды была установлена неправильно или не дошла до моего php (Настройка: AMPPS, 64-битный Win7).
Пример расположения, используемый ниже, - это путь, который вам придется использовать при стандартной установке AMPPS, поэтому, если вы используете AMPPS, просто скопируйте и вставьте:
putenv("OPENSSL_CONF=C:\Program Files (x86)\Ampps\php\extras\openssl.cnf");
Вот несколько вещей:
%PATH%
также должен содержать windows и system32, поэтому ваш %ПУТЬ% должен выглядеть как c:\windows;c:\windows\system32;E:\wamp\php
, а в e:\wamp\php
должен быть файл библиотеки DLL openssl
Также попробуйте версию openssl, соответствующую версии заголовка 0.9.8y 5 Feb 2013
загрузите здесь для 32 бит и здесь для 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");
Установили ли вы OpenSSL с помощью этого метода? Установка OpenSSL в Windows
Перейдите к http://gnuwin32.sourceforge.net/packages/openssl.htm , и загрузите "Установочную" версию "Двоичных файлов", openssl-0.9.7c-bin.exe.
Дважды щелкните по openssl-0.9.7c-bin.exe чтобы установить OpenSSL в каталог \local\gnuwin32.
Вернитесь на ту же страницу, загрузите "Установочную" версию "Документации" и установите ее в тот же каталог.
Откройте окно командной строки и попробуйте выполнить следующую команду: Код:
\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, вы можете указать файл OpenSSL conf, добавив FcgidInitialEnv
в файл httpd.conf:
# OPENSSL CONF
FcgidInitialEnv OPENSSL_CONF "D:/apps/php70/extras/ssl/openssl.cnf"
Я не использую предварительно настроенный пакет, такой как WAMP, у меня есть Apache от Apache Lounge и PHP от windows.php.net и сконфигурирован мной.
Чистое решение:
- Загрузите архив (неважно, какой) для двоичных файлов PHP Windows отсюда: http://windows.php.net/download
- Внутри вы найдете файл /дополнительно/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 вы найдете диалоговое окно настроек в разделе: "Панель управления > Система и безопасность > Система > Дополнительные системные настройки (меню слева) > Дополнительно (Вкладка) > Переменные среды...". Добавьте переменную OPENSSL_CONF
туда.
Не требуется подготавливать файл openssl.cnf перед использованием - он будет работать из коробки. Но ты можно, если вы хотите точно настроить настройки.
В моем случае копирование файлов в c:\windows\system32 помог мне выбраться
Libeay32.dll, ssleay32.dll
Их можно найти в OpenSSL_INSTALL_PATH\bin.
Могу ли я предложить использовать Виртуальную коробку , создать виртуальную машину и установить стек LAMP. Это даст вам "более реальную" среду. А также устранение неполадок OpenSSL проще в Linux.
С учетом сказанного, я полагаю, что ваша проблема в том, что вы не можете найти сам файл плагина. Убедитесь, что он находится на правильном пути и существует на вашей машине, а процесс, в котором работает Apache, имеет разрешения на его чтение.