【问题标题】:Not able to achieve end to end encryption in openshift 4.3 route无法在 openshift 4.3 路由中实现端到端加密
【发布时间】:2020-06-09 16:16:21
【问题描述】:

我们有一个 AngularJS 应用程序,其中我们有一个 nodejs 应用程序,它仅在 HTTPS 端口为 443 时为服务主机名创建证书和密钥。然后在 nginx 中使用创建的证书,如下所示:

<% if ENV["HTTPS__ENABLED"] == "true" %>
listen <%= ENV["HTTPS__PORT"] %> ssl;
# These files are generated by the node app
ssl_certificate /cert.csr;
ssl_certificate_key /tls_private_key.csr;
ssl_protocols TLSv1.2;
<% end %>

但是当我在路由中设置 443 端口并重新加密终止时,在访问应用程序时会出现以下错误

Application is not available

The application is currently not serving requests at this endpoint. It may not have been started or is still starting.

请求甚至没有到达 pod。如果我创建带有边缘终止的路由会给出错误

400 Bad Request
The plain HTTP request was sent to HTTPS port

与边缘终止一样,从路由器到 pod 没有加密。 我不能使用直通终止策略,因为我们的路径中有直通终止不支持的路径。

谁能告诉我如何在 openshift 4.3 中实现端到端加密。我们在这里不使用自定义域。

我正在检查创建重新加密路由的方式 oc create route reencrypt --service=frontend --cert=tls.crt --key=tls.key --dest-ca-cert=destca.crt --ca-cert=ca.crt --hostname=www.example.com

但是由于我们没有使用自定义域,我们的路由应该使用默认证书和密钥,对吗?所以不需要提供这些权利吗?我不知道如何为这条路线创建 --dest-ca-cert 。

【问题讨论】:

  • 在您的情况下,重新加密是正确的方法。您可以为您的重新加密路由添加oc get route &lt;name-of-route&gt; -o yaml 的输出,从而为您提供“应用程序不可用”错误吗?此外,您应该能够运行oc create route reencrypt --service=frontend --dest-ca-cert=destca.crt 来创建此路由,其中​​“destca.crt”是您的 NGINX“/cert.csr”中用于您的证书的 CA 的证书,这行得通吗?如果不是,错误信息是什么?
  • 这是路由的yaml----->主机:mts-test.mts-trep-78cduhduc7388d9333-0000.us-south.containers.appdomain.cloud 路径:/ptd-ui/端口:targetPort:ptd-ui-https tls:insecureEdgeTerminationPolicy:重定向终止:重新加密到:种类:服务名称:ptd-ui-test-service
  • @simon 如何创建 destca.crt 或者它应该与 nginx 中使用的 cert.csr 相同?
  • destca.crt 应包含根 CA 证书,该证书也与您的 cert.csr 中的根相同。所以使用openssl从你的证书链中提取根证书。
  • @simon cert.csr 里面只有一个证书而不是一个链。这些证书和密钥是在 pod 中创建的。那么为了创建 destca 我应该从 pod 复制到我的本地机器吗?然后提取根证书?您能否提供一种从此类 csr 获取根证书的方法?

标签: encryption openshift


【解决方案1】:

TLS 已经在我们的 AngularJS 应用程序中使用 nodejs 应用程序启用,该应用程序创建由 Nginx 使用的证书和密钥。集群内的 Pod 使用 TLS,它由 CA 颁发,这是我们应该为路由放入 destinationCACert 的证书.CA 证书是路由器确定它是否可以信任上游 POD 进行 TLS 通信的方式。

在创建重新加密路由时,我们使用位于/var/run/secrets/kubernetes.io/serviceaccount/ca.crt 的 ca.cert 作为目标证书。我们在创建路由时选择了 HTTPS 端口。 oc create route reencrypt --service=frontend --cert=tls.crt --key=tls.key --dest-ca-cert=destca.crt --ca-cert=ca.crt --hostname=www.example.com

这里不需要 tls.cert 和 tls.key,因为我们使用的是 openshift 集群的默认域。我们使用的唯一证书是 --dest-ca-cert,它也可以在 openshift-service-ca 命名空间的秘密 service-serving-cert-signer-sa-token-l42lm 中找到

【讨论】:

    【解决方案2】:

    对于重新加密路由,需要为 pod 配置 TLS 证书,因为它必须响应源自 Openshift 路由器的 TLS 请求。从尝试使用边缘路由时遇到的错误中可以明显看出这一点。

    现在,此 TLS 证书必须使用您要在实际路由中使用的相同主机名创建。此 TLS 证书不必是 CA 签名的证书,但主机名必须与路由匹配。只有这样路由才能将流量转发到您的 pod。

    【讨论】:

    • 所以我的路由中有主机mts-test.mts-trep-78cduhduc7388d9333-0000.us-south.containers.appdomain.cloud。所以我应该使用我的主机名 mts-test.mts-trep-78cduhduc7388d9333-0000.us-south.containers.appdomain.cloud 的目标证书创建重新加密路由?
    • 是的,您可能会遇到超过 64 个字符的主机名问题。这可能会有所帮助unix.stackexchange.com/questions/234324/…
    • 我不能使用来自 openshift 的默认证书吗?由于我没有使用自定义域。目标证书指定 CA 证书来验证端点证书对吗?
    • 要配置您的 Angular js 应用程序以侦听安全端口,您需要同时配置 crt 和密钥。
    • 在我的 nginx 应用程序中,我同时拥有密钥和证书。但是在创建重新加密路由oc create route reencrypt --service=frontend --cert=tls.crt --key=tls.key --dest-ca-cert=destca.crt --ca-cert=ca.crt --hostname=www.example.com 时,不需要提及--cert 和--key 对吗?因为我没有使用自定义域。我只需要提供指定 CA 证书来验证端点证书的目标证书吗?我的问题是如何创建这样的目标证书?有相关文件吗?
    猜你喜欢
    • 2014-10-06
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多