sshにて鍵を作る際にpassphaseを設定する方も多いと思います.
$ ssh-keygen -yf ~/.ssh/himitsukagi
とすると公開鍵を取得するためにpassphaseを要求されます.
しかし,catで直接
$ cat himitsukagi.pub
とすると,passphaseを要求されることなく公開鍵を入手できます.
正直これが公開鍵であるため入手されても問題ないと思うのと同時に,catで簡単に突破されてしまう気がするのですがSSHのパスフレーズはどのような場面で有効になるのでしょうか.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
$ ssh-keygen -yf ~/.ssh/himitsukagi
とすると公開鍵を取得するためにpassphaseを要求されます.
これは「昔はパスフレーズが必要だった為、その頃の作りを引きずっている」というのが答になると思います。
OpenSSHで主に使われる秘密鍵は
- PEM形式
- OpenSSH形式
の二種類が有ります。
まずPEM形式ですが、OpenSSHでは比較的昔のバージョンで使われていた形式です。
この形式では鍵全体が暗号化されています。公開鍵を取り出す時はいったん復号する必要が有る為、パスフレーズが必要になります。
ただ、公開鍵を取り出す時に毎回パスフレーズが必要になるのは不便なので、秘密鍵とは別のファイルに暗号化されていない状態で公開鍵を保存しておき、公開鍵だけが必要な時はそのファイルから読み込むようになりました。これがid_rsa.pub等の公開鍵ファイルです。
次にOpenSSH形式ですが、これは比較的新しいバージョンのOpenSSHで利用されている秘密鍵ファイルです。
この形式はPEM形式に比べて色々と改良されているのですが、その改良点の一つに「公開鍵部分は暗号化せずに平文のまま保存する」というのが有ります。
なのでOpenSSH形式の秘密鍵から公開鍵を取り出す時はパスフレーズは必要無いのですが、ssh-keygenコマンドはPEM形式しか無かった頃の作りをひきずっていて、「とりあえずパスフレーズを入力させて、秘密鍵ファイルがOpenSSH形式だった場合はパスフレーズを使わない」という動作になっています。
ただ、sshコマンドも昔は同様に秘密鍵ファイルから公開鍵を取り出す時にパスフレーズを要求していたのですが、最近のバージョンではOpenSSH形式の場合はパスフレーズ無しで取り出すように変わったので、ssh-keygenコマンドでも将来的にはパスフレーズが必要なくなるかもしれません。
おまけ
OpenSSH形式の秘密鍵ファイルからパスフレーズ無しで公開鍵を取り出すrubyスクリプトです。
別用途で作ったスクリプトを利用してでっち上げたので、エラー処理等はいい加減です。
出力にコメント部分が無いのは、コメントは暗号化されていてパスフレーズ無しでは読めないからです。
……もしかしてssh-keygen -y
でパスフレーズが必要なのはこのコメントの扱いの問題なのかも。
ruby
1class String 2 def get_uint32! 3 self.slice!(0,4).unpack1("N") 4 end 5 6 def get_string! 7 len = get_uint32! 8 self.slice!(0, len) 9 end 10 11 def get_mpint! 12 len = get_uint32! 13 self.slice!(0, len).unpack("C*").inject do |r, v| (r << 8) + v end 14 end 15end 16 17KEY_START = "-----BEGIN OPENSSH PRIVATE KEY-----" 18KEY_END = "-----END OPENSSH PRIVATE KEY-----" 19AUTH_MAGIC = "openssh-key-v1\0" 20 21b64key = "" 22state = :init 23 24while gets 25 if $_.chomp == KEY_START 26 state = :key_start 27 break 28 end 29end 30 31if state != :key_start 32 STDERR.puts "No begin line" 33 exit 1 34end 35 36while gets 37 $_.chomp! 38 if $_ == KEY_END 39 state = :key_end 40 break 41 end 42 43 b64key << $_ 44end 45 46if state != :key_end 47 STDERR.puts "No end line" 48end 49 50data = b64key.unpack1("m") 51 52if data.slice!(0, AUTH_MAGIC.size) != AUTH_MAGIC 53 STDERR.puts "Invalid key data" 54 exit 1 55end 56 57cipher = data.get_string! 58kdfname = data.get_string! 59kdfopt = data.get_string! 60 61numofkeys = data.get_uint32! 62 63STDERR.puts "keys: #{numofkeys}" 64 65numofkeys.times do |i| 66 pubkey = data.get_string! 67 keytype = pubkey.dup.get_string! 68 puts "#{keytype} #{[pubkey].pack("m").gsub(/\n/, "")} " 69end
投稿2021/04/15 16:37
総合スコア947
0
SSHのパスフレーズはどのような場面で有効になるのでしょうか.
パスフレーズは「秘密鍵」の保護用です。公開鍵には無関係です。
$ ssh-keygen -yf ~/.ssh/himitsukagi
とすると公開鍵を取得するためにpassphaseを要求されます.
本来、鍵生成時に秘密鍵ファイル(公開鍵情報も同梱)・公開鍵ファイルはペアで作られて「作成者は両方所有して使うもの」です。なので、ssh-keygen -y でパスフレーズが必要なことはあまり考えてもしようがないです。
※今後は -y の時のパスフレーズは不要になるかも知れませんが ( フォーマット的にはそうなってきているため )
投稿2021/04/15 03:57
総合スコア1681
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
公開鍵は、「これが公開鍵であるため入手されても問題ない」という認識で良いと思います。
SSHのパスフレーズはどのような場面で有効になるのでしょうか.
鍵ペアをパスフレーズを指定して作成した場合、秘密鍵は暗号化されて保存されます。
パスフレーズを指定しても公開鍵のほうは暗号化されずに保存されます。
パスフレーズは、秘密鍵の復号化をするために必要になります。
投稿2021/04/15 03:53
編集2021/04/15 04:05総合スコア1248
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。