Windows11からUbuntu22.04(Esxi)へssh接続(公開鍵認証方式)

# 概要
WindowsからUbuntuへ公開鍵認証方式でssh接続する方法をメモとして残しておきます。
また、Vscodeを使ったsshについても記載します。

# 環境
以下の環境で接続を行います。
また、ubuntu側はaptを使います。本環境では、proxyがあるのでそちらの設定も記載していきます。
必要のない方はproxyの設定を飛ばしてください。

![aaa.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115813/b01e7178-0632-2938-4767-50d32e881f49.png)

# それぞれのやることリスト
## Windows側
+ 公開鍵と秘密鍵の生成


## Ubuntu側
+ open-sshのインストール

# 手順
Ubnutu側は作成したばかりであったため、proxyの設定から説明していきます。
この動作が不要な場合は飛ばしていただいて構いません。
また、設定はWindowsとUbuntuを行き来するため、手順の先頭にWindows、Ubuntuと明示は行います。
また、ユーザ名とIPアドレスはそれぞれの環境で置換してください。

## Ubuntu: proxyの設定(必要な人のみ)とSSHサーバのインストール
1. proxyの設定
    ```bash
    cd etc/apt
    sudo vi apt.conf
    ```
    ```apt.confの中身 
    Acquire::http::proxy “http://proxy_server_name:3128/”;
    Acquire::https::proxy “http://proxy_server_name:3128/”;
    ```
    :::note warn
    注意
    apt.confの後ろの「;」を忘れない
    

2. aptのアップデート
    ```bash
    sudo apt update
    sudo apt upgrade
    ```
3. SSHサーバ(openssh)のインストール
    ```bash
    sudo apt install -y openssh-server
    systemctl status ssh
    ```
    :::note info
    systemctl status sshは、sshサーバが正常に動作しているかを確認しています。緑色の丸かactive(running)が出ていたら正常に動作しています。

**ここで一旦Windows側に戻ります。**
## windows: 疎通確認とsshキー(公開鍵&秘密鍵)の生成

1. パスワード認証でsshができるかを確認
    ```bash
    ssh ubuntu@172.21.34.yyy
    ```
    :::note info
    sshができたらおそらくターミナルの先頭が
    PS C:\Users\ユーザネーム> から Ubuntuのユーザネーム@hostネームになります。
    **その後、exitと入力しwindowsに戻ってください。**

2. sshキーを作成します
    + もし、/Users/自分の名前/に.sshディレクトリが**ない**場合の手順
        ```bash
        mkdir .ssh
        cd .ssh
        ssh-keygen.exe -q -t ed25519 -C "" -N "" -f id_rsa
        ```
    + /Users/自分の名前/に.sshディレクトリが**ある**場合の手順
        ```bash
        cd .ssh
        ssh-keygen.exe -q -t ed25519 -C "" -N "" -f id_rsa
        ```

        :::note info
        ここまで出来たらlsで鍵が生成されているかを確認してください。
        + id_rsa: 秘密鍵(絶対に誰にも渡してはいきません)
        + id_rsa.pub: 公開鍵(渡しても問題なし)

3. 公開鍵(id_rsa.pub)をUbuntu側に送信
    ```bash
    scp ./id_rsa.pub ubuntu@172.21.34.yyy:~/
    ```
**ここでUbuntu側に戻ります**

## Ubuntu: sshサーバの公開鍵認証方式を許可する
1. 公開鍵が送信されたかを確認
   ```bash
    ls
    ```
    :::note info
    ホームディレクトかを確認してください。
    lsを実行すると、確かにid_rsa.pubがあることを確認

2. 公開鍵の設定
    + もし、ls -a を実行時に.sshディレクトリが**ない**場合の手順
        ```bash
        mkdir .ssh
        chmode 700 .ssh
        cp id_rsa.pub ./.ssh/authorized_keys
        cd .ssh/
        chmod 600 authorized_keys
        ```
    + .sshディレクトリが**ある**場合の手順
        ```bash
        chmode 700 .ssh
        cp id_rsa.pub ./.ssh/authorized_keys
        cd .ssh/
        chmod 600 authorized_keys
        ```

    :::note warn
    このときauthrorized_keysのsをつけ忘れた場合、正常に動作しないことを確認していますので、気を付けてください。

