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

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

新規登録して質問してみよう
ただいま回答率
85.46%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

165閲覧

Macで、NMSSHを使ってSFTP接続できない

Omogo

総合スコア11

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2024/05/03 07:06

編集2024/05/04 02:39

実現したいこと

macOSで、RaspberryPiにSFTP通信をしたいのです。
CocoaPodsで、NMSSHライブラリをインストールして、実行しました。

発生している問題・分からないこと

NMSSHライブラリは、iOSでは動作を確認しましたが、macOSでは、IPアドレスの認識は成功するのですが、session.connect()のところでエラーになります。
Outgoing Connections(Client)には、チェックを入れてあります。
何かmacOSの設定があるのでしょうか?どうしてもわかりません。わかる人がいればどうか教えて下さい。

エラーメッセージ

error

1実行結果です。 2 3NMSSH: libssh2 (v1.6.0) initialized 4NMSSH: Start 192.168.11.9 resolution 5NMSSH: Socket connection to 192.168.11.9 on port 22 succesful 6Connection failed 7Owari 8NMSSH: Failure establishing SSH session 9NMSSH: Disconnected 10NMSSH: Disconnected 11 12このように、Failure establishing SSH sessionが出て繋がりません。 13

該当のソースコード

swift

1 2import NMSSH 3 4func nmssh_ogr() { 5 let host =168.126.11.3" 6 let username = "username" 7 let password = “password” 8 9 let session = NMSSHSession(host: host, andUsername: username) 10 session.connect() 11 if session.isConnected == true { 12 session.authenticate(byPassword: password) 13 print("Pass!!") 14 if session.isAuthorized == true { 15 print("Authentication succeeded") 16 let error: NSErrorPointer = nil 17 let response = session.channel.execute("ls -l", error: error) 18 if response != "" { 19 print("Command executed: \(response)") 20 } else { 21 print("Error executing command: \(error?.pointee?.localizedDescription ?? "Unknown error")") 22 } 23 print("OK!!") 24 } else { 25 print("Authentication failed") 26 } 27 } else { 28 print("Connection failed") 29 } 30 session.disconnect() 31 print("Owari") 32} 33

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

同じコードをiPhoneで実行すると、動作します。
でも、macOSで動作させたい。
もしかして、Objective-Cで動くかなと思ってコードを書いて実行させて見ましたが、やはり同じ結果となりました。

補足

raspberryサーバ側のログです。
ログファイルがどれなのか見てもよくわからないですが、
多分これだと思います。 /var/log/auth.log

May 3 21:29:09 raspberrypi sshd[2259]: Unable to negotiate with 168.126.11.6 port 50268: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1 [preauth]

時間を測ったら、この1行だけがログイン失敗のところです。

------------------------- 調べました -----------------------------
MacのOSは
macOS Sonoma 14.4.1

サーバーのOSは
Raspberry Pi OS
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye

Raspberry Piのsshdのバージョンは
OpenSSH_8.4 Raspbian-5+deb11u3, OpenSSL 1.1.1w 11 sep 2023

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

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

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

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

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

ikedas

2024/05/03 08:57

NMSSHで接続を開始してからエラーメッセージが表示されて失敗するまでの間の、Raspberry Piの側のSSHサーバ (おそらくsshdという名前だと思います) のログを提示してください (IPアドレスやホスト名などは伏せていただいて構いませんが、前記の期間中のログを途中を抜かしたりせず提示してください)。 ちなみに、このコメント欄に書くのではありません。質問部を編集して書いてください。
ikedas

2024/05/03 13:16

auth.logでいいです。 で、sshdのプロセスはログインしてきたユーザ毎に起動されますから、ログ中では「sshd[2259]」のようにプロセスIDで区別できるようになっています。特定のユーザのログインのときのログを追いたければ、そのユーザの接続を受け付けたsshdのプロセスのログだけ抜き出してみればいいですね。 今提示されているログは、どのsshdプロセスのログもログインの途中から始まって途中で終わっていますから、実際どれが今回の問題のログなのかはっきりしないです。ログインを試してみて失敗するまでの時刻を秒単位で記録しておいてログを確認するなどして、問題のログだけ抜き出してみてください。
ikedas

2024/05/03 14:02

サーバが使っている鍵交換方式がやや古く、macOS側がもはや対応していないようですね。 macOSかサーバかどちらかの設定を調整する必要がありますが、次のことを調べていただけますか。 ・macOSのバージョン。 ・サーバのOSの名前とバージョン。 ・サーバのsshd (たぶんソフトウェアの名前としては openssh だと思います) の名前とバージョン。 連休なので、反応が少し遅れます。誰か他の人で回答される方は待たなくていいです。
Omogo

2024/05/04 12:02

コメントありがとうございます。 ログの見方ですが、diffie-hellman-group14-sha1がクライアント側、diffie-hellman-group-exchange-sha1が鍵交換方式、diffie-hellman-group1-sha1がホスト側とみてよろしいんでしょうか? ログファイルを初めて見るもので、わからないものですいません。
ikedas

2024/05/07 03:20

いや、この3つとも「Their offer」(先方の申し出〔たアルゴリズム〕) だということだと思います。……macOS 14 Sonomaの方がRaspbian 5よりずっと新しいので、「先方」がmacOSのSSHクライアントのことだとすると辻褄が合わないですが。 とにかく、Sonomaになった際にSHA1を使うような古いアルゴリズムを切り捨てたということだと思うので、ラズパイのOpenSSHでも古いアルゴリズムをやめて新しいものを使うようにする必要がありますね、どんな設定をすれば良いのかについてはもう少し調べてみます。
guest

回答1

0

自己解決

解決しました。
Raspberry側(サーバ)の/etc/ssh/sshd_conf.dにtest.confを作り
KexAlgorithms +diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
の1行を挿入しました。
iKedasさんどうもありがとうございました。

しかし、クライアント側で設定できないんでしょうかね?

投稿2024/05/07 11:30

Omogo

総合スコア11

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

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

ikedas

2024/05/07 13:11

なんかその方法を紹介しているウェブ上のページをちょくちょく見かけるんですが、diffie-hellman-group-exchange-sha1なんかは2022年のRFC9142などいくつかの標準で、現在では強度が低すぎるので「用いるべきでない」(SHOULD NOT be used) とされているんですよね。 https://datatracker.ietf.org/doc/html/rfc9142#section-3.2.1 なので、その方式を使えるようにする設定変更というのは望ましくないのですよね。 しかし、macOS 14 Sonomaになったらなぜこんなとっくに廃用になった弱々の方式を使うようになったのかが謎です。使えなくしたというのならわかるのですが……。 個人的にもSonomaへのアップグレードを検討中なので (一度やったのだけどいろいろひどい目にあってVenturaに戻したので、慎重になっています)、引き続き調べてみようと思います。
Omogo

2024/05/07 13:30

ウェブページを見ると、強度が低すぎると出てきますよね。 もしかして、ライブラリNMSSHのせいなのかもしれないですよね。 憶測なので、わかりませんが.......。こんな事書いてもいいのかな?
ikedas

2024/05/07 14:24

気づいている人はたくさんいるはずなので、ここで書いても影響ないでしょう。 で、今初めて NMSSHのGitHubリポジトリを見たのですが > NMSSH is an Objective-C wrapper for libssh2, with a sweet API. と書いてあって、かなり古くて今では現代的な仕様が色々不足しているlibssh2 のラッパーだということですね。 今はmacOSでもOpenSSHが標準になっていると思うので、OpenSSHと同様の仕様を使えるものを探したほうがよさそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問