web-dev-qa-db-ja.com

RSAを使用したWebアプリケーション認証

要塞サーバーを介してssh経由でのみアクセスできるネットワークがあります。その中で、私はGUIを介してエンドユーザーに公開されるWebアプリケーションを開発しています。ネットワークに出入りするすべてのトラフィックは、SSHトンネルを介して、サービスホストから要塞を経由してエンドユーザーのマシンに移動します。

したがって、ネットワークの境界からエンドクライアントへのトラフィックはすでに暗号化されています。また、定期的にローテーションされるSSH-RSAキーペアにエンドユーザーを関連付けるためのシステム設定がすでにあります。

だから、ここに私のクレイジーなアイデアがあります:

ユーザー認証を必要とするネットワーク内の任意のWebアプリで、エンドユーザーにネットワーク上のユーザー名と公開鍵を提供してもらいます。 Webアプリの認証サービスに、この公開鍵が実際にすでにネットワークのキーストアでエンドユーザーに関連付けられていることを確認させ、その鍵を使用してチャレンジを生成します。クライアント側では、エンドユーザーは秘密鍵を使用してチャレンジを復号化し、認証のためにサーバーに最終結果を提示します。

これがキッカーです:a loadこのネットワークのサービスはNodeJSのJavaScriptに実装されています。 NodeJSはシステムサービスを呼び出すことができるため、公開鍵を使用してチャレンジを生成する作業を従来のプロセスにオフロードできます。しかし、クライアント側では、秘密鍵を使用してブラウザーでチャレンジを復号化する必要があるかもしれません。

秘密鍵をブラウザに取り込むのは簡単です。秘密鍵をブラウザーにロードするかどうかは、まったく別の問題です。

しかし、より具体的には:

  1. 「ああ、そんなことしないで!」上で要約された設定のセキュリティ欠陥?
  2. LinuxでRSA公開鍵を使用してチャレンジを生成するために使用されるいくつかの標準パッケージは何ですか?
  3. JavaScriptに実装された公開RSAキーを使用してメッセージを復号化するための優れたパッケージを知っている人はいますか?
2
StudentsTea
  1. 「ああ、そんなことしないで!」上で要約された設定のセキュリティ欠陥?

あなたが提案している基本的なプロトコルは次のとおりです:クライアントは自分自身を識別し、サーバーは公開鍵をチェックして有効なユーザーであることを確認し、サーバーは公開鍵を使用してチャレンジを暗号化し、クライアントはチャレンジを復号してチャレンジを取得し、それを知っていることの証明として返します秘密鍵。

燃えるような問題はありません。 RFC 4252、セクション7 に示されているように、SSH自体が公開鍵認証のために実行することに従う方が良い場合があります。そこで、クライアントは、サーバーが検証できる秘密鍵で何かに署名します。常に標準に準拠することをお勧めします。

  1. LinuxでRSA公開鍵を使用してチャレンジを生成するために使用されるいくつかの標準パッケージは何ですか?

Opensslをお持ちの場合は、これを行いますopenssl Rand -base64 16(またはおそらく32バイト)。

それ以外の場合は、/dev/random(またはおそらく/dev/urandom絶対に必要な場合)。このようなもの head -c 16 /dev/random | base64詳細はこちらをご覧ください

  1. を使用してメッセージを復号化するための良いパッケージを誰かが知っていますか 公衆 JavaScriptに実装された秘密RSAキー?

多くの これらのライブラリ はRSAをサポートしています。それらがどれほど優れているか、SSH秘密鍵を使用可能なものに変換するのがどれほど簡単かはわかりません。

この回答は chat の要約です

1
mikeazo