あんまり詳しいドキュメントがみつからなかったので、拙いながらも参考まで。
環境
- kintone
クライアント認証
PHP-cURLを使ったSSLクライアント認証手順 - Qiita
file_get_content
について。
PHPでクライアント証明書が必要なWebサイトにアクセスする at softelメモ
pfx形式、PKCS#12形式の証明書は、opensslコマンドでPEM形式に変換できる。
contextの中のoptionで'http'を'https'する必要があるかと思ったけれど、SSL通信の場合でもここはhttpコンテキストということでいいらしい。
php - https for stream_context_create - Stack Overflow
IPアドレス制限時のクライアント証明書を利用したREST APIの利用 – cybozu developer network
PHP: SSL context options - Manual
local_pk string Path to local private key file on filesystem in case of separate files for certificate (local_cert) and private key.
どうもpemファイルの運用に2パターンあるらしい。
- pemファイルとpassphraseをstream_context_set_optionに設定する
- pemファイルとkeyファイルをstream_context_set_optionに設定する
pfxファイルを変換する際のオプションによって、おそらくどちらのパターンになるかが決まるというわけか。
この辺り、opensslコマンドやSSL関連の理解が足りていない。
pfxファイルをpemファイルとkeyファイルに変換する
- foo@bar.co.jp.pfx と foo@bar.co.jp.txt を cybozu 共通設定からダウンロード
- foo@bar.co.jp.txtからパスワードを確認しておく
- PowerShellを起動。ファイルのディレクトリまでcdで移動してコマンド
openssl pkcs12 -nodes -in foo@bar.co.jp.pfx -clcerts -nokeys -out some_name.pem
//パスワード入力
openssl pkcs12 -nodes -in foo@bar.co.jp.pfx -nocerts -out some_name.key
//パスワード入力
これでpfxファイルとkeyファイルが生成される。
- nokeys ……pemファイル内にkeyを書き込まない
- nocerts ……keyファイル内に証明情報を書き込まない
サンプル関数
symfony2(というかECCUBE3)のControllerの中で使っていた関数だが参考まで。
public function testKintone(Application $app, Request $request) { $loginName = 'hoge@hoge'; $password = 'randompassword'; // リクエストヘッダ $header = array( "Host: subdomain.s.cybozu.com:443", "X-Cybozu-Authorization: " . base64_encode($loginName . ':' . $password), ); // HTTPコンテキスト $context_array = array( "http" => array( "method" => 'GET', "header" => implode("\r\n", $header), ), 'ssl' => array( 'local_cert' => __DIR__ . '/certificatefile.pem',//starts with slush 'local_pk' => __DIR__ . '/secretkey.key',//starts with slush // 'passphrase' => 'in_case_you_use_passphrase_instead_of_secretkey', ) ); $context = stream_context_create($context_array); try { $result_json = file_get_contents( 'https://subdomain.cybozu.com/k/v1/record.json?app='.'1'.'&id='.'2', false, $context ); return $result_json; } catch (Exception $exception) { throw $exception; } }
画像のダウンロードサンプルはこちら。
public function testKintonePictDownload(Application $app, Request $request) { $loginName = 'hoge@hoge'; $password = 'some_password'; // リクエストヘッダ $header = array( "Host: subdomain.s.cybozu.com:443", "X-Cybozu-Authorization: " . base64_encode($loginName . ':' . $password), ); // HTTPコンテキスト $context_array = array( "http" => array( "method" => 'GET', "header" => implode("\r\n", $header), ), 'ssl' => array( 'local_cert' => __DIR__ . '/certificatefile.pem',//starts with slush 'local_pk' => __DIR__ . '/secretkey.key',//starts with slush // 'passphrase' => 'in_case_you_use_passphrase_instead_of_secretkey', ) ); $context = stream_context_create($context_array);// コンテキストの生成 try { $result_json = file_get_contents( 'https://subdomain.s.cybozu.com/k/v1/record.json?app='.'1'.'&id='.'2', // URI false, // use_include_pathはfalse $context // コンテキストの生成 ); $result_array = json_decode($result_json,true); $fileKey = $result_array['record']['添付ファイル']['value'][0]['fileKey']; $add_images = file_get_contents('https://subdomain.s.cybozu.com/k/v1/file.json?fileKey=' . $fileKey, false, $context); return 'OK'; } catch (Exception $exception) { throw $exception; } }
kintoneは公式ドキュメントのエンドポイントURLに「セキュアアクセスの場合はsubdomain.s.cybozu.com
にアクセスする」ってことを明記すべきだと思うんだが違うかな。
参考記事
- PHP-cURLを使ったSSLクライアント認証手順 - Qiita
- PHPでクライアント証明書が必要なWebサイトにアクセスする at softelメモ
- IPアドレス制限時のクライアント証明書を利用したREST APIの利用 – cybozu developer network
- kintone API SDK for PHP – cybozu developer network
- PHPでクライアント証明書が必要なWebサイトにアクセスする at softelメモ
- [Nginx] pfx 形式の証明書を pem 形式に変換して Nginx で SSL 設定する – memo.dogmap.jp
- Windows上で、証明書や秘密鍵をPEM形式に変換してエクスポートする (1/2):Tech TIPS - @IT
- サーバー証明書のPEMとPFXの相互変換 - Qiita