問題: 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
- 再起動
- phpinfo:
----OpenSSLサポートが有効になってい
ます----OpenSSLライブラリバージョンOpenSSL1.0.1e2013年2月11日
----OpenSSLヘッダーバージョンOpenSSL0.9.8y2013年2月5日 - でconfigを指定する場合としない場合
configargs
<Directory E:\wamp\php\extras>
apacheconfigで指定する場合としない場合openssl.cnf
virtualhost public_htmlにコピーされ、それをポイントしても同じエラーが発生する- error_logに何もログインしていません
- 調査:私は過去2日間これを調査しましたが、これ以上の情報がないことに驚いたので、ここに投稿します。OpenSSLconfigまたはapache/phpがconfigを正しく読み取っていないことに問題があるようです。
コード:
$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:
編集:
- @Gordonのおかげで、open_sslエラーを使用して確認できるようになりました
openssl_error_string
- EasyPHPを完全にアンインストールします。PHP/Apacheの安定したバージョンを手動でインストールしました。同じ結果!間違いなく、Windowsにopensslを実装する際に間違っていることがあります。
- 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");
閉じてください。
一年後...
そのため、1年後に再びこれを実行していることに気付きました。コンピューターに設定した、またはスクリプトの実行中に設定したPATH変数に関係なく、ファイルが見つからないというエラーが発生し続けました。の配列にconfig
パラメータを渡すことで解決できました。OpenSSLを正常に使用する機能をテストする関数は次のとおりです。config_args
openssl_pkey_new
/**
* 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>";
}