SSHでパスフレーズが聞かれる問題
ssh-add -A
をしなければいけないと言う記事も見られるが、macOS 10.12.2からは、~/.ssh/config
にUseKeychain yes
を加えれば良いらしい1 2。
Host *
UseKeychain yes
$ man ssh_config
してみると、以下のように書いてある。
UseKeychain
On macOS, specifies whether the system should search for passphrases in
the user's keychain when attempting to use a particular key. When the
passphrase is provided by the user, this option also specifies whether
the passphrase should be stored into the keychain once it has been
verified to be correct. The argument must be ``yes'' or ``no''.
The default is ``no''.
要するに、UseKeychain yes
にするとkeychainからパスフレーズを探したり、保存したりするようになる。
agent fowardingが必要な場合は、AddKeysToAgent yes
も必要。
Host *
UseKeychain yes
ForwardAgent yes
AddKeysToAgent yes
manには
AddKeysToAgent
Specifies whether keys should be automatically added to a running
ssh-agent(1). If this option is set to ``yes'' and a key is loaded from
a file, the key and its passphrase are added to the agent with the
default lifetime, as if by ssh-add(1). If this option is set to
``ask'', ssh will require confirmation using the SSH_ASKPASS program
before adding a key (see ssh-add(1) for details). If this option is set
to ``confirm'', each use of the key must be confirmed, as if the -c
option was specified to ssh-add(1). If this option is set to ``no'', no
keys are added to the agent. The argument must be ``yes'', ``confirm'',
``ask'', or ``no''. The default is ``no''.
と書いてあり、ssh-agentに自動的に鍵が追加される。
もしも、~/.ssh/config
の設定を見ないプログラムがある場合は、ssh-add -A
やssh-add -K
を自分でやる必要があるかもしれない。
$ man ssh-add
すると、それぞれのオプションは
-K When adding identities, each passphrase will also be stored in
the user's keychain. When removing identities with -d, each
passphrase will be removed from it.
-A Add identities to the agent using any passphrase stored in
the user's keychain.
と書いてあり、-K
オプションで、鍵がkeychainに保存され、-A
でkeychainから鍵がagentに追加される。
SSHでレガシーな暗号が無効になった問題
macOS SierraでOpenSSH v7が採用されたため、レガシーな暗号が無効になった3 4。
例えば
Unable to negotiate with XX.XXX.XX.XX: no matching host key type found. Their offer: ssh-dss
というエラーが出た場合は
Host your-remote-host
HostkeyAlgorithms +ssh-dss
してやると解消される5(アルゴリズムの変更ができる場合はそちらを変更したほうがいいとは思う)。
ただし、これをしても、RubyのNet::SSHで
Net::SSH::Exception: could not settle on host_key algorithm
がでるかもしれない。これは古いNet::SSHが+を使った表記に対応していないためだ。
Correctly parse '+' in config files by clupprich · Pull Request #470 · net-ssh/net-sshというPRで修正されたので、
$ gem update net-ssh
でアップデートするか、古いNet::SSHを使う場合はHostkeyAlgorithms
に使いたい全てのアルゴリズムを書いてやる必要がある。
デフォルトのアルゴリズムは$ man ssh_confg
で確認できる。
HostKeyAlgorithms
Specifies the host key algorithms that the client wants to use in
order of preference. Alternately if the specified value begins
with a `+' character, then the specified key types will be
appended to the default set instead of replacing them. The
default for this option is:
ecdsa-sha2-nistp256-cert-v01@openssh.com,
ecdsa-sha2-nistp384-cert-v01@openssh.com,
ecdsa-sha2-nistp521-cert-v01@openssh.com,
ssh-ed25519-cert-v01@openssh.com,
ssh-rsa-cert-v01@openssh.com,
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,
ssh-ed25519,ssh-rsa
If hostkeys are known for the destination host then this default
is modified to prefer their algorithms.
The list of available key types may also be obtained using the -Q
option of ssh(1) with an argument of ``key''.
これらにアルゴリズムにssh-dssを加えて、HostkeyAlgorithms
を設定すると良い。
Host your-remote-host
HostkeyAlgorithms ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa,ssh-dss