将Grails配置为使用证书身份验证进行POST

时间:2018-08-12 05:13:08

标签: java ssl grails ssl-certificate apache-nifi

我对使用证书和安全性还很陌生,所以请原谅我。我遵循this guide来设置我的Grails应用程序,使其可以在具有自签名证书的HTTPS上运行。

我正在尝试与在同一台计算机上运行的另一个HTTPS网络(一个Nifi独立实例)建立双向SSL。我可以让Nifi实例通过HTTPS与Grails对话,但是Grails与Nifi(特别是与ListenHTTP处理器)对话时遇到了问题。

我希望有人可以建议通过HTTPS发布时如何在Grails中使用证书身份验证。

Nifi使用证书身份验证;但是根据上面的指南,Grails只指定了一个密钥库(用于接收请求?),所以我有点不满意。通过指定--cert和--key属性,我可以成功将URL卷曲到Nifi的REST API,但是由于最终产品将是客户端计算机上的WAR,因此我想以“正确的方式”进行设置,我相信客户端计算机上的文件对安全性来说是非常重要的事情。

RestBuilder的早期开发期间,通过HTTP进行双向双向通信就足够了,但是,我找不到提及将其与证书身份验证一起使用的信息(文档中仅涉及基本身份验证?)。

HTTPBuilder在我寻找替代方法时会显示很多内容,但是在查看relevant documentation (line 139 'certificate()')时,它表明它需要整个密钥库JKS和密码。我认为这很接近,但考虑到我只有一个密钥库,这与我要寻找的不完全相同。我愿意在这里纠正。

请注意,我至少要等到问题发布后的第二天才能回复。

1 个答案:

答案 0 :(得分:0)

在建立传出HTTPS连接时,如果远程端点(在本例中为Apache NiFi)需要客户端证书身份验证,则发起端点(Grails)将尝试提供证书。在以下情况下,Grails用于将自身标识为服务的证书可以在以下情况下使用:

  1. 证书没有设置ExtendedKeyUsage扩展名,或者如果设置了扩展名,则同时存在ServerAuthClientAuth值。如果缺少ClientAuth,则系统将不允许将此证书用于客户端身份验证,这是此交换中的必要角色。
  2. 该证书的有效SubjectAlternativeName值与其在其上运行的主机名匹配。 RFC 6125规定应将SAN值用于证书标识,而不是Distinguished NameDN)和Common NameCN)。因此,如果Grails应用程序在https://grails.example.com上运行,则SAN必须包含grails.example.com*.example.com的值。
  3. 必须将证书导入NiFi的信任库中,以允许NiFi验证此证书的提供者。
  4. NiFi必须对此用户具有ACL权限。可以通过UI或通过在首次启动NiFi之前修改conf/authorizers.xml文件来完成此操作。有关更多信息,请参见NiFi Admin Guide - Authorizers Configuration

您可以理解将cert.pemkey.key文件保留在客户端计算机上的担心,但是其中包含的敏感信息与密钥库中的数据相同。在某些时候,Grails应用程序必须可以访问私钥才能执行HTTPS流程,因此在密钥库中拥有私钥在功能上是等效的(您不会提及在*.key文件上拥有密码,但是显然您应该在密钥库上输入密码)。