SSH 鍵の新規作成

新規に SSH 鍵を作成したので、メモ。

上記最後の IPA の PDF の p.14-15 の表をみると、米国 NIST では 2031 年以降は、3072bit 以上の RSA か、 256bit 以上の ECDSA か、どちらかしか推奨しないらしい。

2017/Jan/22 時点での GitHub のオススメは RSA 4096bit のようです。
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/

古いプログラムとの互換性とか考えなければ ed25519 が安心で高速で最強らしい。

鍵の生成

とりあえず鍵はひととおり作っておく:

$ ssh-keygen -o -a 100 -t rsa -b 4096 -C 'hoge@example.com'
$ ssh-keygen -o -a 100 -t ecdsa -b 521 -C 'hoge@example.com'
$ ssh-keygen -o -a 100 -t ed25519 -C 'hoge@example.com'
$ chmod 400 ~/.ssh/id_*
$ chmod 444 ~/.ssh/id_*.pub
$ ssh -V > ~/.ssh/memo.txt 2>&1
$ uname -a >> ~/.ssh/memo.txt
$ \grep '^VERSION=' /etc/os-release >> ~/.ssh/memo.txt
$ date >> ~/.ssh/memo.txt
$ chmod 400 ~/.ssh/memo.txt

ちなみに、ed25519 の場合は -b オプションは無視されます(man ssh-keygen 参照)。実際に生成された鍵を確認すると 256bit 固定のようです。

秘密鍵ファイルが漏れたときの保険として、round 回数 100 にしました。これで、実際に秘密鍵ファイルを解読するときは1秒くらい待たされます。

あとは相手の ~/.ssh/authorized_keys に自分の id_ed25519.pub の中身(1行だけ)を追加すれば OK です。

なお、ローカルに複数の鍵ファイルがある場合、基本的には SSH クライアントは自動選択してくれるらしいですが、もしダメなときは ed25519 を指定できるみたいです:

$ echo 'IdentityFile ~/.ssh/id_ed25519' >> ~/.ssh/config

もし本当に「ed25519 以外は使わない」としたい場合:

$ echo 'IdentitiesOnly yes' >> ~/.ssh/config

詳しくは man ssh_config 参照。

ちなみに、GitHub に対して git コマンドを試すと、自動選択してくれました。

今の SSH 鍵の確認

$ \ls ~/.ssh/id_*.pub | xargs -n 1 ssh-keygen -l -f

行の先頭が鍵のビット長、行の最後がアルゴリズム名です。

GitHub 疎通確認

https://help.github.com/articles/testing-your-ssh-connection/

$ ssh -T -p 22 -i ~/.ssh/id_ed25519 git@github.com
Enter passphrase for key '/home/hoge/.ssh/id_ed25519':
Hi seaoak! You've successfully authenticated, but GitHub does not provide shell access.
$

追記) Windows の Sshfs Manager (ver 1.5.12.8) は、新しい秘密鍵ファイル形式に対応していませんでした。残念。

追記) WinSCP (ver 5.9.3) は OpenSSH の新しいファイル形式に対応していませんでした。使おうとすると PuTTY 形式 (.ppk) に変換しようとしてしまいます。なので、ed25519 が使えるかどうかは未確認。

Ruby めも

(updated: 2017-Jan-18)

Web サーバ H2O の設定には mruby を使うので、 H2O の設定ファイル h2o.conf を生成する自前の YAML トランスレータ(?)も Ruby で書いてみることにしました。 Ruby 書くのなんて何年ぶりだろう・・・・。

で、ハマったのが、String#match の挙動です。Regexp#match と同じハズ。
https://docs.ruby-lang.org/ja/2.4.0/class/String.html#I_MATCH
https://docs.ruby-lang.org/ja/2.4.0/method/Regexp/i/match.html

第2引数として pos が渡せるのですが、pos0 以外の値を渡した場合、「文字列先頭にマッチする正規表現」(つまり ^\A)は絶対にマッチしません

$ ruby -e 'p "abc".match(/^./, 1)'
nil
$

ドキュメントに書いておいてほしかったなぁ。