Java 使用自签名证书(包括中间CA)部署Spring Boot应用程序

Java 使用自签名证书(包括中间CA)部署Spring Boot应用程序,java,spring,ssl,https,ssl-certificate,Java,Spring,Ssl,Https,Ssl Certificate,我是一个初学者,所以我希望更多的解释,而不是快速修复 我正在尝试通过HTTPS部署Spring Boot应用程序(为了好玩/测试,永远不会投入生产)。首先,我创建了一个证书颁发机构(root和intermediate),然后为我的应用程序创建了一个证书(将通过localhost访问),并使用中间CA对该证书进行签名。我用教程来做这个 然后,我使用answer将新创建的本地主机证书导入密钥库,然后由应用程序部署。当通过Chrome访问时,我遇到了两个问题 缺少主题替代名称。此站点的证书不包含包含域

我是一个初学者,所以我希望更多的解释,而不是快速修复

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

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

  • 缺少主题替代名称。此站点的证书不包含包含域名或IP地址的主题替代名称扩展名

  • 证书错误。站点的证书链存在问题(net::ERR\u CERT\u AUTHORITY\u INVALID)

  • 现在,如果我对问题的理解是正确的,我需要做以下几点:

  • SAN是某种证书扩展,它继承了与域名匹配的公共名称。我需要将此扩展注入本地主机证书。我的问题是,我不知道在哪里我必须这样做。是在证书创建时吗

  • 我不知道为什么会这样。从一方面来说,我觉得这种情况总会发生,因为我的CA是我创建的,而不是一个已建立的CA,但从我在网上看到的情况来看,这是可以解决的,但我不明白如何解决。我刚刚将本地主机证书注入密钥库。我是否也需要注入中间证书


  • 另外,我有一个关于上述教程的问题。服务器证书和usr证书之间的区别是什么(在签名服务器和客户端证书部分下)。证书是服务器的证书,但它将处理用户身份验证。在这种情况下,我需要使用服务器证书,对吗?

    回答我自己的问题,因为我似乎已经解决了这个问题

    因此,首先需要创建根CA和中间CA。如前所述,我遵循了教程。这是非常好的,但有一些事情要强调

  • 创建root
    openssl.cnf
    时,请确保将目录设置为
    root/ca
    文件夹的位置。这在说明中有详细说明,但最好突出显示。还要更改默认值(第81-86行),以便在执行根CA时可以找到它们

  • 创建根证书时,请选择一个好的通用名称

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

  • 此外,作为openssl.cnf的一部分,您需要根据链接添加subjectAltName。在
    usr\u cert
    server\u cert
    下添加
    subjectAltName=@alt\u names
    。这将在创建证书时添加所需的使用者备选名称。我相信您只需要在
    服务器\u证书
    中使用它,但为了安全起见,我在这两个证书下都添加了它(反正我没有使用
    用户\u证书
    )<代码>DNS.1已正确设置为本地主机

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

  • 创建服务器证书时,您的组织详细信息可能非常重要,但请小心将通用名称设置为
    localhost

  • 验证签名的服务器证书时,请检查版本是否设置为3(在“数据”下),主题CN设置为
    localhost
    ,而
    X509v3主题备选名称设置为
    DNS:localhost

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

    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
    
    然后,我使用以下命令创建了我的存储

    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可以很好地使用这种格式

    在这一点上,我然后用来检查我的密钥存储是否具有正确的层次结构。它有一个证书(localhost),当我查看证书层次结构时,我看到了root->intermediate->localhost

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

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

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


    注意:有时我看到一个带有证书错误的
    活动内容。在本例中,请按说明删除站点存储。

    我通过向我的服务器证书扩展添加一个扩展名(多亏了此资源;