3

Grpc Client がサーバーで SSL 認証を行うために、GrpcSslContext に何を設定する必要があるか知りたいですか?

現在、次のコードは、サーバーからクライアントへの通常の一方向 SSL 認証で機能しています。

サーバーでは、

SslContext sslContext = GrpcSslContexts.forServer(new File(pathToOwnCertPemFile), new File(pathToOwnPrivateKeyPemFile)).trustManager(new File(pathToClientCertPemFile)).build();

ServerImpl server = NettyServerBuilder
        .forPort(port)
        .sslContext(sslContext)
        .addService(MyGrpc.bindService(new MyGrpcService()))
        .build().start();

クライアントでは、

SslContext sslContext = GrpcSslContexts.forClient().trustManager(new File(pathToServerCertPemFile)).keyManager(new File(pathToOwnCertPemFile), new File(pathToOwnPrivateKeyPemFile)).build();

ChannelImpl channel = NettyChannelBuilder.forAddress(host, port)
                .negotiationType(NegotiationType.TLS)
                .sslContext(sslContext).build();

blockingStub = MyGrpc.newBlockingStub(channel);
asyncStub = MyGrpc.newStub(channel);

https://github.com/grpc/grpc-java/blob/master/SECURITY.mdのgRPC によると、

相互認証が必要な場合は、適切な SslContext を作成することでこれをサポートすることもできます。

GrpcSslContexts を正しく初期化したのだろうか?

アドバイス/コメントをお待ちしております。

[アップデート]

さらにトラブルシューティングを行ったところ、CertificateRequest メッセージ ( https://en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshakeに記載) が、クライアント認証を開始するためにクライアントに送信されていないことに気付きました。

私のサーバー ログの抜粋は次のとおりです。

*** ECDH ServerKeyExchange
Signature Algorithm SHA512withRSA
Server key: Sun EC public key, 256 bits
public x coord: 81392923578261760187813715443713168545877454618233337093852615933913992434989
public y coord: 26389586381130695169212775668808794166799180199461581135201001980310825571555
parameters: secp256r1 NIST P-256, X9.62 prime256v1
*** ServerHelloDone
[write] MD5 and SHA1 hashes: len = 1617
0000: 02 00 00 56 03 03 55 DF 34 10 9C 73 B5 00 C2 70 ...V..U.4..s...p
0010: FD B8 CC 36 5B 83 87 70 5B 74 A3 D2 AD B7 75 3B ...6[..p[t....u;
....

gRPC に固有のバグである可能性があるのではないかと疑い始めています。

4

2 に答える 2

6

編集:サポートが追加されました。独自のSslContextものを作成して に渡します。NettyChannelBuilder.sslContext()必ず 経由でクライアント証明書を要求してSslContextBuilder.clientAuth()ください。次に、RPC ごとに をチェックし、 viaClientCall.getAttributes()を取得します。SSLSessionGrpc.TRANSPORT_ATTR_SSL_SESSION


gRPC-Javaには、相互認証に必要なサーバー上のクライアント証明書を要求する方法がないようです。SSL/TLS がどのように機能するかを考えると、これは完全なバグではありませんが、より多くの機能要求です。

Java 実装は、クライアント証明書を完全な機能としてサポートするようにはまだ機能していません。これには、サーバー上のクライアント証明書を取得できることが含まれます。クライアント認証を要求する機能は、その機能の一部である必要があります。

クライアント認証は、grpc-Java がサポートするすべての意図を持っているものですが、まだ取り組んでいません。

于 2015-08-31T17:50:10.303 に答える