ブート前システムに実装するために、安全なファイル転送プロトコルを選択する必要があります。基本的なネットワーク機能(IP、TCP、UDPなど)を備えたライブラリにアクセスできます。 OpenSSLライブラリにもアクセスできる場合があります。
OpenSSLライブラリを使用できる場合と、そうでない場合のどちらを実装するのが最も簡単かを知る必要があります。私はSSHクライアントを持っていないので、SFTPを使用する場合はそれを実装する必要があります。
最後に、SSHまたはSSL/TLS間での実装が簡単である(そして、時間を節約できることを意味する)ことについて、正当化された声明を誰かに教えていただければ幸いです。
OpenSSLを使用している場合は、SSL/TLSを使用します。実装が最も簡単なプロトコルは、すでに実装されているプロトコルです。 SSLはそのままのトンネルを提供するだけなので、実際の「ファイル転送」を整理する何らかの管理プロトコルを含める必要があります。 HTTP。 SSL内のHTTPはHTTPSとして知られています。これは標準であるため、プロトコルを指定するというハードワークはすでに行われています。
OpenSSLがなくても、私は個人的にSSL/TLSを次の理由で推奨します。だから私はそれが実行可能であることを知っています。また、小規模なシステムを対象とした他のSSL/TLSライブラリもあります。 CyaSSL または axTLS 。
SSHプロトコルを再実装することは、SSLを再実装することよりも難しくないはずですが、SSHの仕様は大きくなります(これは RFC 4251 で始まります)。一方、SSL/TLSは単一の RFC 5246 )に適合します。それは明らかにプロトコルを選択するための客観的ではない方法ですが、どちらも完全に無難ではありません。
SSL/TLSについては、次のことをお勧めします。
TLS 1.2 を使用し、以前のバージョンを気にしないでください(クライアントとサーバーを制御するため、特定のバージョンを強制できます)。以前のバージョンではMD5とSHA-1の両方が必要でしたが、TLS 1.2ではハッシュ関数を1つだけ実装する必要があります。
単一の暗号スイートを使用します(例:TLS_RSA_WITH_AES_128_CBC_SHA256
)。これにより、処理がかなり簡単になり、ブロックサイズやMAC長などをハードコードできます。
RSAキー交換を使用して、システムが「クライアント」になるように調整します。これにより、RSAを暗号化モードでのみ使用できるようになります。これは、復号化よりも実装が特に簡単です。また、クライアントは非対称の秘密鍵を保存する必要がありません。これは、安全な鍵の保存が難しいため、これで十分です。
証明書をデコードしようとしないでください。通常のSSL/TLSでは、サーバーは公開鍵をX.509証明書チェーンの一部としてクライアントに送信します。クライアントは、ハードコードされた公開鍵に関してチェーンを検証することになっています。仲介者をカットし、クライアントでサーバーの公開鍵をハードコードするだけです(X.509証明書チェーンの検証を実行できます(6 kBのコードでも)。完全にトリッキーです)。
どちらの方法でも、暗号ライブラリが手元にない場合、いくつかの基本的なアルゴリズムを再実装する必要があります。これは簡単ではないことがわかっています(特に、常に サイドチャネル攻撃 を避けたい場合)。組み込みシステムへの懸念)。また、暗号化された安全な乱数ソースにアクセスする必要があります。起動前のシステムでは、これが難しい場合があります。しかし、それはセキュリティにとって非常に重要です。
Scpに投票します。非常にシンプルで、安全で、カスタマイズできるオプションがたくさんあります。 sftpは同じボートにありますが、少し複雑です。