3. ssh-configの設定

   ```bash
    sudo vi /etc/ssh/sshd_config
    ```
    ```変更する内容
    # PubkeyAuthentication no → PubkeyAuthentication yes
    # PasswordAuthentication yes → PasswordAuthentication no
    ```
    :::note warn
    vi /etc/ssh/sshd_configを実行した際に何も記載がないファイルが生成された場合は、ホームディレクトリに戻ってください

4. sshサーバの再起動

   ```bash
    systemctl restart ssh
    ```

**ここでwindowsに戻ります。**

## Windows: 公開鍵認証方式でsshができるかを確認
```bash
ssh ubunutu@172.21.34.yyy
```
これで公開鍵認証で接続ができると思います。

# 番外編: Vscodeでのssh
VscodeのRemote-sshを使ってsshを行うと、サーバに接続できずリトライエラーになるときがあるそうです。
解決策としては、Remote-sshのバージョンが**v0.108.0**になっているかを確認してください。
人によっては一つ上のバージョン(Pre-Release)がインストールされており、正常に動作しない時があるそうです。

1. Remote-sshのインストール(このときバージョンがv0.108.0か確認)
    1. Extensions(左側にある4つの正方形 or Ctrl + Shift + X)に移動
    1. remoteと打ち、Remote- SSHをインストール
        ![スクリーンショット 2024-04-18 205518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115813/3da9f7a0-ca4e-b4fa-59d3-fc27e7eeaf87.png)

    :::note warn
    すでにインストールしている場合はUninstallの隣にある↓を押すとInstall Another Versionが出るのでインストールしなおしてください。


2. sshを行っていく
    1. パソコンマークを押し、上のほうに出てくるSelect SSH configuration file to update を、C:\Users\自分の名前\.ssh\configを選択する。
    ![スクリーンショット 2024-04-18 210207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115813/e0f19e25-6a57-6eb5-f54d-9d941d5a5466.png)
    1. configファイルの設定を行う

        ```config:config
        Host わかりやすい名前(xxx_ubuntuなど)
            HostName 172.21.34.yyy
            User   ubuntu(ubuntu側のユーザネーム)
            Port   22
            IdentitiesOnly yes
            TCPKeepAlive yes
            IdentityFile  /Users/自分の名前/.ssh/id_rsa
        ```
    1. 左下の><をクリックし、Connect to Hostを押す。
    1. Select configured SSH host or enter@hostを押すと、Hostで設定した名前が出てくるので、クリック。
    1. 新しい画面が出ると思います。その後、上にLinux/Windows/Macと選択できると思います。Linuxを選択します。
    1. 接続完了
    
    :::note warn
    これでできない場合は、別の原因があるかもしれません。
    vscodeのproxy設定などなど。参考になりそうな記事を下に記載しておきます。
    
https://qiita.com/siruku6/items/f1a0846c32647728193b
    

# おわりに
意外と設定に時間がかかったのと、Vscodeの設定に時間を取られたので同じ悩みを持っている人の助けになれば幸いです。
バージョンを見ることは大切ですね。
間違い等がございましたら、コメント等でお知らせください。
最後まで、閲覧していただきありがとうございました。

# 参考文献
+ @ssc-wkani(可兒 航)."WindowsマシンとVirtualBox(Ubuntu)で公開鍵認証のssh接続を勉強してみた". 2023-01, https://qiita.com/ssc-wkani/items/a5aa189aa2bcf2590252, (参照 2024-04-18).
+ @overflowfl."ssh-keygenを用いて秘密鍵と公開鍵を作る（Windows10とLinuxの違い）". 2022-04, https://qiita.com/overflowfl/items/14a2486df85fd7efac85, (参照 2024-04-18).
+ ぼん."公開鍵認証を用いてVSCodeの「Remote - SSH」を使う". 2022-05, https://zenn.dev/bon/articles/vscode-remote-ssh, (参照 2024-04-18).
+ @toim(TO im)."VSCodeからSSH接続できなくなった対処(2024年1月アップデートの変更)". 2022-02, https://qiita.com/toim/items/6f2d03fc14710fc4e5d8, (参照 2024-04-18).