确定需要哪个证书才能使用 Oracle utl_http 执行 https 发布
Posted
技术标签:
【中文标题】确定需要哪个证书才能使用 Oracle utl_http 执行 https 发布【英文标题】:Identifying which certificate is needed in order to perform https post using Oracle utl_http 【发布时间】:2020-01-03 14:02:35 【问题描述】:短篇小说 我正在尝试使用 Oracle 中的 utl_http 实用程序从 PL/SQL 脚本发送 POST 请求。我已经能够使用 http 发送请求,但不是 https。我已将我认为必要的证书添加到 Oracle 钱包中,并且我相信它们正在被导入和使用(但老实说,这有点难以验证)。我目前的假设是来自我们的数据库服务器的调用是通过代理服务器传递的,这会以某种方式弄乱 https / 证书功能的某些部分。
支持性证据(可能?):我试图通过webhook.site 向虚拟服务发出调用(POST 请求)。同样,我使用 http,但不是 https - 后者会导致证书验证错误。
然后我尝试使用postman 复制该行为,并且基本上产生相同的结果,除非我摆弄设置:
邮递员初始结果:
无法得到任何回应
连接到https://webhook.site/950时出错...
禁用 SSL 验证
在 Post man 设置下,我关闭了 SSL 证书验证,然后重试。这一次,我收到了200 OK
的回复,并确认 webhook 收到了 post 请求。
错误似乎是由于缺少证书,但我不知道是哪个证书或如何配置它。我的假设是,如果我可以让它为 Postman 的 webhook-url 工作(不禁用证书验证),那么我以后也应该能够让它从 PL/SQL 工作。
当我在浏览器中查看 webhook 站点并检查证书时,webhook 证书是最低的证书(叶节点?)。在它上面有一个与我工作的公司相关的中间证书,然后是一个也与该公司相关的根证书。根节点的名称类似于“Company Proxy Server CA” - 所以我假设代理以某种方式操纵我的请求并在此处插入它自己的证书。
我已经尝试下载所有这些证书并将它们导入我的证书存储,以及在 Postman 设置下(在证书下)以各种组合导入它们,但似乎没有任何区别;所有使用 HTTPS 发布的尝试都会在我的 Postman 控制台中产生以下错误:
发布https://webhook.site/9505...
错误:无法验证第一个证书
任何有关如何解决此问题的想法,或至少获得有关该做什么的更多信息将不胜感激。
【问题讨论】:
你检查过这个post吗? 您好,感谢您的意见。是的,我已通读该线程。不过,我认为它是一种不得已的解决方案,而且也确实是一种 hack。我认为解决这个问题的理想方法是正确配置现有组件,而不是仅仅为了规避问题而添加另一个代理。 这样做可能会很有趣:echo "" | openssl s_client -connect webhook.site:443 > foo.txt ...看看所协商的内容是否出乎意料。 【参考方案1】:在 Postman 中关闭“SSL 证书验证”仅意味着 它(即 Postman)在发出请求时不会检查 SSL 证书的有效性。这意味着它将按原样发送证书。因为如果设置为 ON,您的连接将失败,这意味着 Postman 无法验证您的证书的有效性。
这很可能是您尝试发布到的实际服务的情况,他们无法验证证书。该服务是否在您的公司网络之外?它是公开的还是贵公司拥有的?该服务托管在哪里?他们需要什么证书?
顺便说一句,TLS 客户端证书是作为建立 SSL 连接的一部分发送的,而不是作为 HTTP 请求的一部分。 TLS 握手(以及客户端和服务器证书的交换/验证)发生在发送任何 HTTP 消息之前。
我认为这可能是端口阻塞问题。
【讨论】:
【参考方案2】:您说...““公司代理服务器 CA” - 所以我假设代理以某种方式操纵我的请求并在此处插入它自己的证书。”
这意味着您的客户端软件在其受信任的证书列表中需要您的公司代理服务器 CA。如果那个客户的名单是预言机钱包的名单……
https://knowledge.digicert.com/solution/SO979.html
这谈到了如何做到这一点。
另外,如果您运行 postman 的系统有一个非基于 oracle 的钱包受信任证书(可能是操作系统?),您将必须执行一些操作,例如在工作站上将信任添加到您的帐户
https://www.thewindowsclub.com/manage-trusted-root-certificates-windows
为了让代理服务器证书受信任。
一旦您建立连接的证书根据正在使用的客户端的有效配置具有信任根,您就可以验证该证书。
【讨论】:
【参考方案3】:几个可能的问题:
-
服务器实际上并不支持 HTTPS。将浏览器连接到您发布到的 URL,并查看您是否收到响应。 (看起来您已经这样做了,但为了完整起见,我正在记录它。)
服务器使用服务器名称指示 (SNI) 扩展来确定要发回的证书链,但您的 POSTing 客户端不发送该扩展。您可以通过查找要发布到的主机的 IP 来识别这种情况,然后在浏览器中转到 https://nnn.nnn.nnn.nnn/(显然在此处使用 IP,而不是文字字符串“nnn.nnn.nnn.nnn”) ,并检查它返回的证书链。如果它与您从第 1 步得到的不同,这就是您的问题,您需要弄清楚如何在您的 Oracle PL/SQL 客户端中获得 SNI 支持或在该主机名上公开 POST 端点。 (或者,您也许可以使用这些证书来启动您的 Oracle Wallet,但证书中的主机名可能与您连接的主机名不匹配。)
你有一个代理在路上。我不认为这是正在发生的事情,因为这基本上只会在您进行客户端证书身份验证时引起问题。 (如果这是问题或条件,您需要将这些证书导入您的受信任钱包;您还需要确保您发布的服务器通过相同的代理。否则,您需要确保实际运行代码的机器所看到的代理的证书颁发机构在钱包中。这可能需要运行该机器的系统/网络管理员的协助,并连接到网络。)
HTTPS 是一个挑剔的野兽。许多很多事情必须完全正确地工作,TLS 连接才能正常工作,证书才能正确验证(TLS 端口必须响应,客户端和服务器必须同意使用相同版本的 TLS,客户端和服务器必须同意使用相同的密码组合,服务器提供的证书链必须由客户端识别的 CA 颁发,并且该链中的叶证书必须证明客户端请求的名称。
需要 SNI 来支持单个主机上的多个名称,而不会混淆同一主机上其他名称的认证。不幸的是,SNI 是已经标准化了十多年的事物之一(RFC 3546),但许多企业级软件尚未实施。
【讨论】:
以上是关于确定需要哪个证书才能使用 Oracle utl_http 执行 https 发布的主要内容,如果未能解决你的问题,请参考以下文章
如何查询一个oracle数据库中所有表的所有字段哪个包含特定字符串?