我正在尝试使用Docusign REST API(特定于Java)为我的应用程序添加docusign功能。我将com.docusign.esign.model.EventNotification添加到我的EnvelopeDefinition中,以便可以从docusign获得通知-我想知道何时有人签名/查看文档,以便可以更新自己的内部数据并通知链中的下一个应该签署文件的人。
问题出在Spring Security的CSRF保护上。事件通知已发送到我的服务器,但由于403错误而被阻止。
其他所有方法都可以-创建信封,我可以进行嵌入式签名,可以手动轮询docusign以获取信封/收件人状态,等等。而且我确实知道回调会返回。如果我在Spring配置中禁用CSRF保护,则事件通知将按我配置的回调URL进行处理。如果我打开CSRF保护,则服务器的日志会显示403错误,显示回调URL。
很明显,我不想禁用CSRF保护。有选择地专门针对该侦听器URL禁用CSRF保护似乎没有意义。但是我不确定如何进行。我正在仔细阅读文档,但没有看到任何可以提示我如何处理来自docusign的CSRF的提示。
我应该采用其他方法来进行配置吗?也许禁用此回调的CSRF确实有意义,因为我绝对希望它来自某些外部来源。但是,我该如何保护它呢?我是否应该为此事件禁用CSRF并实施其他安全措施?
我正在使用Spring 4.3.8,Docusign API 3.1.0和Struts 2.3.37。
答案 0 :(得分:0)
TL; DR:我建议您设置一个单独的Spring服务器(侦听器),该服务器将接收事件通知。由于没有GET,因此Webhook通知无法传递标准GET / POST CSRF防御中使用的nounce。
典型的GET(表单)后跟POST(表单)流通过将表单发送到浏览器时包括一个nounce值并检查POST中是否提供了相同的值来防范CSRF攻击。
在使用webhook通知(例如DocuSign的Connect / eventNotification系统)时,用于阻止CSRF攻击的取消模式不起作用,因为您的应用程序无法使用,并且无法预计何时将通知通过Webhook发布到您的应用程序。 (您的应用程序不会将任何表单发送到webhook软件。)
此问题是所有webhook实施常见的问题,并非特定于DocuSign。
相反,为了防止有人发送伪造的Webhook通知消息,使用了不同的技术。如今,一种常见且安全的技术是在通知中包含HMAC数字签名。 HMAC加密地保证消息是由授权发件人发送的,并且在传输过程中不会被更改。
您的应用应针对其GET / POST流使用反CSRF防护。如果您不能仅对应用程序上的通知端点禁用CSRF检查,建议您使用两台服务器,其中一台将仅接收webhook事件通知。