Bazel 远程缓存不适用于 certificates/TLS
Bazel Remote Cache not working with certificates/TLS
我 运行nig Bazel 远程缓存来自 https://github.com/buchgr/bazel-remote inside docker,通过 运行nig 以下命令启动 http 和 grpc 服务器:
docker pull buchgr/bazel-remote-cache
docker run -u 1000:1000 -v /path/to/cache/dir:/data -p 9093:8080 -p 9094:9092 buchgr/bazel-remote-cache
到目前为止,我可以通过 运行 宁以下命令之一从我的客户 运行 进行一些测试:
bazelisk test --remote_cache=http://<SERVER_IP>:<SERVER_PORT> <TEST_TARGET>
bazelisk test --remote_cache=grpc://<SERVER_IP>:<SERVER_PORT> <TEST_TARGET>
但是当我通过向服务器调用添加以下标志将我的服务器置于 运行 而不是 TLS 时:
-v /path/to/certificate_authority:/etc/bazel-remote/ca_cert
-v /path/to/server_cert:/etc/bazel-remote/server_cert
-v /path/to/server_key:/etc/bazel-remote/server_key
--tls_ca_file=/etc/bazel-remote/ca_cert
--tls_cert_file=/etc/bazel-remote/server_cert
--tls_key_file=/etc/bazel-remote/server_key
虽然我创建了根 CA 证书来签署我的 server's and clients' 证书,但我无法通过 https 或 grpcs 访问我的服务器。 https:
出现以下错误
avax.net.ssl.SSLHandshakeException: General OpenSslEngine problem
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
以及 grpcs 的以下内容:
javax.net.ssl.SSLHandshakeException: General OpenSslEngine problem
java.security.cert.CertificateException: No subject alternative names present
ERROR: Failed to query remote execution capabilities: General OpenSslEngine problem
此问题是否与根 CA 证书本身是自签名的事实有关,还是我在做其他愚蠢的事情?
我使用了来自以下 link 的完全相同的命令:https://github.com/bazelbuild/bazel/blob/master/src/test/testdata/test_tls_certificate/README.md
对于 grpcs,您的问题是客户端使用的主机名与证书不匹配。当我连接到 localhost
(就像那些默认的方向)时,它起作用了:
bazel test --remote_cache=grpcs://localhost:9094 --tls_client_certificate=/path/to/client.crt --tls_client_key=/path/to/client.pem --tls_certificate=/path/to/ca.crt //...
但是如果我切换到 127.0.0.1
,它就会像您看到的那样失败。如果您有主机名,更改 SERVER_CN
以匹配它应该可以。但是 IP 地址有点棘手,因为您必须使用主题备用名称将证书绑定到 IP。我知道的最直接的方法是用这一行创建一个文件 extensions.cnf
:
subjectAltName=IP:<SERVER_IP>
然后在生成证书时将该文件与 -extfile
一起使用。您可以在说明的末尾添加此命令以生成包含它的新证书:
openssl x509 -req -passin pass:1111 -days 358000 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -extfile extensions.cnf
我认为 bazel 不支持 https 的客户端证书。您可以解决 运行 使用自定义信任库的问题,但我不知道如何传递客户端证书。使用该选项的代码的唯一部分看起来像是特定于 GRPC 的。文档并没有说清楚...
更多 x509 基础知识:CA 证书通常是自签名的,因为作为信任根,客户端不关心它们是如何签名的。这些指令生成的服务器证书不是自签名的,这与 echo 语句相反。客户端验证他们从服务器收到的证书是否与他们尝试连接的实体相匹配(例如,为 yourwebsite.com 颁发的证书不能用来伪装成 google.com) . CN 是一个可以将它们绑定在一起的字段,subjectAltName 是一种扩展,可用于将证书绑定到各种格式的多个实体。
我 运行nig Bazel 远程缓存来自 https://github.com/buchgr/bazel-remote inside docker,通过 运行nig 以下命令启动 http 和 grpc 服务器:
docker pull buchgr/bazel-remote-cache
docker run -u 1000:1000 -v /path/to/cache/dir:/data -p 9093:8080 -p 9094:9092 buchgr/bazel-remote-cache
到目前为止,我可以通过 运行 宁以下命令之一从我的客户 运行 进行一些测试:
bazelisk test --remote_cache=http://<SERVER_IP>:<SERVER_PORT> <TEST_TARGET>
bazelisk test --remote_cache=grpc://<SERVER_IP>:<SERVER_PORT> <TEST_TARGET>
但是当我通过向服务器调用添加以下标志将我的服务器置于 运行 而不是 TLS 时:
-v /path/to/certificate_authority:/etc/bazel-remote/ca_cert
-v /path/to/server_cert:/etc/bazel-remote/server_cert
-v /path/to/server_key:/etc/bazel-remote/server_key
--tls_ca_file=/etc/bazel-remote/ca_cert
--tls_cert_file=/etc/bazel-remote/server_cert
--tls_key_file=/etc/bazel-remote/server_key
虽然我创建了根 CA 证书来签署我的 server's and clients' 证书,但我无法通过 https 或 grpcs 访问我的服务器。 https:
出现以下错误avax.net.ssl.SSLHandshakeException: General OpenSslEngine problem
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
以及 grpcs 的以下内容:
javax.net.ssl.SSLHandshakeException: General OpenSslEngine problem
java.security.cert.CertificateException: No subject alternative names present
ERROR: Failed to query remote execution capabilities: General OpenSslEngine problem
此问题是否与根 CA 证书本身是自签名的事实有关,还是我在做其他愚蠢的事情?
我使用了来自以下 link 的完全相同的命令:https://github.com/bazelbuild/bazel/blob/master/src/test/testdata/test_tls_certificate/README.md
对于 grpcs,您的问题是客户端使用的主机名与证书不匹配。当我连接到 localhost
(就像那些默认的方向)时,它起作用了:
bazel test --remote_cache=grpcs://localhost:9094 --tls_client_certificate=/path/to/client.crt --tls_client_key=/path/to/client.pem --tls_certificate=/path/to/ca.crt //...
但是如果我切换到 127.0.0.1
,它就会像您看到的那样失败。如果您有主机名,更改 SERVER_CN
以匹配它应该可以。但是 IP 地址有点棘手,因为您必须使用主题备用名称将证书绑定到 IP。我知道的最直接的方法是用这一行创建一个文件 extensions.cnf
:
subjectAltName=IP:<SERVER_IP>
然后在生成证书时将该文件与 -extfile
一起使用。您可以在说明的末尾添加此命令以生成包含它的新证书:
openssl x509 -req -passin pass:1111 -days 358000 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -extfile extensions.cnf
我认为 bazel 不支持 https 的客户端证书。您可以解决 运行 使用自定义信任库的问题,但我不知道如何传递客户端证书。使用该选项的代码的唯一部分看起来像是特定于 GRPC 的。文档并没有说清楚...
更多 x509 基础知识:CA 证书通常是自签名的,因为作为信任根,客户端不关心它们是如何签名的。这些指令生成的服务器证书不是自签名的,这与 echo 语句相反。客户端验证他们从服务器收到的证书是否与他们尝试连接的实体相匹配(例如,为 yourwebsite.com 颁发的证书不能用来伪装成 google.com) . CN 是一个可以将它们绑定在一起的字段,subjectAltName 是一种扩展,可用于将证书绑定到各种格式的多个实体。