是否必须使用有效SSL证书才能让WebTransport服务器示例正常运行?
问题背景
我尝试了多个WebTransport服务器示例,但无法在Chrome 111中建立WebTransport连接。
测试用服务器示例
- .NET WebTransport演示服务器
- ASP.NET Core官方WebTransport示例服务器
- Google Chrome官方Python WebTransport服务器
测试用客户端
- Google Chrome官方WebTransport客户端页面
- 本地部署的WebTransport测试页面
出现的错误
错误类型1:
net::ERR_CONNECTION_RESET.
WebTransportError: Opening handshake failed.
错误类型2:
net::ERR_QUIC_PROTOCOL_ERROR.QUIC_TLS_CERTIFICATE_UNKNOWN (TLS handshake failure (ENCRYPTION_HANDSHAKE) 46: certificate unknown).
WebTransportError: Opening handshake failed.
已尝试的解决方法
为使自签名SSL证书生效,我尝试了两种方式:
- 使用Chrome命令行参数:
--user-data-dir=chromequicdata --origin-to-force-quic-on=localhost:4433 --ignore-certificate-errors-spki-list=Gi/HIwdiMcPZo2KBjnstF5kQdLI5bPrYJ8i3Vi6Ybck=
- 通过WebTransport构造函数传入服务器证书哈希:
new WebTransport(url, { serverCertificateHashes: [ {algortithm: 'sha-256', value: decodeBase64('Gi/HIwdiMcPZo2KBjnstF5kQdLI5bPrYJ8i3Vi6Ybck=')} ] });
核心提问
请问是否必须获取有效SSL证书才能让这些服务器示例正常运行?
解答
不一定必须使用权威CA签发的有效SSL证书,自签名证书完全可以用于本地测试,但你需要确保配置步骤完全正确,以下是关键排查点:
1. 代码拼写错误
你在serverCertificateHashes配置里写的algortithm是拼写错误,正确字段名是algorithm——这个小错误会直接导致客户端无法正确识别证书哈希规则,引发握手失败。
2. Chrome命令行参数校验
--origin-to-force-quic-on必须和服务器实际监听的端口完全匹配,比如服务器用443端口就写localhost:443,端口不对应会强制QUIC失败。--ignore-certificate-errors-spki-list中的SPKI哈希必须是你自签名证书的正确值,可通过以下openssl命令生成:
确保生成的哈希和你使用的完全一致,任何字符或空格差异都会导致校验失效。openssl x509 -in your-cert.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
3. 服务器端证书配置
- 确认服务器确实加载了你生成的自签名证书和私钥,比如.NET/Kestrel示例要检查
UseHttps配置的证书路径是否正确,Python示例要核对证书文件路径无误。 - 部分服务器需要显式启用QUIC协议,比如Kestrel需在配置中开启QUIC支持。
4. Chrome功能开关检查
虽然Chrome 111默认支持WebTransport,但仍建议确认chrome://flags/#enable-webtransport处于启用状态。
只要以上配置全部正确,自签名证书完全可以正常建立WebTransport连接,无需权威CA签发的证书。
内容的提问来源于stack exchange,提问作者fuweichin

