Windows の SSH クライアント(PuTTY, RLogin など)で作成した公開鍵で Linux にアクセスするには

こんにちは。エクセルソフトの田淵です。

Windows クライアントから Linux サーバーに対して SSH の公開鍵認証でアクセスする必要がありまして、今はどうなってるのかな?と思って調べていました。インターネットの記事に騙された(よく読んでいないだけかもしれないw)ので、備忘録として残しておきます。

いくつかご指摘を頂き、クリアになった部分がありますので、2019/7/26 に追記しました。

時間がない人のための結論(2019/7/26 追記)

PuTTY や RLogin では、鍵を作成した後で表示される公開鍵をコピーして、ssh でログインしているサーバーの ~/.ssh/authorized_keys を手動で書き換えます。OpenSSH2 のフォーマット以外で表示、保存される場合は、以下の結論2 の方法を行ってください。

時間がない人のための結論2(当初の結論)

大体の Linux や Mac での SSH 接続の記事に書いてある公開鍵の追加の仕方、cat id_rsa >> authorized_keys は、Windows で作った公開鍵に対して利用すると、公開鍵のファイルフォーマットが作成したツールによって異なるので、正しいキーのフォーマットで追加してくれないかもしれません。

cat ではなく

$ ssh-keygen -i -f id_rsa >> ~/.ssh/authorized_keys

を使いましょう。どんな形式の公開鍵ファイルからでも、正しいフォーマットで authorized_keys に追加してくれます。

環境

  • アクセス先サーバー:Ubuntu 18.04.2 LTS
  • アクセス元クライアント:Windows 10 1809(今更ながら、1903 で WSL2 を使っていればこんなに苦労しなかったな…w)
    • PuTTY 0.72
    • RLogin 2.24.2

以後、アクセス先の Linux サーバーを「サーバー」、アクセス元の Windows クライアントを「クライアント」と記載します。

前提として、公開鍵の何たるか?などは触れませんが、「サーバーに公開鍵が必要」と書いてあるのでサーバーなのに公開鍵?となんだか不思議な気持ちになっていたのは内緒にしておいてくださいw

SSH 公開鍵認証に必要なファイルやキーの作成方法

2つの方法があります。

  1. クライアントで秘密鍵、公開鍵ペアを作成し、公開鍵をサーバーに送る。
  2. サーバーで秘密鍵、公開鍵ペアを作成し、秘密鍵をクライアントに送る。

多いのはクライアント側で鍵ペアを作ることだと思います。ここでは 1. の方法をご紹介します。

Windows の PuTTYgen

現在のおすすめは Ed25519 という暗号化方式のようです。今回はサポートされている環境が多い rsa 2048bit で鍵のペアを作ります。

詳しいやり方は以下を参考にしてください。

PuTTYgenで公開鍵/秘密鍵を作成する - WinSCP Wiki - WinSCP - OSDN

ここで保存できるファイルを例えば以下の名前で保存します。id_rsa_<USERNAME> などのように区別しやすくしておくのも良いかもしれません。

  • PuTTY 用の秘密鍵:id_rsa.ppk
  • 公開鍵:id_rsa.pub

また、ppk は OpenSSH2 用の秘密鍵ではないので、メニューの「Conversion>Export OpenSSH Key」から OpenSSH2 用の秘密鍵をエクスポートしておきます。

  • OpenSSH2 用の秘密鍵:id_rsa

RLogin

私が普段使っている SSH クライアントです。タブで複数接続できてとても使いやすいです。

先にサーバーにパスワードログインで接続してから秘密鍵、公開鍵ペアを作成するダイアログを出す必要があります。

ログイン後、メニューの「表示>オプション設定」から以下のダイアログを表示し、「サーバー>プロトコル」の「認証キー」ボタンをクリックします。

適切に設定して、「生成」ボタンをクリックすると、秘密鍵、公開鍵ペアのデータが作成されます。

秘密鍵をエクスポートする場合は、上記の「ファイル>エクスポート」をクリックし、公開鍵をエクスポートする場合は、生成された鍵を右クリックして、「公開鍵をファイルに保存」をクリックします。

ここでは先ほどの PuTTY で作った公開鍵と区別するため、

  • id_rsa_rlogin
  • id_rsa_rlogin.pub

としました。

公開鍵のサーバーへの設定方法

作成した pub ファイルを scp や sftp を使ってサーバーにアップロードします。

次のコマンドで公開鍵を追加します。

$ ssh-keygen -i -f id_rsa >> ~/.ssh/authorized_keys
$ ssh-keygen -i -f id_rsa_rlogin >> ~/.ssh/authorized_keys

一応正しく追加できているか確認してみましょう。

$ less ~/.ssh/authorized_keys

ssh-rsa ハッシュ==
ssh-rsa ハッシュ==

1行に 1キーで、暗号化方式 ハッシュ コメント のように並んでいるはずです。

次に sshd_config の設定を変更し、鍵でのログインができるようにします。

$ sudo vi /etc/ssh/sshd_config

#PubkeyAuthentication yes のコメントを削除してから、sshd をリロードします。

$ sudo systemctl reload sshd

別のセッションまたは別のクライアントでログインできるか試してみます。

接続

PuTTY からの接続

「Connection>SSH>Auth」に先ほど作成した秘密鍵を指定します。

ログイン時に公開鍵のパスフレーズを聞かれますので、入力します。

RLogin からの接続

先ほどの認証キーダイアログで、秘密鍵をインポートします。

複数インポートしても大丈夫で、どのキーをこの接続に使うか?をチェックします。

最後に

鍵でしかログインできないようにする場合は、/etc/ssh/sshd_config#PasswordAuthentication yes のコメントを外して、No にしましょう。

この設定をする時には鍵の設定などを間違えて二度とログインできなくなると困りますので、最初のセッションは開いたままにして作業を行いました。

ハマりポイントのまとめ

  • Windows と Mac/Linux では保存される公開鍵のフォーマットが違う。(なんと Linux の OpenSSH2 が標準の RFC4716 に準拠していない。とのこと。)
  • 公開鍵ファイルが OpenSSH2 用のフォーマットじゃないと ファイルを持っていくやり方で cat を使って authorized_keys に追加しても動かない。
  • .ssh ディレクトリが 700 で、authorized_keys ファイルが 600 が良い。(.ssh は 755 とかでも良いみたい?)

Mac クライアントの場合

生成や ssh-copy-id の利用方法まで全部入りの以下の記事を参考にしてください。ssh-copy-id -i <PUBLICKEY> <USERNAME@HOST> が使えるので非常に楽ですね。Linux クライアントの場合も同様です。

ssh公開鍵認証設定まとめ - Qiita

余談ですが公開鍵のフォーマット

色々なサイトで、公開鍵をサーバーにコピーして、cat id_rsa >> authorized_keys コマンドで公開鍵を登録します。って書いてあるんですけど、それじゃ動かないと思うんですよね。クライアントが Mac、Linux の場合は ssh-keygen -t rsa -b 2048 で作れば cat できるフォーマットになりますが、その記事が多かったのかな?

PuTTY と RLogin で作成した pub ファイルは以下のフォーマットになっています。クライアントによって違う位置に改行入ってるし、BEGIN なんちゃらとかあるので、そのまま cat しても動かない。ハマった。

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "256-bit ssh-ed25519, converted from RLogin by xlkk key by RLogin"
AAAAC3NzaC1lZDI1NTE5AAAAIIT1ZNEEZ/YILif5oE5QkIlE84qVGUM+IoFuc29uJaHA
---- END SSH2 PUBLIC KEY ----
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "ed25519-key-20190725 by PuTTY"
AAAAC3NzaC1lZDI1NTE5AAAAIMPeV1aq8yFJqV8sly1szbAmkF3hIYxHbgRV9Ghp
7NN6
---- END SSH2 PUBLIC KEY ----

この PuTTY の公開鍵のフォーマットが OpenSSH2 の形式と違う点についてはコメント頂いた @ttdoda さんが以前まとめておられました。

https://platform.twitter.com/widgets.js

なるほど確かに man ssh-keygen すると

     -i      This option will read an unencrypted private (or public) key file in the format specified by the -m option and print an OpenSSH
             compatible private (or public) key to stdout.  This option allows importing keys from other software, including several commer‐
             cial SSH implementations.  The default import format is “RFC4716”.
     -m key_format
             Specify a key format for the -i (import) or -e (export) conversion options.  The supported key formats are: “RFC4716” (RFC
             4716/SSH2 public or private key), “PKCS8” (PEM PKCS8 public key) or “PEM” (PEM public key).  The default conversion format is
             “RFC4716”.

って書いてありますな。勉強になった。

宣伝

エクセルソフトは開発者向けのツール/ライブラリなどを多く取り扱っています。是非 弊社の製品ページ も覗いてみてください♪

参考サイト

cat の説明ばかりだと思ったら、ちゃんと PuTTYgen で公開鍵を作ったら ssh-keygen つかって変換している… ちゃんと読んでなかっただけかも…w

RFC4716 でもちょっと調べてみました。

以上です。

タイトルとURLをコピーしました