【问题标题】:Deploying Spring Boot app using Self-Signed Certificate (incl. intermediate CA)使用自签名证书(包括中间 CA)部署 Spring Boot 应用程序
【发布时间】:2018-06-10 02:27:10
【问题描述】:

我对此有点初学者,所以我正在寻找更多的解释而不是快速修复。

我正在尝试通过 HTTPS 部署 Spring Boot 应用程序(为了好玩/测试,永远不会将其投入生产)。我首先创建了一个证书颁发机构(根和中介),然后为我的应用程序创建一个证书(将通过 localhost 访问)并使用中间 CA 签署此证书。我使用this 教程来做到这一点。

然后我使用this 答案将我新创建的本地主机证书导入密钥库,然后由应用程序部署。通过 Chrome 访问时,我遇到了两个问题;

  1. 缺少主题备用名称。此站点的证书不包含包含域名或 IP 地址的主题备用名称扩展。

  2. 证书错误。网站的证书链存在问题 (net::ERR_CERT_AUTHORITY_INVALID)。

现在如果我对问题的理解是正确的,我需要做以下事情;

  1. SAN 是某种证书扩展,它继承了与域名匹配的通用名称。我需要将此扩展注入到我的本地主机证书中。我的问题是我不确定我必须在哪里执行此操作。是在创建证书时吗?

  2. 我不确定为什么会这样。一方面,我觉得这种情况总会发生,因为我的 CA 是我创建的,而不是已建立的 CA,但从我在网上看到的情况来看,这可以解决,但我不明白如何解决。我刚刚将我的 localhost 证书注入到密钥库中。我还需要注入中间证书吗?

另外,我对上面的教程有疑问。 server_cert 和 usr_cert 有什么区别(在签署服务器和客户端证书部分)。该证书是服务器的证书,但它将处理用户身份验证。在那种情况下,我需要使用 server_cert 对吗?

【问题讨论】:

标签: java spring ssl https ssl-certificate


【解决方案1】:

回答我自己的问题,因为我似乎已经想通了。

因此,首先您需要创建根 CA 和中间 CA。如前所述,我遵循this 教程。非常好,但有一些需要强调的地方。

  1. 创建根openssl.cnf 时,请确保将目录设置为root/ca 文件夹的位置。这是在说明中指定的,但最好突出显示它。还要更改默认值(第 81-86 行),以便在执行根 CA 时发现它们已准备就绪。

  2. 在创建根证书时选择一个好的通用名称

  3. 在创建中间 openssl.cnf 时,将目录更改为 root/ca/intermediate 并更改默认值(第 81-86 行)以匹配您的根目录 openssl.cnf

  4. 同样作为 openssl.cnf 的一部分,您需要按照 this 链接添加 subjectAltName。在usr_certserver_cert 下添加subjectAltName = @alt_names。这将在创建证书时添加所需的主题备用名称。我相信您只需要 server_cert 使用它,但为了安全起见,我在两者下都添加了它(无论如何我都没有使用 user_cert)。 DNS.1 正确设置为 localhost。

  5. 创建中间证书时,您的详细信息应与根证书的详细信息相同,因此我在步骤 3 中说复制组织详细信息。通用名称必须不同。

  6. 在创建服务器证书时,您的组织详细信息可能非常但要小心将公用名设置为 localhost

  7. 验证签名服务器证书时,检查版本是否设置为 3(在数据下),主题 CN 设置为 localhostX509v3 Subject Alternative Name 设置为 DNS:localhost

完成后,您需要创建一个信任库以提供给您的 Sring Boot 应用程序。我使用了this 资源的一部分。我使用以下命令创建了我的证书链

cat ./intermediate/certs/localhost.cert.pem ./intermediate/certs/intermediate.cert.pem ./certs/ca.cert.pem > cert-chain.txt

然后我使用以下命令创建了我的商店

openssl pkcs12 -export -inkey ./intermediate/private/localhost.key.pem -in cert-chain.txt -out cert-chain.p12

我没有费心将它转换为 JKS,因为 pkcs12 是新标准,而 Spring Boot 可以很好地使用这种格式。

此时我使用KeyStore Explorer 检查我的密钥存储是否具有正确的层次结构。它有一个证书(本地主机),当我查看证书层次结构时,我看到了根 -> 中间 -> 本地主机。

接下来我将密钥库放在src/main/resources 下,并在我的 YAML 属性文件中添加了以下属性(普通的 .properties 文件也可以)

server.port: 8443
server.ssl:
  key-store: src/main/resources/cert-chain.p12
  key-store-password: secretpassword
  keyStoreType: PKCS12

如果您使用 Spring Security,您可能还需要使用 security.require-ssl: true

此时您将显示ERR_CERT_AUTHORITY_INVALID,但您仍然可以继续。这是因为您的浏览器不信任您的根/中间 CA。如果您通过浏览器查看您的证书,您应该再次看到根 -> 中间 -> localhost 层次结构。将您的中间证书导入浏览器并重新启动浏览器。您现在应该会看到一个绿色安全挂锁。成功!您现在安全了!

注意:有时我会看到 Active content with certificate errors 错误。在这种情况下,请按照here 的说明删除站点存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多