web-dev-qa-db-ja.com

TLSなしで暗号化されるRESTful APIを持つことは可能ですか?

暗号化されたデータと承認のみを持つサーバーを実装することが可能であるかどうか疑問に思っていました(したがって、証明書の認証も必要とするTLSなしで)。 SSHに似ていますが、モバイルアプリ開発プラットフォーム(iOS/Android/React Native/etc)で動作します。

編集:各クライアントに手動でキーをインストールしたり、カスタム認証局(CA)を実行したりする必要はありません。また、ほとんどのデバイスは予約済みIPアドレスを使用してプライベートLANで実行されるため、標準的なCAは予約済みIPアドレスでは許可されないため、証明書を発行しません。これは、本質的に、プライベートネットワークを介して暗号化されたデータ転送を行うという新たなIoTの問題です。しかし、一般的なモバイルプラットフォームはSSL/TLSを使用して暗号化する必要があるようです。 React Native、Nativescript、Ionicなど)のようなモバイルプラットフォームで利用できる優れたソリューションがないように見えることを除いて、SSHは問題ありません。

2
Jason

はい、可能です。しかし、なぜそうするのでしょうか。

すべてのモバイルプラットフォームがTLSをサポートしていますが、なぜ車輪を再発明するのですか?

暗号化は正しく行うのが非常に難しく、間違いを犯しやすい。 TLSソフトウェアを書く人よりも優れた暗号化を発明できれば、この質問をすることはないでしょう。

3
Lie Ryan

TLSは暗号化を提供するだけではありません。信頼できる認証を提供します。誰とプライベートな会話をしているのかがわからなければ、世界中のすべてのプライバシーは重要ではありません。

PKIとCAがなければ、事前にキーを配布する意思がない限り、独自の形式の信頼できる認証を実装することは非常に困難です。

だから私は「いいえ」に投票するつもりです。あなたがたくさんの仕事をする意思がない限り、それは実際には不可能です。

3
John Wu

それは可能ですが、SSHは最初からこのアプリケーションに適したモデルではない可能性があります。

SSHには、Trust On First Use(TOFU)アプローチがあり、最初の接続でサーバーのキーを受け入れるかどうかをユーザーが決定する必要があります。これに対してTLSには、サーバーを識別するために、指定されたキーを合理的に受け入れることができるかどうかを判断しようとする(確かに不完全な)手段があります。何か異常が見つかった場合のみ(たとえば、自己署名証明書、不一致/期限切れ/無効な証明書など)、ユーザーに考えてもらいます(そして、メッセージを読まずに[OK]をクリックするだけで考えが置き換えられるという多くの証拠があります)。

言い換えると、ユーザーの両方を信頼し、信頼関係が提示されたときにユーザーが十分な情報に基づいて意思決定できると想定する必要があります。もう1つは、信頼を確立するために、不完全ではあるが十分に確立された、主に機能的なシステムを使用する必要があります。

もう1つの要因は、クライアントがデータを送信するための単一の暗号化キーを持っているのと同じように、セットアップがひどく聞こえることです。つまり、TLSがない場合、そのキーを持つすべてのユーザー(つまり、アプリからキーを抽出)は、APIに送信されたすべてのトラフィックを復号化できます。 TLSもあなたのためにそれを解決します。

クライアントごとのキーがあると主張できますが、それは次のとおりです。

  • 管理が必要
  • どういうわけか鍵を共有する必要があります
  • おそらく、ユーザーは暗号化せずにあなたと通信できる必要があります...

tl; dr:可能ですが、これをすべて正しく行う完璧な手段を見つけたとしても、TLSがあらゆる種類のEdge(そしておそらくコア)をカバーする説得力のあるユースケースがまだあります。ケース。

2