web-dev-qa-db-ja.com

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.iniextension=php_openssl.dll
  • Openssl.cnfE:\wamp\php\extras\openssl.cnf
  • %PATH%E:\wamp\php
  • 再起動
  • phpinfo:
    ----有効なOpenSSLサポート
    ---- OpenSSLライブラリバージョンOpenSSL 1.0.1e 2013年2月11日
    ---- OpenSSLヘッダーバージョンOpenSSL 0.9.8y 2013年2月5日
  • configargsconfigを指定して、または指定せずに
  • Apache構成で<Directory E:\wamp\php\extras>を指定する場合と指定しない場合
  • openssl.cnfをvirtualhost public_htmlにコピーし、それをポイントしても同じエラーが発生する
  • 何もログインしていませんerror_log
  • Researched:過去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:

編集:

  1. @Gordonのおかげで、openssl_error_stringを使用してopen_sslエラーを確認できるようになりました
  2. EasyPHPを完全にアンインストールします。 PHP/Apacheの手動でインストールされた安定バージョン。同じ結果!間違いなく、Windowsでのopensslの実装で間違ったことをしています。
  3. OpenSSL手動セクション...追加のエラー情報

最終的な考察:
Linuxボックスをセットアップすると、同じエラーが発生します。何回か遊んだ後、openssl_pkey_newでエラーをスローしているにもかかわらず、最終的にテストp12ファイルが作成されることがわかります。要するに、エラーは誤解を招くものであり、サーバー側の設定ではなくopenssl関数を使用しているhowにより多く対処する必要があります。

最終コード:

// 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年後...

そのため、1年後にこれを再度実行しました。コンピューターに設定したPATH変数にかかわらず、またはスクリプトの実行中に、ファイルが見つからないというエラーが表示され続けました。 config_argsopenssl_pkey_new配列のconfigパラメーターを渡すことで解決できました。 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>";
    }
49
Brock Hensley

以下のコードは期待どおりに機能します。ただし、opensslメソッドの後にopenssl_error_string()を実行すると、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;
?>
7
Brock Hensley

同様の問題がありました。スクリプトの冒頭で環境変数 'OPENSSL_CONF'を設定するのに役立ちました手動

どういうわけか、環境変数が正しく設定されなかったか、私のPHPに到達しませんでした(セットアップ:AMPPS、Win7 64ビット)。

以下で使用する例の場所は、標準のAMPPSインストールで使用する必要があるパスです。したがって、AMPPSを使用している場合は、コピーして貼り付けてください。

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

ここにいくつかのこと:

%PATH%にはwindowsとsystem32も含まれている必要があるため、%PATH%はc:\windows;c:\windows\system32;E:\wamp\phpおよびe:\wamp\phpはopenssl dllファイルでなければなりません

また、ヘッダーバージョンに一致するopensslバージョンを試してください0.9.8y 5 Feb 2013ダウンロード 2ビットの場合 および 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");
4
borrel

Apache 2.4 + mod_fcgidを使用している場合、httpd.confファイルにFcgidInitialEnvを追加してOpenSSL confファイルを指定できます。

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

WAMPなどの事前構成済みパッケージを使用していません。Apacheは Apache Lounge およびPHP from windows.php.net から取得しています。自分で設定します。

2
Stritof

この方法でOpenSSLをインストールしましたか? WindowsでのOpenSSLのインストール

  1. http://gnuwin32.sourceforge.net/packages/openssl.htm に移動し、「Setup」バージョンの「Binaries」、openssl-0.9.7c-bin.exeをダウンロードします。

  2. Openssl-0.9.7c-bin.exeをダブルクリックして、OpenSSLを\ local\gnuwin32ディレクトリにインストールします。

  3. 同じページに戻り、「Documentation」の「Setup」バージョンをダウンロードして、同じディレクトリにインストールします。

  4. コマンドラインウィンドウを開き、次のコマンドを試してください。コード:

    \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によって印刷されたコマンドのリストを見ると、インストールが正しく行われていることがわかります。

1
Dwij

クリーンソリューション:

  1. PHP Windowsバイナリはこちらからダウンロードしてください: http://windows.php.net/download
  2. 内部には/extras/ssl/openssl.cnfファイルがあります
  3. Openssl.cnfをどこかに抽出します(例:「C:/WEB/PHP/extras/ssl/openssl.cnf」)
  4. グローバルシステム変数OPENSSL_CONFを使用したパスに追加します(例:「C:\ WEB\PHP\extras\openssl.cnf」(二重引用符なし))。

enter image description here

OPENSSL_CONFシステム変数にパスを追加する必要があります。 Pathシステム変数に追加するだけでは不十分です! Windows 7では、「コントロールパネル>システムとセキュリティ>システム>システムの詳細設定(左メニュー)>詳細(タブ)>環境変数...」の下に設定ダイアログがあります。そこに変数OPENSSL_CONFを追加します。

使用する前にopenssl.cnfファイルを準備する必要はありません-そのまま使用できます。ただし、設定を微調整する場合は可能です。

1
StanE

私の場合、ファイルをc:\ windows\system32にコピーすると助けてくれました

libeay32.dll、ssleay32.dll

OpenSSL_INSTALL_PATH\binにあります。

0
Stefan Michev