次のようなケースがあります。
質問:これを安全で保守可能な方法で達成するための良い方法は何でしょうか?
私の知る限り、使用できるPKIソフトウェアはありません。私は以下を計画しました:
makecert -r -n "CN=SomeClientId" -pe -ss my
です。これはサウンドアレンジのように見えますか?もっと良いものがありますか?特定のクライアントのアクセスを拒否する必要がある場合は、サーバーデータベースにフラグを設定して、特定の拇印が許可されなくなったことを示すだけでよいようです。 SEを参照しているときに、 秘密キーを公開せずにクライアント証明書を配布する方法を知りましたか? 。 Thomas Pornin's の答えからヒントを得て、このプロセスを変更して、証明書を生成するときに変更できることを確認しました。例として:
someclient.inf
ファイルを作成します(Windowsの場合、それ以外の場合は、opensslを使用するなど)。certreq -new someclient.inf request.csr
を実行して、リクエストファイルを作成します。certreq -accept someclient.cer
を使用して証明書をインストールします。別の質問:これは、最初に概説した手順を超えて追加の利点をもたらしますか(これは適切な手順ですか)?
追加の質問:サーバーが署名をどのように行うべきかについては不明です。どのプログラム?どのパラメータを使用しますか?しかし、この手順が使用可能なものである場合、おそらくこれらは別の質問になるはずです。
注:コマンドラインですべてのソフトウェアにアクセスできないか、クライアントエンドでコードの記述が複雑になる可能性があるため、おそらく BouncyCastle 。
あなたのポイント4は少し不明確です:クライアントが「マテリアル」を受け取らなかったと主張し始めたのに問題はありましたが、実際には受けましたか?
notが問題である場合、基本的に必要なのは次のとおりです。
サーバーへのSSL接続。サーバーの証明書は、クライアントが有効であることを認識できる必要があります。クライアントソフトウェアはあなたの管理下にあるため、外部の商用CA(Thawteなど)からの証明書は必要ありません。必要なのは、クライアントソフトウェアによって受け入れられる証明書です。クライアントコードに証明書のコピーを埋め込み、クライアントが、サーバーから送信された証明書が期待されるものとビットごとに等しいことを確認する限り、サーバー用に独自の自己署名証明書を作成できます。 。
一部のクライアント固有のシークレット値[〜#〜] s [〜#〜]クライアント側に保存されます。この値は一種のパスワードと考えることができますが、操作に人間の脳は関与していないため、ランダムに均一に生成されるstrong-たとえば、任意の128ビット文字列にすることができます。クライアントは[〜#〜] s [〜#〜]を保存し、サーバーはh(S)を保存します(一部のハッシュ関数の場合h() =)。
クライアントが接続すると、SSL接続を介してサーバーに[〜#〜] s [〜#〜]を送信します。サーバーはh(S)を計算し、データベースで検索して、接続されているクライアントを確認します。
このモデルでは、クライアント側の証明書を追加する必要はありません。あなたはcanですが、それはセキュリティモデルに追加の利点をもたらしません。クライアント側の証明書を使用する理由の1つは、証明書用に設計されたハードウェア要素(スマートカード)と相互運用することです。ソフトウェア側にいる限り、単純な秘密の値がトリックを実行します(いずれの場合も、クライアントhasは、秘密の値(証明書を所有している場合は秘密鍵など)を格納するために使用します) )。