我对使用证书和安全性还很陌生,所以请原谅我。我遵循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和密码。我认为这很接近,但考虑到我只有一个密钥库,这与我要寻找的不完全相同。我愿意在这里纠正。
请注意,我至少要等到问题发布后的第二天才能回复。
答案 0 :(得分:0)
在建立传出HTTPS连接时,如果远程端点(在本例中为Apache NiFi)需要客户端证书身份验证,则发起端点(Grails)将尝试提供证书。在以下情况下,Grails用于将自身标识为服务的证书可以在以下情况下使用:
ExtendedKeyUsage
扩展名,或者如果设置了扩展名,则同时存在ServerAuth
和ClientAuth
值。如果缺少ClientAuth
,则系统将不允许将此证书用于客户端身份验证,这是此交换中的必要角色。 SubjectAlternativeName
值与其在其上运行的主机名匹配。 RFC 6125规定应将SAN值用于证书标识,而不是Distinguished Name
(DN
)和Common Name
(CN
)。因此,如果Grails应用程序在https://grails.example.com
上运行,则SAN必须包含grails.example.com
或*.example.com
的值。 conf/authorizers.xml
文件来完成此操作。有关更多信息,请参见NiFi Admin Guide - Authorizers Configuration。 您可以理解将cert.pem
和key.key
文件保留在客户端计算机上的担心,但是其中包含的敏感信息与密钥库中的数据相同。在某些时候,Grails应用程序必须可以访问私钥才能执行HTTPS流程,因此在密钥库中拥有私钥在功能上是等效的(您不会提及在*.key
文件上拥有密码,但是显然您应该在密钥库上输入密码)。