2017-01-09 10 views
18

Laravel 5.3(Windowsサーバー上)と同じ問題があります。私はすべての可能な試行を行った:チェック.envファイル、設定、職人の新しいキー生成、キャッシュ:クリア、設定:クリア、コンポーザー更新、問題はランダムに持続する。ランダムRuntimeException:正しいキーの長さを持つAES-128-CBCとAES-256-CBCのみサポートされている暗号

Apacheと同じバージョンのmysql、phpを使用している同じコードは、Mac OSでこの問題を生成しないことに注意してください。

キー(Encrypterコンストラクタの最初のパラメータ)が「時々」空になり、もちろん失敗することがわかりました。ほとんどの場合、キーは正しいが、ランダムにEncryptionServiceProviderから空のキーが到着し、EncryptionServiceProviderはそれをアプリの設定に尋ねる。

私のために働いた唯一の解決策は、暗号化コンストラクタが空のキーで呼び出されないように、if ($key)をEncryptionServiceProviderに追加することでした。もちろん

は、「クリーン」なソリューションではありませんまた、それは問題を説明したが、少なくともエラーで満たされたログファイルを見つけるために回避:これは私にはないLaravelのバグである場合

RuntimeException: The only supported ciphers are AES-128-CBC and AES-256-CBC and pages are displayed correctly.

を知っている、しかしもちろん、誰かがこれを説明することができれば、私はもっと知り合いになるだろう。

以下は私の修正クラスです:

class EncryptionServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->singleton('encrypter', function ($app) { 
      $config = $app->make('config')->get('app'); 

      // If the key starts with "base64:", we will need to decode the key before handing 
      // it off to the encrypter. Keys may be base-64 encoded for presentation and we 
      // want to make sure to convert them back to the raw bytes before encrypting. 
      if (Str::startsWith($key = $config['key'], 'base64:')) { 
       $key = base64_decode(substr($key, 7)); 
      } 
     if ($key) 
      return new Encrypter($key, $config['cipher']); 
     }); 
    } 
} 

さらなる詳細およびバックトレースログ::私はちょうどnew Encrypterif ($key)行を追加して、私が書いたようにもちろん

、私は、チェックし.envファイル、設定、職人新規キー生成、キャッシュ:クリア、設定:クリア、コンポーザー更新。 これは99%の時間で動作しますが、無作為にエラーが発生するので大丈夫です。

ここでバックトレース:

[2017-01-09 10:25:40] test.ERROR: RuntimeException: The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths. in C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Encryption\Encrypter.php:43

スタックトレース:

#0 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Encryption\EncryptionServiceProvider.php(27): Illuminate\Encryption\Encrypter->__construct('', 'AES-256-CBC') 
#1 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(746): Illuminate\Encryption\EncryptionServiceProvider->Illuminate\Encryption\{closure}(Object(Illuminate\Foundation\Application), Array) 
#2 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(644): Illuminate\Container\Container->build(Object(Closure), Array) 
#3 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(709): Illuminate\Container\Container->make('encrypter', Array) 
#4 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(864): Illuminate\Foundation\Application->make('encrypter') 
#5 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(819): Illuminate\Container\Container->resolveClass(Object(ReflectionParameter)) 
#6 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(788): Illuminate\Container\Container->getDependencies(Array, Array) 
#7 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(644): Illuminate\Container\Container->build('App\\Http\\Middle...', Array) 
#8 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(709): Illuminate\Container\Container->make('App\\Http\\Middle...', Array) 
#9 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(127): Illuminate\Foundation\Application->make('App\\Http\\Middle...') 
#10 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#11 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#12 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#13 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#14 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(64): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#15 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#16 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#17 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#18 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#19 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#20 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#21 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(655): Illuminate\Pipeline\Pipeline->then(Object(Closure)) 
#22 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(629): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) 
#23 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(607): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) 
#24 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(268): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) 
#25 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(53): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request)) 
#26 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#27 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#28 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#29 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#30 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(150): Illuminate\Pipeline\Pipeline->then(Object(Closure)) 
#31 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(117): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) 
#32 C:\Apache24\htdocs\sph\public\index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) 
#33 {main} 
+0

これに興味があります。この問題が2,3回あって、フレームワークを「単純に」再インストールするとこれが解決されます。私は本当になぜ思った。 – Loek

+0

'' php artisan key:generate'を実行しましたか? –

+0

また、キー*が* nullの場合に 'debug_print_backtrace();'を試してみましたか?呼び出しのたびに呼び出しスタックと 'error_log()'のキー値をトレースするのは面白いかもしれません。 –

答えて

-3

それはconfig/app.php -> key.envファイルからAPP_KEYをコピーするか、以下のコマンドを実行し、とても簡単です:

php artisan key:generate

-2

Laravel 5.3をインストールしましたが、そこに.envファイルが見つかりませんでした。とブーム....それは問題だった。アプリケーションのルートに.envファイルを作成し、端末には64ビットの符号化文字列を生成しました。

を端末に生成しました。その文字列を.ENVファイルにコピーします。

APP_KEY=base64:************************************************

ここで、****はエンコードされた文字列です。再度アプリケーションを実行すると正常に動作するはずです。

9

マルチスレッドWebサーバーではなく、スレッドセーフなバージョンのPHPをマルチスレッドWebサーバーで使用すると問題が発生します。Github issue hereGithub issue here、およびPHP bug report hereでもう少し問題について読むことができます。もう少しリンクがありますが、投稿したもののほんの一部から分岐しています。

基本的な要点は、マルチスレッドWebサーバーでは、複数のスレッドを処理する1つのプロセスがあることです。ただし、putenv()/getenv()メソッドはスレッドセーフではなく、プロセスレベルで環境変数を変更するため、そのプロセスのすべてのスレッドが影響を受けます。

だから、あなたはこのようなもので終わる:(this issueで説明したように):、

Request 1: {starts --- loads env --- work --- finishes} 
Request 2:        {starts ----- loads env --- work --- finishes} 

だから、1が入ってくる要求し、微環境をロードして動作するようになります。リクエスト1が動作している間、リクエスト2が入って別のスレッドで開始されます。リクエスト2が環境変数を読み込む前に、リクエスト1が完了し、PHPはputenv()で設定されたすべての変数をクリアします。ここで、要求2は環境の読み取りを試みますが、要求1が完了すると変数がクリアされたため、nullが取得されます。

この問題は、2つの方法で軽減することができます。

  1. は生産に.envファイルを使用しないでください。環境変数を直接設定し、phpdotenvを無効にします。これは、package itselfによって提案された:

    phpdotenv is made for development environments, and generally should not be used in production. In production, the actual environment variables should be set so that there is no overhead of loading the .env file on each request.

  2. 設定ファイルの外env()メソッドを使用していない、とあなたが設定ファイルをキャッシュすることを確認しないでください。この方法を使用すると、環境は設定ファイルキャッシュを作成するときに一度だけ読み込まれます。すべての実際のWeb要求はキャッシュからデータを読み込み、環境変数は決して再び触れません。

+0

@cytsunnyちょうどこの答えがあなたが探していたものかどうか疑問に思っています。 – patricus

+0

私は投票しました。より良い答えがあるかどうかを見てみたいです。 (例えば、OPのようにハッキングせずに.envを使用するときの問題を解決する)賞金が終了する前に他の答えがない場合、賞金を授与します。 – cytsunny

関連する問題