概要
組み込み機器では、ファームウェアや暗号鍵、ユーザ情報などの機密性の高いデータを扱うことも多くあります。それらの情報の盗聴や改ざんを防ぐには、セキュア転送が不可欠です。なりすまし通信や不正操作を防止するためにも、暗号化と認証を備えた通信が要求されます。一方で、MCUの性能やメモリが限られる組み込み機器では、軽量で効率的なセキュリティ実装が課題となります。
今回の記事では、セキュアファイル転送の基本機能について説明します。また、理解を助けるために実際のMCUでセキュアファイル転送を行う簡単なサンプルプログラムを動かしてみたいと思います。
セキュア転送を行うモジュールとしてwolfSSL社のwolfSSHを使用します。wolfSSHの特徴については3章でも紹介します。
セキュア通信プロトコルSSH
2.1 セキュアシェル・SSHの歴史的背景と広がり
SSH(Secure Shell)は、インターネットや社内ネットワーク越しにサーバや組み込み機器を安全に操作するための暗号化通信プロトコルです。SSHは、1995年にフィンランドの研究者 タトュ・ウルネン(Tatu Ylonen)によって当時主流だったtelnetやrloginなどの平文通信による深刻な盗聴リスクを解決する目的で開発されました。
その後、SSHは急速に世界中へ普及し、2000年代に入ると IETF(Internet Engineering Task Force)によって仕様の標準化が進められ、現在主流となっているSSH-2は以下のRFC群として体系化されるに至っています。
- RFC4251:SSH プロトコル全体の構成
- RFC4252:ユーザー認証
- RFC4253:暗号化・鍵交換
- RFC4254:チャネル管理・多重化
これによりSSHは、単なるリモートログイン手段を超えて、
- 安全な遠隔操作
- 安全なファイル転送
- 安全な通信トンネル
を統合的に提供する、現代ネットワーク運用における基盤技術として確立されました。現在では、Linuxサーバ、クラウド基盤、ネットワーク機器、さらには組み込みLinux機器の保守・運用に欠かせないプロトコルとなっています。
2.2 SSHの認証
SSHの認証は、通信を暗号化する前段階で利用者の正当性を厳密に確認する仕組みです。代表的な方式にはパスワード認証と公開鍵認証があり、現在は後者が主流です。
公開鍵認証では、クライアントが持つ秘密鍵とサーバに登録した公開鍵の組み合わせで本人確認を行います。この方式ではパスワードの送信自体が不要なため、盗聴や総当たり攻撃に強いことが特徴です。
認証に成功した後にのみ、暗号化通信が確立され、コマンド実行やファイル転送が許可されます。このようにSSH認証は、なりすまし防止と運用性を両立した設計となっています。
2.2.1 SSHの暗号化通信
SSHの暗号化通信は、ネットワーク上でやり取りされるすべてのデータを盗聴・改ざんから保護するための中核機能です。通信開始時には、鍵交換アルゴリズム(Diffie-HellmanやECDH)により、安全に共通鍵が生成されます。この共通鍵を用いて、以降の通信は共通鍵暗号(AESなど)で高速に行われます。同時にMAC(メッセージ認証コード)によって通信データの改ざん検知も行われます。
SSHで利用される暗号アルゴリズムの例を挙げておきます。
鍵交換アルゴリズム(安全に共通鍵を生成)
- Diffie-Hellman(DH)
- ECDH(Elliptic Curve Diffie-Hellman)
- Curve25519
共通鍵暗号アルゴリズム(実際の通信データの暗号化)
- AES-128/AES-256
- ChaCha20
MAC(改ざん検出用アルゴリズム)
- HMAC-SHA256
- HMAC-SHA1(現在は非推奨)
認証用アルゴリズム
- RSA
- ECDSA
- Ed25519
2.2.2 SFTP/SCP機能
SSHのSFTPとSCPはどちらもSSHの暗号化通信を利用し安全にファイル転送を行うためのプロトコルです。SCP(Secure Copy)は、SSHを使った単純なコピー転送で、ファイルやディレクトリを丸ごとコピーする用途に向くシンプルな方式です。SCPは転送速度が速く、コマンドも簡単ですが、ファイル操作の柔軟性に乏しくファイルリストや属性の取得などは難しいです。SFTP(SSH File Transfer Protocol)は、SSH上で動作するリモートファイル操作専用プロトコルです。SFTPでは、open, read, write, rename, remove, chmodやstat などのファイル操作コマンドが直接サポートされており、リモートファイルをAPI的に操作することが可能です。
安全性の面からは両機能ともSSHを使用しているので同等ですが、SCPは従来版のプロトコル仕様に既知の問題があり、OpenSSH 9.x 系では従来方式によるSCPプロトコルは非推奨となり、内部的にはSFTPベースの実装に移行しています。そのため、新規実装ではSFTPの利用が推奨されます。
wolfSSHの特徴
wolfSSHは、組み込み機器向けに最適化された軽量なSSHライブラリで、リソースが限定された環境でも安全なリモートアクセスを提供できる点が特徴です。SSH-2プロトコルに対応しており、SFTPやポートフォワーディングなどの主要機能も利用可能です。また、wolfSSLと連携することでTLSや各種暗号化機能を活用できます。公開鍵認証では RSA, ECDSAやEd25519に対応しており、柔軟に認証方式を選択することが出来ます。また、最新の暗号アルゴリズムへの対応も進んでおり、wolfSSH v1.4.21 (October 20, 2025リリース)以降は、wolfSSL/wolfCryptが提供するネイティブ実装のML-KEM(NIST PQC選定アルゴリズム)をSSH鍵交換で利用可能です。liboqsなどの外部依存ではなく、wolfSSL独自実装であることが特徴です。
3.1 Linuxなどからコマンドプロンプト経由でビルド・実行してみる
まずは、Linux, MacOS, Windows の WSLなどのパソコンのコマンド環境から wolfSSH をインストールして簡単なSFTP動作確認を行う手順を紹介します。
SSHプロトコルは、SSL/TLSプロトコルとは異なるので、wolfSSHはwolfSSL上で動作するのではなく、wolfSSLに含まれる暗号ライブラリ wolfCrypt を利用してSSHプロトコルを実現していますが、製品としては wolfSSLとwolfSSH を組み合わせて使用します。

