データローダのコマンドライン実行しようとして暗号鍵の生成に初心者が苦労した話

どうも半熟Developer:hatching_chick:です、こんにちは。
お役立ち情報は少なめの`失敗談日記`です。

　:triangular_flag_on_post:結論だけ知りたい方は「まとめ」へどうぞ


今回詰まったのは、コレ。
>　データローダのコマンドラインの概要
>　https://help.salesforce.com/articleView?id=command_line_intro.htm&type=5

データローダをコマンドで呼び出す方法・・・のなかの
とくに暗号鍵の生成！
この手の生成手順に慣れてる方ならなんてことないんですかねー？

しかし、初めてとは言わないものの、片手で数えるほどの経験値では
とっても路頭に迷った気分でしたよ。とほほ。
というわけで、ヘルプに記載がない部分を補えたら～
そして困っているだれかの助けになれば幸いです…

##そもそものヘルプ記載手順
>　次のコマンドを入力して、暗号化鍵ファイルを作成します。[path to key file] を鍵ファイルのパスに置き換えます。
>　`encrypt.bat —k [path to key file]`

ここで生成したものを
> 生成された暗号化パスワードをコピーします。後続のステップで、この値を使用します。

後続のステップとはprocess-conf.xmlを編集するステップのことね。
> sfdc.password: ステップ 2 で作成した、暗号化パスワードの値を入力します。

というわけで、**素直な心**で読んだら、
　１．コマンド叩く
　２．keyファイル開く
　３．中身をprocess-conf.xmlに貼る

という3ステップで終わってしまう。
もちろん、うまく動かない・・・！

##ヘルプ通りにやると・・・##

まず、指定のコマンドで生成された中身はこんな感じ

```dataLoader.key
遷・(ｻ・ﾝSﾛ接･
```

・・・・**不安**！

まず最初にxmlが受け付けてくれない。
Unicodeに準拠してないから読み込めません、と。
なんかオカシイから、コマンド間違ってるかしら？と
コマンドヘルプ参照。

コマンドプロンプトで`encrypt.bat`をパラメータやオプションなしで実行するとヘルプ表示してくれます。

```
Utility to encrypt a string based on a static or a provided key
Options (mutually exclusive - use one at a time):
        -e <plain text> <Path to keyfile>                Encrypt a plain text value, keyfile path
        -d <encryptText> <Path to keyfile>               Decrypt an encrypted text back to plain text value using keyfile
        -k [Path to Keyfile]                             Generate keyfile with optional keyfile path
```

これだけで意味が分かるならそれが良かったのだけーどもー。

ヘルプで言うところの`-k`オプションがkeyファイル生成なのは確か・・・。
しかし、パラメータは保存先だけなので、ランダムに鍵を作ってくれるってことー・・・？

> ちなみに昔は`-g`オプションだったらしい情報もネットには存在
> https://help.salesforce.com/articleView?id=000182363&language=ja&type=1

この当時の`<seedtext>`に当たるものは設定しなくていいのかとか
`<seedtext>`がそもそもどういう役割かをいまいちわかっていないまま、
えーこれどうすんのーとなっていた自分の未熟さもあるのですが。

とにかくここの生成した文字列をprocess-conf.xmlに設定したところでデータローダは組織に接続できないのです。
当たり前か。

えーい、~~へるぷのうそつきー！~~

##詳細な手順を探してブログを放浪。

> 【Salesforce】バッチからデータローダを使用してCSVにエクスポートする
> http://www.subnetwork.jp/blog/?p=7

少なくとも`-e`オプションでパスワードを生成してくれる！
結果がただしいかどうかは`-d`オプションで確認できるらしい・・・とまでは理解した。

ものの～・・・
これでも大分ありがたいのですが、Keyファイルの存在感を感じない・・・
こ、この子はいったい何をしてくれるん？！

そもそもヘルプが「keyファイルの値をconfigに設定」的な書き方をしてくれているので、
すっかりわたくしはkeyファイルの値とconfig設定値が一致してないといけないものと思いこんでいます。
わざわざ、keyファイルに生成された文字列書きこんじゃったよ・・・
当然復号に失敗。Javaさんが謎のPaddingエラーを吐いてくれます。
　※これはJavaの仕様によるもので暗号生成界隈では「ああ復号失敗ね」とわかるらしい

そんなこんなで、ある時なぜか唐突に怒られるのです（ほんとに同じファイル用意して同じコマンド叩いたのになぜ反応が違うんだ・・・）
「keyファイルの文字が短い」と！

```
Error setting the key from file: dataLoader.key, error: Keyfile content is too short:dataLoader.key
```
まぁコマンド同じと言いつつも、絶対パスを通したか、ファイル名だけ指名したかの違いはありますが。

なお、パス指定の問題に関連して。

鍵の場所はいくつか試したのですが、うまくいく場合とそうでない場合を自分の環境では切り分けられなかったです。
Dataloderの初期設定のほうがうまくいくかと思ったらErrorになって
bin直下に変えてみたらうまくいったけど、文言変えて再実行したら失敗したし。

NG:
`encrypt.bat -e hogehoge "C:\Program Files (x86)\salesforce.com\Data Loader\bin\dataLoader.key"`
OK：
`encrypt.bat -e hogehoge dataLoader.key`

とりま、ファイル名だけ指定のほうがちゃんと動く気配。

そんなこんなで、パスワードポリシーに合格しててなぜこっちで怒られるんだ？とようやく気が付き
なんでもいいから長い文字列をkeyファイルに突っ込んで実行。

```
encrypt.bat -e hogehoge dataLoader.key
The output string of encryption is:
66b027015cdfbbsamplec30562d91f123dsample3f15e6a577samplefff7ac4
```

できたできた。それっぽい文字列。

デコードでちゃんと設定どおりの文言にもどせたら**正解！**

```
encrypt.bat -d 66b027015cdfbbsamplec30562d91f123dsample3f15e6a577samplefff7ac4 dataloader.key
The output string of decryption is:
hogehoge
```
やっとつじつまがー！

あとは、いう通りkeyファイルのパスと生成された文字列をprocess-conf.xmlに設定して実行！
す、進んだ！！！


それから、自分の組織ではセキュリティトークンがないと怒られたので
パスワードの末尾にセキュリティトークンを追加した文字列を暗号化しなおす。

セキュリティトークン　`umUiQLISampleSamplexqn341DF`　←こんなかんじの

> セキュリティトークンのリセット
> https://help.salesforce.com/articleView?id=user_security_token.htm&type=5

トークン発行してパスワードにつけるだけ！

```
encrypt.bat -e hogehogeumUiQLISampleSamplexqn341DF dataLoader.key
```



#まとめ

１．keyファイルを作成。中には適度に長い任意の文字列を入力しておく
２．パスワード（必要ならセキュリティトークンとセットで）を設定してコマンド実行

```
encrypt.bat -e <暗号化したいパスワード> dataLoader.key
```
３．コマンドプロンプトで表示された文字列をprocess-conf.xmlに設定

設定前にコマンドの結果が正しいかはデコードして確認

```
encrypt.bat -d <生成された文字列> dataloader.key
```

これが答えでした！疲



###後日談：
有識者の方からこちらのリンクをいただきました。
おお、これが見つかっていればここまで苦労しなかったぜ…
https://help.salesforce.com/articleView?id=000182363&language=ja&type=1