2018年1月18日木曜日

gRPC で SSL 暗号化

gRPC では SSL/TLS がサポートされています。チャネルを生成するときに資格証明を渡します。「オレオレ証明書」を作成して試してみました。



SSL証明書の作成


SSL証明書が必要になります。crt, csr, key ファイルを作成します。今回は OpenSSL を使用して「オレオレ証明書」を作成しました。次のサイトが分かりやすかったです。

[Windows] OpenSSLによる自己署名証明書の作成 | うつしよ

localhost でテストを行う場合、Common Name に localhost を指定します。ホスト名が異なる場合、クライアントからサービスに接続しようとしたときに E0113 No match found for server name というエラーが発生します。

サービス用とクライアント用の証明書を作成しました。
  • testServer.crt, testServer.csr, testServer.key
  • testClient.crt, testClient.csr, testClient.key

サービス側の実装


チャネルのコンストラクタに SslServerCredentials を渡します。CA証明書にはtestServer.crt を使用しました。
using Grpc.Core;
using System.IO;

string cacert = File.ReadAllText("testServer.crt");
string servercert = File.ReadAllText("testServer.crt");
string serverkey = File.ReadAllText("testServer.key");
KeyCertificatePair keypair = new KeyCertificatePair(servercert, serverkey);
SslServerCredentials credentials = new SslServerCredentials(
    new List() { keypair }, cacert, false
);

Server server = new Server();
server.Ports.Add("localhost", 8080, sslCredential);


クライアント側の実装


チャネルのコンストラクタに SslCredentials を渡します。CA証明書にはtestServer.crt を使用しました。
using Grpc.Core;
using System.IO;

string cacert = File.ReadAllText("testServer.crt");
string clientcert = File.ReadAllText("testClient.crt");
string clientkey = File.ReadAllText("testClient.key");
SslCredentials sslCredential = new SslCredentials(
    cacert, new Grpc.Core.KeyCertificatePair(clientcert, clientkey)
);

Channel channel = new Channel("localhost:8080", sslCredential);

TestServiceClient client = new TestServiceClient(channel);

0 件のコメント:

コメントを投稿

paiza のスキルチェックをやってみました

いまさら感はありますが、 paiza のスキルチェックをやってみました。指定された時間内にコードを書いてユニットテストにかけ、その結果を基に評価を数値化してくれるというものですが、ゲーム感覚で空き時間を見つけて進めていこうと考えています。 どうやら時間が短いほど高い評価を得...