spring-boot - 在关键的 Cloud Foundry 中使用受信任的 SSL 证书和 Spring Boot
问题描述
我是 SSL 证书主题的新手,我想安装我购买的 SSL,这样当用户进入我的网站时,他们不会看到不受信任的证书警告,这是我到目前为止所做的步骤
- 使用 keytool 创建了一个 p12 文件
- 从步骤 1 中的文件创建了一个 csr 文件
- 将 csr 上传到我的 ssl 供应商并通过他们对我的域的验证后,下载以下文件:.crt、.ca-bundle、.p7b 文件
我将所有文件(包括我生成的文件)放在资源目录中并添加了以下属性
server.ssl.key-store:classpath:myFile.p12
server.ssl.key-store-password:some_pass
server.ssl.keyStoreType:PKCS12
server.ssl.keyAlias:someAlias
我后来运行了以下命令:keytool -importcert - 尝试将我从 ssl 供应商获得的文件导入到我创建的文件 (.p12)
比我创建了我的 jar 并将其上传到关键云代工厂,但我仍然看到无效的证书消息
我不知道我是否需要在关键平台上做某事或在 spring boot config 上做某事
解决方案
唯一可行的方法是使用 TCP 路由。使用 Cloud Foundry 上的标准 HTTP 路由,流量首先到达负载均衡器,然后到达 Gorouter。TLS 终止将在那里发生,而不是在您的应用程序中。如果您使用 TCP 路由,这将在 TCP 级别进行负载平衡,并允许您的应用程序直接执行 TLS 终止。
也就是说,你真的不想这样做。TCP 路由不太可能允许您选择端口 443,因为一个端口只能分配给一个应用程序。这意味着只有一个使用 TCP 路由的应用程序可以使用端口 443。此外,在大多数情况下,平台运营商只允许 TCP 路由的高编号端口,这意味着没有人能够选择 443。长话短说,你不想要您的用户必须以https://www.example.com:47385的身份访问您的站点,因此您不需要 TCP 路由。
要使用标准 HTTP 路由正确设置它,您需要与您的平台运营团队合作。您将需要一起执行以下操作:
- 获取您要使用的域。
- 获取负载均衡器。这需要配置为将流量路由到基础中的 Gorouter。您可以跳过此步骤并使用现有的负载均衡器,但这会对下面的步骤 #6 产生影响[1]。
- 为您的域配置 DNS,以便它在步骤 #2 中路由到负载均衡器。
- 将域添加为 CF 中的私有或共享域。
- 使用您在第 3 步中创建的域将路由映射到您的应用程序。
- 将您的 TLS 证书和密钥添加到负载均衡器 [1]。
完成所有这些操作后,流向您域的流量将解析为负载均衡器的 IP。您的用户的浏览器将向 LB 发出 HTTPS 请求,它将终止 TLS(如果是 HTTP/layer-7 LB),并转发到 Gorouter(如果有 TCP/layer-4 LB,则 TLS 在此处终止),然后转发到您的应用程序(基于您映射的路线)。
您的应用程序需要查看x-forwarded-for
和x-forwarded-proto
标头以确认请求是否通过 HTTPS 传入,因为它不会直接终止 TLS。
[1] - 这与证书的安装方式有关。使用单独的 LB,您将证书添加到其中并完成。如果您尝试重用平台 LB,则需要将证书添加到现有的证书列表中。此外,如果您的平台运营团队正在使用 TCP/layer-4 负载均衡器,则 TLS 终止不会发生在 LB,它会发生在 Gorouter。这意味着您必须将 TLS 证书加载到 Gorouter 中,这需要 Bosh 部署并且需要更多工作。修改平台 LB 也存在导致基础崩溃的错误风险。出于这些原因以及更多原因,为您的应用添加单独的 LB 通常是可行的方法。
推荐阅读
- lua - 尝试将对象克隆到背包时得到零响应
- node.js - 当我通过 AWS 控制台与 Curl 在 Lambda 中测试无服务器代码时,结果不同
- excel - 如何在 Power Query / Power BI 的列中插入缺失值?
- visual-studio-code - `Extension Development Host` 失败并出现`Cannot find module 'vscode-languageclient' `
- vba - 在整个文档中搜索字符串并一次选择所有实例
- node.js - 在 Synology dsm 中运行时,从 docker 中安装 npm 失败,但在本地工作
- haskell - Haskell 真的不知道给这个取什么名字
- node.js - 我尝试删除 node_modules、package-lock.json 并清除 NPM 的缓存,但是当我尝试安装“@keyv/sqlite”时仍然收到 ELIFECYCLE
- html - 如何修复div中文本而不是图像的对齐方式?
- python - Flask-Admin:具有保留名称的字段的解决方法