【C#】gRPCで証明書の状態をクライアント側で無視する

gRPC で HTTPS な環境の場合、サーバー側で証明書の設定がが必要になります。が、localhost にサーバーとクライアントが存在するの場合は VisualStudio がそこらへんうまく調整して開発時のローカル作業時は特に問題が発生しません。

ただ、開発中期あたりになると他のPCやコンテナ上でサーバーが稼働し、それに対しローカルPCのクライアントが接続する場合、サーバーの証明書の設定に不具合があると証明書がどうのこうのとエラーが出て開発ができない状況が発生したりします。

管理者が速やかに対応してくれない場合もあるので、タイトルの通り、限定された状況時のみクライアント側で証明書を無視して gRPC の通信を行う方法を紹介したいと思います。

確認環境

この記事は以下の環境で作成・確認を行っています

  • .NET8 + C#12
  • Visual Studio 2022 (17.14.18)
  • Windows11

構文が C#12 以前のバージョンでは一部コンパイルエラーになる構文が含まれます。

実装例

public static T CreateClient<T>(string hostName, bool isDevelopment) where T : class
{
    // セキュリティ的に非常に良くないので開発時のみに限定
    SocketsHttpHandler handler = new();
    if(isDevelopment)
    {
//忘れるとヤバいので念のためガードしておく
#if DEBUG
        handler.SslOptions = new SslClientAuthenticationOptions()
        {
            RemoteCertificateValidationCallback = (_, _, _, _) => true // 検証を常に成功扱いする
        };
#endif
    };
    GrpcChannelOptions options = new()
    {
        HttpHandler = handler,
    };
    GrpcChannel channel = GrpcChannel.ForAddress(hostName, options);
    T client = channel.CreateGrpcService<T>();
    return client;
}

コメントにもありますが、このまま無視した状態でリリースするとインシデント系の事故になるので扱いには注意が必要です。

参考サイト

この記事は以下の記事を読んでいると理解が深まるかもしれません。

takap-tech.com