travisコマンドをインストールせずに.travis.ymlの暗号化を行う

Travis CIの設定ファイルである`.travis.yml`に秘密の情報を書きたい場合に、公開鍵暗号を用いた暗号化を行うことができます。

たとえば、環境変数定義を下記のように暗号化して記述することができます。これは`FOO=barbaz`と書いてあるのと同じ意味になっています。

```yaml:.travis.yml
env:
  global:
    - USER=hnw
    - secret: "eQ38gD7kK3p41eZX1ugM/y2+z2mJhkAN7/YmZ2R2ioQKxUjskrMNSXht3DMy2IfA3sPFpW/kIjGRXaV86GaOu8yjcV+M+7CaWIpejJlakGzPU4PUSY1G3Q2fKpBGKTGwjR9McBlL5E4y5CA0NY5qzlatVKncQgneLqiBZ64bveFDunQaIh1Vu+KmAvWdxxEW691Zb1SmfFRBDPSJJ7/+P3hcB0Y3HBZPY/jH8a6Ixfz/KKnMXZ66D0Y3qlO0/kvUk0BU61+h8FkB2nVA/uPjbdosr6GlGRl6qO4mF5EqP/iG/yzgW5FE0oY2QOQlyNlWvpdJJT3FHQ90jHm9FEcArD3IoP/zUFa9fFcHs8hmYBNAylPcuaDMGGmH677T/WbyeG/b9SksukJN9/KDU+RSzdpgJJeDOFqeB7bnfvQF+E5cjEe/fnquDLM2Fd648LDUZ5GmcOqeyVsHDy50X8LuGgvqXJE5oKi2xLlooUCp0TjPgRT8VOI6sTST0EL5TJKuQfW82uUttQnu0TptYjvAOUmQoZ6QHnmUh0ZSt7wd1cMbkN34JlVsCfT8FDQ93ImztCS9U+wYoWLGesYKyQwTCSxM1LJa0p5huwB4y7YkvXD8xrPU7kJI/d0t8JtFm0kE0UPucFv8jcPlWJVabhzyMaEnmdz3Mi6l6MLojghctIs="
```


Travis CIではリポジトリごとにRSA鍵ペアが生成されています。この鍵ペアの公開鍵は全世界に公開されていますが、秘密鍵はTravis CIだけが持っています。つまり、公開鍵で暗号化した文字列は暗号化したリポジトリのオーナーでさえ復号できず、Travis CIだけが復号できるような仕組みになっています。このように暗号化した文字列を`.travis.yml`で利用することで、他人に見せたくないパスワードやメールアドレスを安全に`.travis.yml`上に記述できるというわけです。

この暗号化を利用する場合、`gem install travis`で`travis`コマンドをインストールするのが普通です。しかし、滅多に使わないコマンドをこのためだけにインストールするのが気に入らなかったので、`curl`コマンドと`openssl`コマンドだけで同じ暗号化を実現してみました。

# 公開鍵の取得

リポジトリに紐付く公開鍵は下記のようにすれば取得できます。URL中の`hnw/emacs`というのが`ユーザー名/リポジトリ名`になっています。

```
$ curl -s https://api.travis-ci.org/repos/hnw/emacs/key | jq -r '.key'
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArU+hANEw7cGJHfldFKCS
vJ3pThisbfUx1JxWsOpAavBeDrCPpZT7GO5EuU4PaRNwiB1MMjVFPmKEyQdXtbAi
rGJUjifPfOZugrjjC/kTKXdKpBKsQCB+KwHbaBOQ/iMV/NEZ4AuquEUJWUAbBaQ6
8QfcOl2FWFopVVfneAUY9rlkwDN83NvRuQ5rugUU1XxYKeV2+QvzzTHyGmEsUj5G
cX518ojXfxcgrzgug7SBiFGbYfz5BLFqiyiP61eBFKGQizA+EODRMhV8f56Xm7TO
C3bpU0sRvTcw4DkMCwJZ5MKGltzP6BKvEbf4GUHMXF8FY7NifwLiHDcPvups/SzB
bQfB2x0LZ7vBXQUUS2Bqyo3mmmf/5VjMwUPnHy+nspDKSm8xFSrNQiRfRjv30OWT
VPMuu2iLN4ZA7FGRLnB1IJadWizhzG9oDgjWTdrbnSjowD+/zPBEEP/e8PSY4k1b
3rg8KWPL3M1kVYnhQhwbybcNVpnTnK/9WdXiRVFDypDmC5+nAs0AzhUN+j1ramhX
K34aOFy879BpBOXmvTCn/mPKo4UrkhxZ27WlLZi0vryJOwQMSZYx+EHUaM7XyQ63
KHpLK3ZYTN6T8r+gpt6yHXFdPxoszXLccMop5cXMZDPfw6IZy1FUaZ75NAB7u+Gt
Vt4xQykMj2olWv5biH7VYXECAwEAAQ==
-----END PUBLIC KEY-----
$
```

古いリポジトリの鍵ペアは1024bit RSA鍵、最近の鍵ペアは4096bit RSA鍵のようです。

# 暗号化

先ほど取得した公開鍵を`public-key.pem`として保存した上で下記のように`openssl`コマンドを起動します。

```
$ echo -n 'FOO=barbaz' | openssl rsautl -encrypt -pubin -inkey public-key.pem | base64
eQ38gD7kK3p41eZX1ugM/y2+z2mJhkAN7/YmZ2R2ioQKxUjskrMNSXht3DMy2IfA3sPFpW/kIjGRXaV86GaOu8yjcV+M+7CaWIpejJlakGzPU4PUSY1G3Q2fKpBGKTGwjR9McBlL5E4y5CA0NY5qzlatVKncQgneLqiBZ64bveFDunQaIh1Vu+KmAvWdxxEW691Zb1SmfFRBDPSJJ7/+P3hcB0Y3HBZPY/jH8a6Ixfz/KKnMXZ66D0Y3qlO0/kvUk0BU61+h8FkB2nVA/uPjbdosr6GlGRl6qO4mF5EqP/iG/yzgW5FE0oY2QOQlyNlWvpdJJT3FHQ90jHm9FEcArD3IoP/zUFa9fFcHs8hmYBNAylPcuaDMGGmH677T/WbyeG/b9SksukJN9/KDU+RSzdpgJJeDOFqeB7bnfvQF+E5cjEe/fnquDLM2Fd648LDUZ5GmcOqeyVsHDy50X8LuGgvqXJE5oKi2xLlooUCp0TjPgRT8VOI6sTST0EL5TJKuQfW82uUttQnu0TptYjvAOUmQoZ6QHnmUh0ZSt7wd1cMbkN34JlVsCfT8FDQ93ImztCS9U+wYoWLGesYKyQwTCSxM1LJa0p5huwB4y7YkvXD8xrPU7kJI/d0t8JtFm0kE0UPucFv8jcPlWJVabhzyMaEnmdz3Mi6l6MLojghctIs=
```

この文字列を`.travis.yml`中に`secure:"eQ38gD7k..."`のように書けば、元の平文を書いたのと同じように扱われます。


# 参考URL

- https://docs.travis-ci.com/user/encryption-keys/
- https://docs.travis-ci.com/api#repository-keys