macOS sierraのSSHの問題を解消する

# 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`すると、それぞれのオプションは

```text
-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](https://github.com/net-ssh/net-ssh/pull/470)という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
```




[^1]: [macOS Sierra 10.12 SSH Keys – testequals](http://testequals.com/2016/09/09/macos-sierra-10-12-ssh-keys/)
[^2]: [difficulties with ssh-agent in macOS Sierra : osx](https://www.reddit.com/r/osx/comments/52zn5r/difficulties_with_sshagent_in_macos_sierra/)
[^3]: [Apple、macOS SierraでOpenSSH v7を採用。いくつかのレガシーな暗号が無効に。 | AAPL Ch.](http://applech2.com/archives/20160816-macos-sierra-open-ssh-v7.html)
[^4]: [OpenSSH: Legacy Options](http://www.openssh.com/legacy.html)
[^5]: [web hosting - Unable to negotiate with XX.XXX.XX.XX: no matching host key type found. Their offer: ssh-dss - Stack Overflow](http://stackoverflow.com/questions/34208495/unable-to-negotiate-with-xx-xxx-xx-xx-no-matching-host-key-type-found-their-of)