図1:wolfSSL, wolfCryptとwolfSSHの関係
3.1.1 wolfSSLのビルドとインストール
まず、wolfSSHが参照するwolfSSLを準備します。wolfSSLのダウンロードについては、APS-WEBの「 はじめてのTLS〜正しく理解して、すぐ使える〜」の3.3節を参考にしてください。
ダウンロードが完了したら、SSH連携オプションを有効化しビルド・インストールを行います。wolfSSHでSFTPを利用するには、暗号アルゴリズムAES、SHA、RNGなどがwolfSSL側で有効化されている必要がありますが、`--enable-ssh`を指定すれば必要な暗号は自動的に有効化されます。
$ cd wolfssl $ ./configure --enable-ssh ... * wolfSSH yes ... $ make check ... $ sudo make install $ cd ..
3.1.2 wolfSSHのダウンロード、ビルド、インストール
次にwolfSSHをダウンロード、ビルド及びインストールを行います。ソースコードは、正式リリース版はwolfSSLサイトから、最新版は Github からダウンロードします。
正式リリース版:
wolfSSLサイト( https://www.wolfssl.jp/download/)からwolfssh-x.x.x.zipを選択しダウンロード解凍します。
最新版:
Github上のwolfSSH( https://github.com/wolfssl/wolfssh)をクローンします。clone後、wolfsshのフォルダに移動し、autogen.sh を実行することにより configure コマンドを生成します。
$ git clone https://github.com/wolfssl/wolfssh Cloning into 'wolfssh'... … $ cd wolfssh $ sh autogen.sh autoreconf: export WARNINGS=all,error autoreconf: Entering directory '.' … configure.ac:15: installing 'build-aux/missing' Makefile.am: installing 'build-aux/depcomp' parallel-tests: installing 'build-aux/test-driver' autoreconf: Leaving directory '.'
configureコマンドの生成が成功したら、コマンドを実行しwolfSSHの構成を準備します。SFTP機能を有効化するために、configure コマンドにはSFTPオプションを指定します。configureコマンドが成功後、make し wolfSSHをコンパイルします。
$ ./configure --enable-sftp checking build system type... x86_64-pc-linux-gnu checking host system type... x86_64-pc-linux-gnu … Features * Inline Code: yes … * scp: no * sftp: yes * sshd: no * ssh client: no … * X.509 Certs: no * Examples: yes $ make make -j17 all-am make[1]: Entering directory '/home/foo/wolfssh' CC examples/client/client.o CC examples/client/common.o
ビルドが終わったら別ターミナルを開き、サンプルのサーバを起動します。なお、echoserver は wolfSSH に付属する最小限のサンプルであり、OpenSSHのような完全なSSHDではありません。機能は限定されていますが、SFTPクライアントの基本動作を確認するには十分です。
$ ./examples/echoserver/echoserver
SFTPクライアントのサンプルプログラムをホスト名、ポート指定なしで起動すると、デフォルトでローカルホスト、ポート22222 のSSHサーバ(echoserver)に接続します。
$ ./examples/sftpclient/wolfsftp -u jill Password:
ログイン出来たら、”ls” コマンドでファイル名を確かめて、getでコピーしてみます。
wolfSSH sftp> ls autogen.sh wolfssh-config keys sshd_config … wolfSSH sftp> mkdir tmp wolfSSH sftp> get Makefile.in tmp/Makefile.in fetching /home/miyazakh/tmp/wolfssh/Makefile.in to tmp/Makefile.in Processed 65536 bytes in 0 seconds wolfSSH sftp>
3.1.3 WireSharkでパケットを覗いてみる
SFTPの様子を WireShark を使って覗いてみることにします。ここでは、対向のサーバを別Linuxパソコンで動作している OpenSSHサーバに対して行ってみます。 サンプルのSFTPクライアントプログラムでは -h オプションを使って対向サーバのIPアドレスを指定します。通常の SSHサーバはポート22番が割り当てられていますから、-p オプションで22を指定します。
$ ./examples/sftpclient/wolfsftp -h xxx.xxx.xxx.xxx -p 22 -u foo Password: wolfSSH sftp>
このとき、WireSharkでパケットを覗くと次のようになります。

図2:SFTPパケットの様子
図2にパケットはつぎのようなことを行っています。
①クライアントとサーバでバージョンの確認を行う。
②クライアントとサーバで鍵交換アルゴリズムを使って共有秘密を作成し、
暗復号に用いるセッション鍵を生成
③以降は、暗号通信を行う。ユーザ認証も③以降の暗号通信の中で行われる。
3.2 組み込み機器で使用してみる
続いて、組み込み機器で SFTP を行ってみます。使用するサンプルは対向サーバからカレントフォルダ内のフォルダ・ファイル名情報を取得し表示するだけの非常に簡単なものですが、SFTPクライアントに必要となる wolfSSLとwolfSSHとの相互構成などを理解することができます。
3.2.1 準備
3.2.1.1 使用するハードウェア
サンプルプログラムを動作させるために今回使用するハードウェアは下記となります。
- Windows PC
- Renesas RX72N Envision Kit
- USB 2.0 Micro-B(マイクロB)(PCとボード間を接続します。)
3.2.1.2 使用するソフトウェアのインストール
以下の表1のツールをWindows PCへ予めインストールしておきます。
| 名称 | 備考 |
|---|---|
| wolfSSH wolfSSL | https://github.com/wolfssl/wolfSSL, https://github.com/wolfssl/wolfSSH から Gitを使ってCloneします。ダウンロードの方法は3.1.1を参照のこと |
| e2studio Windows版 | Renesas社サイトよりダウンロード |
| CCRX | Renesas社製RX用コンパイラ |
表1:デモに必要なソフトウェア
3.2.2 組み込み向けSFTPクライアントをビルドする
SFTPクライアントは図 3に示すように wolfSSH及びwolfSSLを参照しています。

図3:SFTPクライアントのモジュール関係図
3.2.2.1 e2studio からwolfSSL, wolfSSH及びSFTPクライアントのプロジェクトを開く
準備したwolfSSHに含まれる各プロジェクトを開きます。e2studioの「ファイル」→「ファイル・システムからプロジェクトを開く」を選択します。ディレクトリは、<wolfSSH>/ide/Renesas/e2studio/RX72N/を選択します。

図4:プロジェクトをインポート
図4のように5つのチェックボックスをもつ項目が表示されます。一番上、“RX72N”のチェックを外し、終了をクリックします。

図5:e2studioエクスプローラーの様子
3.2.2.2 各プロジェクト(app_sftpclientを除く)をビルドする
wolfssl_RX72N → wolfssh_RX72N → wolfcrypt_testの順にビルドを行う。
3.2.2.3 wolfcrypt_test を実行する
wolfcrypt_test は、SFTPアプリケーションとは直接的な関係はありませんが、wolfCrypt に含まれる各暗号アルゴリズムの実装状態をテストするためのアプリケーションです。このアプリケーションを最初に実行し、暗号アルゴリズムが組み込みMCU(RX72N)で正しく実行できるかを事前に確認しておきます。
プロジェクトを右クリック選択後、「デバック」→「Renesas GDB Hardware Debugging」を選択します。正常に実行が行われると、図 6のように「Renesas Debug Virtual Consol」に結果が出力されます。

図6:wolfcrypt_testの結果画面
wolfCryptは図 6で表示されている暗号アルゴリズム以外にもたくさんのアルゴリズムをサポートしていますが、ここで使用するwolfCryptはSFTP通信で必要となるアルゴリズムのみを有効化しています。その結果、有効化したアルゴリズムのみがテストされています。
3.2.3 app_sftpclientをビルドし実行する
ビルドの前に簡単にサンプルプログラムapp_sftpclientの内容について紹介しておきます。app_sftpclientはカレントフォルダの情報を取得し表示するだけの非常に簡単なプログラムです。そのため使用するヒープメモリサイズは、0x9000(36K)に設定しています。カレントフォルダに含まれる、フォルダ・ファイル数が多くなるとそれらを確保するメモリが足りなくなる場合があります。その場合は、ヒープサイズを増やしてみてください。ヒープメモリは、図 7に示すapp_sftpclientのスマートコンフィグレータから変更可能です。

図7:ヒープサイズ
app_sftpclient では対向のSSHサーバのIPアドレスとポートは、プロジェクト中の wolfsftp_util.c の中に定義されています。お使いの環境に合わせて修正します。

図8:対向サーバのIPアドレスとポート番号
今回は簡単なために、3.1.2節でも使用した wolfSSH に含まれる echoserver を使用することにします。
対向のechoserver を起動します。
$ ./examples/echoserver/echoserver
app_sftpclientを起動します。対向のSSHサーバとの通信が成功すると「Renesas Debug Virtual Console」に図9のように表示されます。

図9:app_sftpclientの実行結果画面
echoserver以外のサーバとの接続を試す場合には、IPアドレス、ポート番号の他にハードコードされているユーザ認証用の情報を変更します。
3.2.4 組み込み向けSFTPクライアントを覗いてみる
wolfSSHは、LinuxやWindowsだけでなく、RTOSやベアメタル環境でも動作するように設計されています。そのためOSやTCP/IPスタック、ファイル・システムに直接依存せず、最小限のI/O抽象APIをユーザ側で実装することで動作可能となっています。SFTPクライアントを組み込み環境へ移植する場合、主に以下の3種類のAPI群を実装する必要があります。
①通信I/O
wolfSSHはTCP/IPスタックに直接依存せず送受信APIをユーザ側で提供します。
②ファイル・システムI/O
ファイルを操作するためのAPI群をユーザ側で実装する必要があります。具体的には以下のような操作が要求されます。
- ファイルの open/close
- ファイルの read/write
- ファイルサイズや属性の取得(stat)
- ディレクトリの open/read/close
- rename, remove などの基本操作
これらはwolfSSH側で直接行われるのではなく、ユーザが提供する実装をマクロにマップし行われます(例:WOPEN、WCLOSE、WFREADやWFWRITE)。そのためFATファイル・システム、SPI Flash、RAMディスクなど、組み込み環境に合わせた独自ストレージ構成でもSFTPを利用可能です。
③時刻・乱数・メモリ関連API
SSHでは以下の機能も内部で使用されます。
- 暗号処理用の乱数生成(RNG)
- セッション管理やタイムアウト処理のための時刻取得
- 動的に確保されるヒープメモリ管理
前述の3点が本サンプル中でどのように実装されているか以下で簡単に紹介します。
①通信I/O
app_aftpclientでは TCP/IP スタックに `t4`を使用しています(図 10)。

図10:t4 TCP/IPスタック
送受信用関数は、`wolfsftp_util.c`中に定義してあります。

図11:ユーザ定義送受信関数
定義したコールバック関数は実行時、wolfSSHが呼び出すことができるようにAPIを使って予め登録します。こちらは、`app_main.c`中の`sftp_client_connect()`関数中に見ることができます。
②ファイル・システム I/O
本サンプルではファイル・システムとして`tfat`を使用しています。

図12:tfatコンポーネント
このモジュールは`FatFs`互換APIをサポートしています。そのためwolfSSHで既に実装済み関数を使用することが可能です。それらを使用するために、wolfSSHライブラリのプロジェクトで `WOLFSSH_FATFS`マクロを定義しています。

図13:WOLFSSH_FATFSの定義
このマクロを定義すると<wolfSSH>/wolfssh/port.h 中の部分が有効化され利用可能とな
ります。
③時刻・乱数・メモリ関連API
本サンプルでは次のように実装しています。
・乱数生成(RNG)
乱数生成についてはRenesas社のTSIP(Trusted Secure IP Drive)を使用し乱数生成を行っています。`user_settings.h`中で機能を有効化するマクロ`WOLFSSL_RENESAS_TSIP_CRYPTONLY`を定義しています。
多くのMCUでは乱数生成機能を提供していますが、テスト用に`WOLFSSL_GENSEED_FORTEST`マクロを定義し簡易乱数生成機能で評価を行うことも可能です。ただし、乱数生成は暗号処理の肝となりますので本番環境ではテスト用の乱数生成機能は使用出来ないことに注意が必要です。
次の記事、「 組み込み向けMCUでTLSを動かしてみる」でRX72Nを利用しTLS通信を行う方法についても紹介しています。
・時刻取得
app_sftpclientプロジェクトの`wolf_dummy.c`中にtime()関数を定義しています。こちらはコンパイル時の日時をもとに呼び出しにより、`tick`を一つ可算するダミー関数です。より本番に近い環境では、RTOSが提供するタイマAPIやMCUが提供するタイマ機能を使用し、実装し直す必要があります。また、実運用では鍵の有効期限管理などに UNIX エポック基準の時刻が使用されるケースがあります。そのため UNIXエポック基準の取得ができる実装とすることが望ましいです。
・ヒープ管理
本サンプルでは使用しているCコンパイラ(CCRX)が提供する標準Cランタイムライブラリの`malloc/free`を使用しています。より本番に近い環境にするには、RTOS専用ヒープAPI、セキュアRAMの利用、静的メモリプールの利用などの実装を考える必要があります。
まとめ
ここまでセキュア転送について、SSHを含むプロトコルと合わせて説明してきました。最後にまとめとして、wolfSSHがサポートする環境について紹介します。
wolfSSH:
- 組み込みシステムやリソース制約のある環境でも動作可能な軽量SSHライブラリ
- 現行の安全なプロトコルであるSSH-2に対応
- 同一ライブラリでSSHサーバとクライアント機能を提供
- SFTPやTCPポートフォワーディングをサポート
- Linux, Windows , RTOSや組み込み環境など多様なプラットフォームで利用可能
- TCP/IPスタックやファイル・システムAPIに依存せず、独自I/O関数で通信可能
- wolfSSL(wolfCrypt)と組み合わせて暗号化を実現している。多様な鍵交換、耐量子暗号を含む暗号化アルゴリズムに対応可能
wolfSSHは単なる軽量SSHクライアントではなく、組み込み環境にそのまま適用可能な通信基盤として設計されています。wolfSSH製品の詳細ついては、下記URLも参照ください。
wolfSSH : https://wolfssl.jp/products/wolfssh/
こちらも是非
“もっと見る” ブログ
【FFTは蝶のように舞う:高速フーリエ変換編2】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
実はFFTの中にもたくさんの蝶が舞っています。FFTの中に舞う蝶が何を意味しているのか、を理解しましょう。
【回転因子行列をバラバラにする:高速フーリエ変換編1】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
コンピュータプログラムの世界には「計算量」という概念があります。ある入力データを元にプログラム処理を実行するとき、実行開始から完了までにどれだけの時間が必要になるか、を表す値です。
【離散フーリエ変換のスペクトルを読み解く:フーリエ変換編6】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
信号形状自体は正弦波(sin波)と同じで、ただ開始の起点位置が異なっていて、純粋な正弦波に比べて開始が先行している(専門的には「位相が進んでいる」という)だけの波形です。










