gRPCで独自の認証機構を利用する(SSH公開鍵認証編)

前回はgRPCのWithPerRPCCredentialsを用いた独自認証機構について試した。今回はWithTransportCredentialsを試すよ。

WithTransportCredentials

これを使うことで、ハンドシェイクを行うような認証方式を実装できる。TLS/SSLや、少し前に話題になったALTSもWithTransportCredentialsを使っている。go-grpcのこのあたりにコードがある。今回実装するにあたり、参考にした。

TransportCredentials

インタフェースとしてTransportCredentialsが用意されている。今回は、SSHの認証で使う公開鍵を用いる、というものを作ってみた。TransportCredentialとハンドシェイク部分は以下の通り。公開鍵・秘密鍵の扱いについてはこのあたりを参照。ClientHandshakeとServerHandshakeを実装することで、net.Connを使ってサーバーとクライアント間でやりとりし、認証する。

サンプル

takaishi/hello2018においてある。

サーバー:

クライアント:

間違った秘密鍵を指定した場合:

所感

認証はできたが、通信内容の暗号化はどうやるんだろう?というところ。SSHだと認証の後に共通鍵を発行し、それを用いて暗号化するわけだが…。TLS/SSLの実装部分を読み込めばわかりそうな気はする。