質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

9541閲覧

【php】鍵を用いたsshの認証にて、公開鍵が必要な理由は?

mastar_3104

総合スコア38

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2017/08/02 02:32

PHPから秘密鍵認証でssh接続する必要があり、その際にssh2_connectとssh2_auth_pubkey_fileの関数を用いて接続を行いました。

関数について調べていると、ssh2_auth_pubkey_fileは認証に用いてた秘密鍵だけではなく公開鍵が必要と記載されていました。(関数名からして公開鍵なので当たり前?)

bool ssh2_auth_pubkey_file ( resource $session , string $username , string $pubkeyfile , string $privkeyfile [, string $passphrase ] )

記載されている通りに実装したので問題なく動作したのですが、ここで疑問があります。

なぜ、Teratermやsshコマンドからログインする際は秘密鍵のみでログイン可能であるのに、PHPのメソッドでは公開鍵を求めるのでしょうか?
本来は公開鍵が必要なのにTeratermやsshコマンドではそれをなんらかの仕組みで省略しているのでしょうか?

そもそも私自身にネットワークの知見が薄く、、ご教示いただければ幸いです。

PHP

1$resource = ssh2_connect($host, $port); 2ssh2_auth_pubkey_file($resource , $user, $pubkey, $prikey); 3// これで初めて認証が成功しました。適当な$pubkeyではもちろんエラー

Bash

1ssh -P $port -i $prikey $host 2## これで接続可能。なぜ???

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

SSH プロトコルでは、どの秘密鍵-公開鍵のペアを使って認証するかをサーバに伝える為、クライアントは認証時に公開鍵を送るようになっています。なので公開鍵認証をする為には公開鍵の情報が必ず必要です。

本来は公開鍵が必要なのにTeratermやsshコマンドではそれをなんらかの仕組みで省略しているのでしょうか?

OpenSSHの秘密鍵ファイルには、公開鍵も入っています。Tera Termではこの秘密鍵ファイルに入っている公開鍵を使います。

OpenSSHのsshコマンドは、例えば -i id_rsa として秘密鍵ファイルを指定した場合は id_rsa.pub というファイルが有るかをチェックして、有ったらそのファイルを公開鍵として利用します。なので id_rsa.pub が id_rsa の公開鍵でなかったら秘密鍵が正しくても認証が行えなくなります。
id_rsa.pub が無かった場合は Tera Term と同じように秘密鍵ファイルに入っている公開鍵を利用します。

PHP がなぜ秘密鍵ファイルに含まれる公開鍵を使わないのかについては判りません。

投稿2017/08/02 07:32

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mastar_3104

2017/08/02 08:22

OpenSSHの仕組みから教えていただき、誠にありがとうございました。大変わかりやすかったです!
guest

0

ssh2_auth_pubkey_file() なんて関数があるんですね。初めて知りました。
しくみがわからないのでソースを見てみたら、結局 libssh2_userauth_publickey_fromfile_ex()という関数を呼んでいるだけのようです。この関数には公開鍵が必須です。

一方、上記のページには libssh2_ で始まる関数が山のようにあって、その中には公開鍵がなくても認証できそうなものもあります。私も詳しくないので想像ですが、公開鍵まで指定して認証する方法だと、相手側の fingerprint(?)まで検証できるので警告を出さなくて済む。

一方、いわゆる ssh クライアントから接続する場合、公開鍵の指定がないので、接続先が初めて接続するサーバーの場合 fingerprint が表示されて、接続の可否が人間に委ねられる。

ソフトウェアの中で接続する場合、そういうことができないケースがある(たとえばWeb アプリであれば、利用者と会話するための tty がないとか)なので、より厳密な公開鍵が必要な API を利用して、確実に接続できるようにしているのではないでしょうか。

投稿2017/08/02 03:09

編集2017/08/02 06:06
hotta

総合スコア1613

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mastar_3104

2017/08/02 08:22

多種多様な認証を利用する可能性を加味して、より厳密に値を要求している、ということでしょうか。ありがとうございます。
guest

0

ssh接続するときに公開鍵と秘密鍵のペアを作って管理者に公開鍵を渡しませんでしたか?

管理者がsshするサーバーに対してあなたの作成した公開鍵を登録しているので
秘密鍵でsshできているのです。

投稿2017/08/02 02:43

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問