自己署名証明書の検証に向けて考えているアプローチが適切であるかどうか、またはそれを間違った方法で行っているかどうかを確認しようとしています。私はセキュリティの専門家ではないので、間違った仮定をした場合はご容赦ください。
以下は私が持っている状況の要約です:
セキュリティPoVから、クライアントとサービスの間で送信されるデータが確実に暗号化されるようにしたいと思います。これを実現するために、.NET gRPCでは、クライアントがHTTPSを使用してサービスと通信できるように証明書を使用できます。
ただし、CA証明書を購入または使用したくないので、自己署名証明書を作成し、それを使用してgRPCサービスを構成する予定です。
クライアントがIPアドレスを介してサービスにアクセスする必要がある場合、すべてのクライアントマシンに証明書をインストールする必要があります。しかし、私はそれをしたくありません。代わりに、.NET ServerCertificateCustomValidationCallback
を活用してカスタム検証を実装する予定です。
確認するには、クライアントのコードに証明書の拇印/ハッシュを保存することを考えており、コールバックが呼び出されたときに、受信した証明書の拇印/ハッシュがクライアントのコードのものと一致することを確認します。
この検証方法は信頼できますか?この方法では、中間者攻撃が発生する可能性がありますか?
私の最初の考えは、攻撃者がクライアントから取得できる証明書ハッシュだけなので、偽の証明書を作成してクライアントに信頼させることはできないということです。ただし、100%確実ではありません。
証明書自体ではなく、証明書の暗号化ハッシュ(「フィンガープリント」)を比較に使用することは完全に問題ありません。そして、これは証明書のピン留めを実装するときに実際によく行われます。
真ん中の人は、指紋に使用されているハッシュアルゴリズムが十分強力である限り、証明書と自己署名の指紋とまったく同じ指紋を持つ証明書と一致する秘密鍵を生成できません。証明書の署名アルゴリズムとしてSHA-256で十分であると考えられる場合、このフィンガープリントでもSHA-256で十分であると考えることができます。
もちろん、この自己署名証明書が危険にさらされる可能性がある場合はいつでも、アプリケーションを変更する必要がありますが、これがあなたの管理下にある限り、これは問題にはなりません。