はじめに
やりたいことは外部サービスのAPIを叩きたい!
APIトークンとクライアント証明書(p12形式)とパスワード渡すから認証してね。ってことなのでやっていく
実際のコード
private function getData($verification_token)
{
$token = env('API_TOKEN'); // Authorizationヘッダーに指定するBearerトークン
$ssl_pass = env('SSL_PASS'); // 証明書のパスワード
$ssl_path = storage_path('app/private/test/ssl_file'); // クライアント証明書を配置した場所
$headers = [
'Authorization' => 'Bearer ' . $token,
'Content-Type' => 'application/json',
];
$base_url = env('API_URL');
$api_path = '/v2/endpoint'; // APIのエンドポイント
$client = new Client([
'base_uri' => $base_url,
'cert' => [$ssl_path, $ssl_pass],
'curl' => [CURLOPT_SSLCERTTYPE => 'P12'],
]);
try {
$response = $client->request(
'GET',
$api_path,
['headers' => $headers]
);
} catch (ClientException $e) {
Log::error('$e->getResponse()->getBody()->getContents());
return false;
}
return json_decode($response->getBody()->getContents(), true);
}
ハマった箇所
$client = new Client([
'base_uri' => $base_url,
'cert' => [$ssl_path, $ssl_pass],
'curl' => [CURLOPT_SSLCERTTYPE => 'P12'],
]);
'cert' => [$ssl_path, $ssl_pass]
で証明書の場所と証明書のパスワードを指定
'curl' => [CURLOPT_SSLCERTTYPE => 'P12']
でp12形式ですよと指定してあげる
ここから下は用語仕組みをざっくり説明していくので書き方だけ知りたいって方は読まなくて大丈夫です!
Guzzleって何?
Guzzle is a PHP HTTP client and framework for building RESTful web service clients
HTTP 要求の送信を容易にし、簡単に Web サービスと統合できるようにする PHPのHTTP クライアントです。
クライアント証明書と認証の仕組み(ざっくり)
クライアント証明書とは、個人や組織を認証し発行される電子証明書のことです。
SSLサーバ証明書がサーバにインストールされ、ウェブサイトの所有者の実在性を認証するのに対し、クライアント証明書は、システムやサービス、メールを利用するユーザのデバイスに証明書をインストールし、そのユーザが正規の利用者であることを認証します。
パスポート、入館証といった身分証明書を想像すると理解しやすいです。
サーバにSSLで接続する際、クライアント(ブラウザ)に電子証明書を提示させ、接続元を認証する仕組み。
通常、サーバーが信用する認証局が署名した電子証明書をクライアントが提示してはじめてSSLの接続が成立する。
一般のSSL経由のhttp接続では、クライアントが一方的にサーバを認証 し、サーバーはクライアントを認証しない。一方、クライアント認証では、 クライアントとサーバが相互に認証し合う必要がある。
SSL証明書の形式
・PEM(Privacy Enhanced Mail)
.pem.cer よく見るやつ
・DER(Distinguished Encoding Rules)
.cer
・PKCS7(Public-Key Cryptography Standards)
.p7a
・PKCS10
.p10
・PKCS12
.pfx/.p12 クライアント証明書によく使われる
参考リンク
Guzzleのgithub
Guzzleのドキュメント
githubでp12形式についてのスレッド?
p12ファイルについて
証明書の説明
パスフレーズの渡し方で参考にしたやつ