ある外部サービスのAPIを呼ぶために、その外部サービス用の秘密鍵をサーバに配置しなければいけません。
そこで、秘密鍵にパスフレーズを付けることにしました。パスフレーズは環境変数で渡すことにしました。
秘密鍵にパスフレーズをつけるには
(1)パスフレーズなしの秘密鍵ファイルのフィンガープリントを表示します。
$ ssh-keygen -l -f fuga.pem
2048 SHA256:jbfeqqCujAK6A/qBg0+FkF2IydwRlUPoMyjWEgHULwo no comment (RSA)
Code language: Bash (bash)
(2)パスフレーズなしの秘密鍵ファイルをコピーします。
$ cp fuga.pem fuga_with_passphrase.pem
Code language: Bash (bash)
(3)コピーした秘密鍵ファイルにパスフレーズをつけます。
$ ssh-keygen -p -f fuga.pem
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
Code language: Bash (bash)
(4)フィンガープリントを表示します。(1)のパスフレーズなしの秘密鍵ファイルのフィンガープリントと同じことを確認しましょう。
$ ssh-keygen -l -f fuga_with_passphrase.pem
Enter PEM pass phrase:
2048 SHA256:jbfeqqCujAK6A/qBg0+FkF2IydwRlUPoMyjWEgHULwo no comment (RSA)
Code language: Bash (bash)
パスフレーズ付きの秘密鍵を読み込むには
その外部サービスでは、$fuga_setting['private_key']
に秘密鍵ファイルのパス、または、秘密鍵の内容を設定します。
まず、パスフレーズなしの秘密鍵でAPIが動くかを確認します。
<?php
$fuga_setting['private_key'] = __DIR__ . '/fuga.pem';
$client = Fuga\API\Client($fuga_setting);
$client->getFuga(...);
Code language: PHP (php)
次に、private_key にパスフレーズなしの秘密鍵の内容を読み込んでみます。
<?php
$fuga_setting['private_key'] = __DIR__ . '/fuga.pem';
$fuga_setting['private_key'] = file_get_contents($fuga_setting['private_key']);
$client = Fuga\API\Client($fuga_setting);
$client->getFuga(...);
Code language: PHP (php)
最後に、パスフレーズ付きの秘密鍵を使うようにします。
<?php
$fuga_setting['private_key'] = __DIR__ . '/fuga_with_passphrase.pem';
$pkey = openssl_pkey_get_private($path, "fu****ga");
openssl_pkey_export($pkey, $out);
$fuga_setting['private_key'] = $out;
$client = Fuga\API\Client($fuga_setting);
$client->getFuga(...);
Code language: PHP (php)
メソッドに分けておきましょう。
<?php
$fuga_setting['private_key'] = __DIR__ . '/fuga_with_passphrase.pem';
$fuga_setting['private_key'] = loadPrivatekeyWithPassphrase(
$fuga_setting['private_key'],
"fu****ga"
);
$client = Fuga\API\Client($fuga_setting);
$client->getFuga(...);
/**
* @param string $path
* @param string $passphrase
*/
function loadPrivatekeyWithPassphrase($path, $passphrase)
{
$pkey = openssl_pkey_get_private($path, $passphrase);
$out = "";
openssl_pkey_export($pkey, $out);
return $out;
}
Code language: PHP (php)
パスフレーズを環境変数から取得するようにします。
<?php
$fuga_setting['private_key'] = __DIR__ . '/fuga_with_passphrase.pem';
$passphrase = getenv('FUGA_PASSPHRASE');
$fuga_setting['private_key'] = loadPrivatekeyWithPassphrase(
$fuga_setting['private_key'],
$passphrase
);
$client = Fuga\API\Client($fuga_setting);
$client->getFuga(...);
/**
* @param string $path
* @param string $passphrase
*/
function loadPrivatekeyWithPassphrase($path, $passphrase)
{
$pkey = openssl_pkey_get_private($path, $passphrase);
$out = "";
openssl_pkey_export($pkey, $out);
return $out;
}
Code language: PHP (php)
openssl-pkey-get-private
openssl-pkey-export
たった2つの関数を呼ぶだけなんだけど、動くまでに時間がかかったよ
環境変数にパスフレーズを設定するには
AWS ElasticBeanstalkなら、コンソールで環境変数を設定します。
ローカルのdocker環境なら、docker-compose.ymlで設定します。
services:
web:
...
environment:
- FUGA_PASSPHRASE=fu****ga
Code language: YAML (yaml)
PHPで一時的に設定したい場合は、putenv
関数を使います。
<?php
putenv('FUGA_PASSPHRASE=fu****ga');
// 試しに echo してみる
echo getenv('FUGA_PASSPHRASE');
Code language: PHP (php)