運用 開発

CircleCIを使った継続的インテグレーション(Continuous Integration)第2回

第一回では、GuthubのセットアップからCircleCIのセットアップ、そしてGitHubとの連携と、DevHubの有効化までの手順をご説明しました。

第二回の今回は、Salesforceの組織とCircleCI間の認証に関する設定をしていきます。

前回の記事はこちら

参考CircleCIを使った継続的インテグレーション(Continuous Integration)第1回

Salesforceの大型プロジェクトやアジャイル開発方式を採用したプロジェクトでは、経常的に開発/運用(本番)組織へデプロイ作業を実施することがあります。プロジェクトの規模によっては、この作業のため ...

続きを見る

Dev Hub組織に対してJWTベースフローを使用した組織の認証を実行

Dev Hub組織に対してJWTベースフローを使用した組織の認証を実行します。※CircleCIからSalesforce組織に対する認証の設定

継続的インテグレーション(CI)の環境は自動化されており、OAuth2.0Webサーバ認証フローのユーザインタラクションはサポートされていないため、代替手段としてJWT(Json Web トークン)ベアラーフローを使用して組織を認証する必要があります。

Dev Hub 組織で高保証 (強化) 認証が設定されている場合は、ユーザに ID の検証プロセスがあるため、JWT ベアラーフローや Salesforce CLI によるヘッドレス認証は使用できないということなので注意が必要です。

非公開鍵と自己署名デジタル証明書の作成

OAuth 2.0 JWT ベアラー認証フローでは、証明書の署名に使用されるデジタル証明書と非公開鍵が必要になります。デジタル証明書をカスタム接続アプリケーションにアップロードします。このカスタム接続アプリケーションも JWT ベアラー認証フローで必要になります。認証機関で発行された独自の非公開鍵と証明書を使用できます。または、OpenSSL を使用して鍵と自己署名デジタル証明書を作成することもできます。

【Open SSLをインストール(未インストールの場合)】

手順①以下のサイトにWindows用にビルドされたインストーラがあるので、ダウンロードします。

Webサイト「Shining Light Productions(Win32/Win64 OpenSSL)」 ※実行時点の最新版で構いません。

今回は、Win64 OpenSSL v1.1.1oのMSIをダウンロードします。

