Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

grpc/greeter_server.php: [WARNING] swSSL_accept: bad SSL client #4

Closed
eddycjy opened this issue Oct 20, 2018 · 16 comments
Closed

grpc/greeter_server.php: [WARNING] swSSL_accept: bad SSL client #4

eddycjy opened this issue Oct 20, 2018 · 16 comments

Comments

@eddycjy
Copy link

eddycjy commented Oct 20, 2018

您好 @twose ,我正在实现 SSL 相关的功能,但是出现了问题完全阻塞了我的开发

  1. server.php:
$http = new swoole_http_server('127.0.0.1', 50051, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$http->set([
    'log_level' => SWOOLE_LOG_INFO,
    'trace_flags' => 0,
    'worker_num' => 1,
    'open_http2_protocol' => true,
    'ssl_cert_file' => './certs/server.pem',
    'ssl_key_file' => './certs/server-key.pem',
]);

$http->on('workerStart', function (swoole_http_server $server) {
    echo "nghttp -v https://127.0.0.1:{$server->port}\n";
});
$http->on('request', function (swoole_http_request $request, swoole_http_response $response) {
...
}
  1. client.php:
use \User\UserClient;
use \User\ListRequest;

require __DIR__ . '/../vendor/autoload.php';

$name = !empty($argv[1]) ? $argv[1] : 'Swoole User';

go(function () use ($name) {
    $credentials = Grpc\ChannelCredentials::createSsl(
        file_get_contents('../certs/ca.pem')
    );
    $userClient = new UserClient('127.0.0.1:50051', [
        'credentials' => $credentials,
    ]);
    $userClient->start();
    $request = new ListRequest();
    ...

    list($reply, $status) = $userClient->List($request);
    $message = $reply->getResponseName();
    echo "{$message}\n";
    $userClient->close();
});
  1. 场景回放:
    server.php 运行成功,client.php 执行后,server 端出现报错
$ php server.php
nghttp -v https://127.0.0.1:50051
[2018-10-20 15:15:27 #66954.0]	WARNING	swSSL_accept: bad SSL client[127.0.0.1:55810].
  1. 证书

我代码中的 ./certs/server.pem./certs/server-key.pem 在纯 Go Client/Server 中使用正常,PHP Client 是在官方 demo 中看到使用 ca.pem 即可

  1. 疑问:

Requirement 中有明确提到 不要启用grpc的php扩展

但是在 grpc-client 的包内并不包含 Grpc\ChannelCredentials 等等类,因此无法调用 SSL 方面的凭证处理,最后我被迫启动了 php grpc 的扩展来达到调用 ChannelCredentials 类的目的

但是又遇到了 bad SSL client 的问题,无法内调成功!

想请问 @twose 是否有建议或如何解决?或是我哪里做错了?

@twose
Copy link
Member

twose commented Oct 20, 2018

第二个参数opt使用['ssl_host_name' => '127.0.0.1']试试
ssl简直是性能杀手, 如果你的服务全都是在内网环境或者不存在中间人攻击可能性的或是不提供公网服务的, 没有启用ssl的任何必要性

@eddycjy
Copy link
Author

eddycjy commented Oct 20, 2018

@twose 感谢,可以了! 我就说怎么没看到 ServerName 的入参... 😅

想问问这块有参数文档吗,我刚刚点进去源码看了,的确有相关参数的调用。但是一开始接触的时候,不知道。因为像 Go 是叫 ServerName

@eddycjy
Copy link
Author

eddycjy commented Oct 20, 2018

@twose 另外 Requirement 提到的 不要启用grpc的php扩展 的问题,我现在为了使用 SSL,启用了 grpc 扩展,请问会有什么影响?

@twose
Copy link
Member

twose commented Oct 20, 2018

和swoole扩展存在冲突 已知影响是可能不能正常结束进程(可能破坏了eventloop?) 具体原因未知

@eddycjy
Copy link
Author

eddycjy commented Oct 20, 2018

@twose ememem...那和 Swoole 扩展冲突可能一时半会解决不了。是否有考虑后续在本项目添加 SSL 类别的类库使用来避免该问题?

因为我们这边是要求整体上 SSL 的,就算 Server 端不上,其他语言的 Server 端也有 SSL,因此 SSL 类库的使用无法避免(加载 php grpc 扩展)

@twose
Copy link
Member

twose commented Oct 20, 2018

不使用ChannelCredentials, 只开启ssl_host_name无法成功连接吗? 我还没有关注过ssl这块, 因为暂时没有应用场景.

@eddycjy
Copy link
Author

eddycjy commented Oct 20, 2018

@twose 只使用 ssl_host_name 的话,可以成功连接基于 Swoole 的 PHP Server(....我震惊了一下,后面发现原来只校验了 host_name ?)

我刚刚想给您实际搞个互调例子的,折腾了半天,发现 Grpc\__construct(...) 里压根没有对 credentials 参数进行处理。也就是有校验证书的场景都过不去...

--

我这边有涉及到一些 Go 的应用场景例子,例如

  1. 基于 CA 双向校验
  2. 不基于 CA 的单向校验

--

这块的话,我目前比较头疼,因为这边的 Go Server 都是如上的第二种模式

或者说,我先把 PHP Client 切换官方原生的 Client 端?这样的话,您提供的 tools/generator 我是否需要修改?

@eddycjy
Copy link
Author

eddycjy commented Oct 20, 2018

或者说未来能有这块的考虑吗?

@twose
Copy link
Member

twose commented Oct 20, 2018

要支持的, 我拿你的go server example试一下

@eddycjy
Copy link
Author

eddycjy commented Oct 20, 2018

好的,感谢。我先静候消息...

@eddycjy
Copy link
Author

eddycjy commented Oct 22, 2018

@twose 我周日的时候发现我的 go-grpc-example,在 PHP Client -》 Go Server 时会出现证书校验问题导致握手失败,具体原因我还在排查。但确定是证书有某些问题

若你正在联调,可用官方的证书:https://github.com/grpc/grpc/tree/master/src/php/tests/data
我试过是可用的

@twose
Copy link
Member

twose commented Nov 16, 2018

这一个月都忙于内核其它方面的工作 实在是没有时间看grpc
你可以拉取master的代码, 参考 https://wiki.swoole.com/wiki/page/811.html 来配置SSL证书

@eddycjy
Copy link
Author

eddycjy commented Nov 17, 2018

@twose 基于 PHP 做 Server 的情况下可以用 ssl_cafile。

但是目前问题是 Go 做 Server 的情况下,grpc-client 并不支持设置 credentials 参数。


这个问题已经超出了本 issue 的范畴。可考虑另起一个 issues,关闭本 issues ?

@eddycjy
Copy link
Author

eddycjy commented Nov 17, 2018

没事,你先忙你的

@matyhtf
Copy link
Member

matyhtf commented Nov 19, 2018

$client->set(array(
    'ssl_cert_file'     =>  $your_ssl_cert_file_path,
    'ssl_key_file'     =>  $your_ssl_key_file_path,
));

@twose
Copy link
Member

twose commented Nov 19, 2018

上面对应的是new grpc客户端 的第三个参数 (opt)

@eddycjy eddycjy closed this as completed Nov 19, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants