带有自签名证书的 GRPC ssl

Max*_*Max 6 ssl dart kotlin grpc flutter

我正在尝试将自签名证书与 GRPC 一起使用。我生成了证书/密钥:

openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
Run Code Online (Sandbox Code Playgroud)

这给了我两个文件:cert.pemkey.pem.

我有一个 Kotlin GRPC 服务器,我设置如下:

val ca = classLoader.getResourceAsStream("cert.pem")
val key = classLoader.getResourceAsStream("key.pem")
ServerBuilder
    .forPort(8443)
    .useTransportSecurity(ca, key)
    .addService(...)
    .build()
    .start()
Run Code Online (Sandbox Code Playgroud)

这似乎成功启动。我有一个颤振客户端,我按以下方式设置:

final cert = await rootBundle.load('cert.pem')
final certAsList = cert.buffer
        .asUint8List(
          cert.offsetInBytes,
          cert.lengthInBytes,
        )
        .map((uint8) => uint8.toInt())
        .toList()
final channel = new ClientChannel(
      'localhost',
      port: 8443,
      options: ChannelOptions(
        credentials: ChannelCredentials.secure(certificates: certAsList),
      ),
    )
Run Code Online (Sandbox Code Playgroud)

但是,使用此通道连接到我的服务会出现以下错误:

gRPC Error (14, Error connecting: HandshakeException: Handshake error in client (OS Error: CERTIFICATE_VERIFY_FAILED: ok(handshake.cc:352)))
Run Code Online (Sandbox Code Playgroud)

这个设置有什么问题?

Mat*_*err 4

默认情况下,所提供的证书(任一方向)将通过多种方式进行验证:

  1. 主机名必须与所提供证书中的主题公用名匹配。
  2. 不得通过使用 CRL 或 OCSP 验证来撤销证书
  3. 根CA证书必须是可信的,并且任何中介机构都不能被撤销

您可能会遇到#3,因为它是一个自签名证书(根是其本身且不受信任)并且您已经在使用localhost它来连接。您可以将此证书添加到受信任的 CA 证书存储中,也可以以编程方式为 SSL 上下文创建不安全的证书验证。有关 Kotlin (Java) 端的更多详细信息,您可以在此处查阅 SO:Disablingcertificate check in gRPC TLS