※Win64 OpenSSL v3.0.3の場合、最後のsfdxでの認証でエラーになることがわかっているので間違えないようにしてください。Issue(https://developer.salesforce.com/forums?id=9062I000000BmNHQA0

ERROR running auth:jwt:grant: We encountered a JSON web token error, which is likely not an issue with Salesforce CLI. Here’s the error: error:25078067:DSO support routines:win32_load:could not load the shared library

Windows以外の場合は、Opensslのサイトよりダウンロードしてください。

「openssl.org:https://www.openssl.org/

手順②ダウンロードしたインストーラ(MSIファイル)を実行します。

以下の警告メッセージが表示されるので、詳細情報のリンクをクリックします。

手順③実行ボタンが表示されるためクリックしてインストールを実行します。

手順④インストーラが起動されます。同意にチェックをして次に進みます。

手順⑤Opensslのインストール先フォルダを選択します。※デフォルトのままで大丈夫です。

手順⑥ショートカット名を指定します。※デフォルトのままで大丈夫です。

手順⑦OpenSSL DLLについては、二つ目のオプション(OpenSSL binaries(/bin)directory)を選択してください。

手順⑧最終確認後、Installボタンをクリックします。

手順⑨最後に寄付の画面が表示されますが、チェックを外してそのまま終了します。※寄付したい場合は任意のオプションを選択

手順⑩続いて、インストールしたOpensslのパスを設定します。システムのプロパティから詳細設定を開きます。環境変数のボタンをクリックします。

手順⑪環境変数の画面にて、ユーザ環境変数の編集ボタンをクリックします。

手順⑫新規ボタンをクリックして、Opensslをインストールしたフォルダのフルパスを登録します。

手順⑬以下のように新規パスが追加されていることを確認して終了します。

手順⑬パスが通っているか確認するためコマンドプロンプトを起動して、以下のコマンドを実行します。

>openssl version

バージョンの情報が表示されていれば成功です。

OpenSSL を使用して非公開鍵と自己署名デジタル証明書の作成

つぎにOpensslを使って自己署名デジタル証明書を作成していきます。(以下2つのファイルを生成します)

・server.key — 非公開鍵。auth:jwt:grant コマンドで組織を認証するときにこのファイルを指定します。
・server.crt — デジタル証明書。JWT ベアラーフローで必要な接続アプリケーションを作成するときにこのファイルをアップロードします。

手順①コマンドプロンプトを起動して、非公開鍵を生成するワークフォルダを作成します。

> mkdir 任意のワークフォルダ(フルパスで指定) ※システム管理者権限が必要なフォルダ階層はやめたほうが良いです。

例:mkdirコマンドを使って以下のフォルダを作成して、cdコマンドで作成したフォルダへ移動します。

 command
> mkdir C:\Users\e\dev\jdoe\JWT
> cd C:\Users\e\dev\jdoe\JWT

※エクスプローラからフォルダを作成しても構いません。

手順②以下のコマンドを実行して非公開鍵を生成し、server.key というファイルに保存します。

 command
> openssl genrsa -des3 -passout pass:SomePassword -out server.pass.key 2048
> openssl rsa -passin pass:SomePassword -in server.pass.key -out server.key

手順③上記コマンド実行後、作業用フォルダに以下2つのファイルが生成されているため[server.pass.key]のほうを削除します。

・server.key

・server.pass.key

手順④server.key ファイルを使用して、証明書署名要求を生成します。(server.csr というファイルに証明書署名要求を保存)

以下のコマンドを実行します。

 command
> openssl req -new -key server.key -out server.csr

以下、会社情報などの情報入力が求められるため適宜ご自身の情報を入力してください。

 command
>openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:TOKYO
Locality Name (eg, city) []:KOTO-KU
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CCLT
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:CCLT
Email Address []:cclt@mail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ※パスワードを設定
An optional company name []:CCLT

手順⑤以下のcsrファイルが生成されていることを確認します。

server.csr

手順⑥以下のコマンドを実行し、server.key および server.csr ファイルから自己署名デジタル証明書を生成します。

※server.crt というファイルに証明書を保存します。

 command
> openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
(実行結果)
Certificate request self-signature ok
subject=C = JP, ST = TOKYO, L = KOTO-KU, O = CCLT, OU = IT, CN = CCLT, emailAddress = cclt@mail.com

※非公開鍵: server.key とデジタル証明書: server.crt が存在することを確認します。

接続アプリケーションを作成して Salesforce DX 用に設定

OAuth 2.0 JWT ベアラー認証フローを使用して、Dev Hub 組織にCircleCI用の接続アプリケーションを作成します。

Dev Hub 組織用の接続アプリケーションの作成

手順①Dev Hubを有効化したSalesforce組織にログインして、[設定] から、アプリケーションマネージャを実行します。

手順②接続アプリケーション名などの情報を入力して、OAuth 設定の有効化にチェックを入れます。

※OAuth にチェックを入れるとOAuthの設定情報を入力できるようになります。

  • コールバックURL:「http://localhost:1717/OauthRedirect」を入力します。
  • デジタル署名を使用:JWT認証の場合こちらをチェック
  • 証明書ファイルのアップロード:ローカル環境で生成したserver.crt をアップロードします。

手順③OAuthの範囲は以下を選択します。

  • API を使用してユーザデータを管理 (api)
  • Web ブラウザを使用してユーザデータを管理 (web)
  • いつでも要求を実行 (refresh_token, offline_access)

上記を設定後、保存をクリックします。

手順④保存後の画面に表示されるコンシューマ鍵をコピーしてテキストに張り付けておきます。※後で利用するため

手順⑤manageボタンをクリックして、ポリシーの編集画面にて、[ポリシーを編集] をクリックします。

手順⑥ [OAuth ポリシー]の許可されているユーザで [管理者が承認したユーザは事前承認済み] を選択します。

以下の警告メッセージが表示されるためOKをクリックします。

手順⑦上記の設定が完了したら保存します。

手順⑧プロファイルを管理するのメニューを実行します。

手順⑨この接続アプリケーションを許可するプロファイルを選択して保存します。

※プロファイルの選択の代わりに権限セットを作成して、ユーザへ付与しても構いません。

手順⑩認証する組織が https://login.salesforce.com でホストされていない場合、プロジェクトの設定ファイル (sfdx-project.json) を更新する必要があります。

sfdx-project.jsonファイルは、Salesforce CLIをインストールしたフォルダ内にあります。

C:\Program Files\Salesforce CLI\client\node_modules\@salesforce\templates\lib\templates\project\sfdx-project.json

sfdx-project.jsonファイルを開いて、URLを書き換えて保存します。

https://test.salesforce.comの場合、sfdcLoginUrlの箇所を"sfdcLoginUrl": ""とする。

 

手順⑪コマンドプロンプトを起動して以下のコマンドを実行し、接続アプリケーションのクライアント ID (コンシューマ鍵)、非公開鍵ファイル (server.key) へのパス、および JWT 認証ユーザ名を指定します。

>sfdx auth:jwt:grant --clientid (手順④でコピーしておいたコンシューマ鍵を指定) --jwtkeyfile (server.keyをフルパスで指定) --username (SalesforceへのログインユーザIDを指定) --setdefaultdevhubusername --setalias (エイリアス名を指定)my-hub-org

実行例:

 command
>sfdx auth:jwt:grant --clientid 3MVG95mg0lk4batiP7Q5f8gZVROjIpEdZT --jwtkeyfile C:\Users\e\dev\jdoe\JWT\server.key --username cclt.sfdc@mail.com --setdefaultdevhubusername --setalias my-hub-org

--setdefaultdevhubusername パラメータを指定するとDev Hub 組織を認証するときにデフォルトに設定されます。

サーバキーの暗号化

続いては、server.keyファイルの暗号化を実施します。※鍵と初期化ベクトル (iv) を生成して server.key ファイルを暗号化する。

CircleCI 側では、ここで利用する鍵と vi を使ってビルド環境でサーバキーの復号化を行います。

手順①コマンドプロンプトを起動して、server.keyファイルを生成したフォルダへ移動します。

 command
>cd \server.keyファイルがあるディレクトリのフルパスを指定

手順②以下のコマンドを実行します。※<passphrase> は、一意の鍵を作成するためのフレーズを指定します。

 command
> openssl enc -aes-256-cbc -k <passphrase> -P -md sha1 -nosalt

実行すると生成された鍵(key)とivベクトルが表示されるので、テキストに張り付けて保存しておきます。

 command
C:\Users\e\dev\jdoe\JWT>openssl enc -aes-256-cbc -k <password> -P -md sha1 -nosalt
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
key=6431BAAE651D440343874873ADE64EB02B5311DAAF550BDD67A8C9892...
iv =3F8DB47ADD8BF92D751EE0B2BEF...

手順③上記手順②で生成されたkeyとivを使ってserver.keyファイルを暗号化します。

コマンドプロンプトで以下のコマンドを実行します。※フォルダは上記鍵を生成したところで実行すること。

>openssl enc -nosalt -aes-256-cbc -in server.key -out server.key.enc -base64 -K <key> -iv <iv>

<key>は、手順②で生成してkeyを指定し、<iv>は、手順②で生成したivを指定

実行例

 command
C:\Users\e\dev\jdoe\JWT>openssl enc -nosalt -aes-256-cbc -in server.key -out server.key.enc -base64 -K 6431BAAE651D440343874873ADE64EB02B5311DAAF550BDD67A8C9892... -iv 3F8DB47ADD8BF92D751EE0B2BEF...

まとめ

今回の記事では、JWTベースフローを使用した組織の認証で、非公開鍵と自己署名デジタル証明書の作成からサーバーキーの暗号化までの手順について説明しました。

次回は、CircleCI を DevHub に接続から最後のCircleci での自動ビルドまで説明していきます。もう一息ですね。

チロ
ブログランキングに参加しましたので、ご支援していただけると幸いです。

にほんブログ村 IT技術ブログへ
にほんブログ村

-運用, 開発
-, , , , , ,