クライアント認証を使用したApexコールアウト

今回はSSL認証についてです。
やはりネットワーク系のような見えない、見えづらいものは苦手だなぁ。

スポンサーリンク

実装の前に前提知識から

まずは、全く理解ができなかったので、ここを読みました。

これによると、SalesForceがクライアントとして機能するか、サーバとして機能するかがポイント。
前者は、

  • アウトバウンドメッセージ
  • 代理認証要求
  • Apexコールアウト

を使用するときに、クライアントとして機能し、後者は、

  • サービスプロバイダ (SP)

として使用するときにサーバの役目を果たします。
今回は、Apexコールアウトをやりたいので、クライアントとしての役割を担うことになります。

さらに読み進めるとこんな記述が。

一方、Apex コールアウトは ([設定] | [セキュリティのコントロール] | [証明書と鍵の管理] の一覧から) どの証明書を Salesforce がターゲットホストに提示するかを指定します。 自分自身のドメイン (たとえば、mycompany.com など) でルートされたインスタンスのために、管理する証明書の共通名を使用する必要があります。 salesforce.com ドメインで証明書を取得する必要はありません。

つまり、コールアウト先のサーバと証明書の共通情報を共有する必要があります。
この証明書の共通情報をCSR(Certificate Signing Request)と呼ぶそうです。
CSRを使ってコールアウト先のサーバに証明書を作らせます。
あとは、クライアント側であるSalesForceに作成させた証明書を取り込めば、SalesForceは信頼されたクライアントになるよという仕組みです。

Apexコールアウトするための準備

では、前提知識を得たところで、Apexコールアウトの準備をしましょう。

まずは、[設定]→[セキュリティコントロール]→[リモートサイトの設定]でコールアウト先のURLを登録します。
これは、SSL認証しようがしまいが関係なく登録します。

次に、[設定]→[セキュリティコントロール]→[証明書と鍵の管理]から証明書の共通情報を登録します。

証明機関署名証明書の作成を選択します。
証明機関署名証明書の作成
証明書に必要情報を記載します。

表示ラベルと一意の名前は任意ですが、ここでは「csr_hoge」とします。

証明書と鍵の編集の設定

保存したら、証明書署名要求のダウンロードを選択します。
ダウンロードされたファイルは何だかよく分からない英数字の羅列ですが、これがCSRといわれるものです。
証明書署名要求をダウンロードしCSRを取得

これを使って、サーバ側に証明書を発行してもらうことになります。
証明書を発行したら、先ほど登録した証明書に取り込みます。
署名済み証明書のアップロードを選択して、証明書のファイルをアップロードします。

署名済み証明書のアップロード

これでApexからコールアウトできる準備が整いました。

Apexコードから証明書を使用してコールアウト

あとは、Apexからクライアント証明書を設定します。
やり方は簡単で、HttpRequestクラスのsetClientCertificateNameを使用するだけで設定可能です。
引数には、証明書の登録の時に作成した一意の名前をセットしてください。

HttpRequest req = new HttpRequest();
req.setEndpoint('コールアウト先のURL');
req.setMethod('GET');
req.setClientCertificateName('csr_hoge'); // 登録した一意の名前をセット
HttpResponse res = h.send(req);
// 以下省略

まとめ

まとめというよりは、ApexコールアウトのSSL認証で必要になるもの、ここを押さえておけばOK。

  • リモートサイトの設定
  • 証明書情報の登録
  • サーバから発行された証明書をアップロード
  • HttpRequestクラスのsetClientCertificateNameメソッドを使用して証明書情報をセット

コメント