ORA-29024: 证书验证失败 - Apex 和 HTTPS

Rob*_*dez 5 oracle oracle-apex

让我解释一下发生了什么:

  • 数据库:Oracle 19c
  • 顶点:19.1.0.00.15
  • ORDS 独立版本为 19.1.0.r0921545

我完成了配置 Apex 社交登录到 Microsoft AAD 的任务,几乎没有任何问题:

  • 我在 Apex 中创建了身份验证方法。
  • 我注册我的应用程序并在 Azure 中获取 Web 凭据。
  • 我使用根 CA Microsoft 证书在数据库中创建了一个钱包,并配置了实例设置以使用该钱包。
  • 我在数据库服务器中的钱包包含属性 auto_login 以避免使用密码。
  • 我创建了 ACE 条目以允许连接到端口 443 中的 login.microsoftonline.com
  • 尽管这对于问题本身的目的和产生的错误并不重要,但只需评论一下我在内部工作区中配置了钱包设置,以便为 apex 应用程序提供对钱包的访问。

几周以来,该过程运行良好,我为不同工作区中的所有顶点应用程序提供了完美的单唱机制。然而,从几天前开始,我总是遇到同样的错误:

ORA-29024: 证书验证失败

经过一番挖掘后,我意识到有人为传出流量配置了代理。在尝试 Apex 之前,我尝试使用 APEX_WEB_SERVICE 在 SQL 中

使用代理设置向 login.microsoftonline.com 发出请求

select apex_web_service.make_rest_request(
    p_url         => 'https://login.microsoftonline.com',
    p_http_method => 'GET',
    p_wallet_path => 'file:/home/oracle/wallet',
    p_wallet_pwd => 'MyPassword' ,
    p_proxy_override => 'http://myproxy:myport'
  7  ) from dual;
ERROR:
ORA-29273: HTTP request failed
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 1035
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1148
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 934
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 1580
ORA-06512: at "APEX_190100.WWV_FLOW_WEBSERVICES_API", line 408
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

没有代理设置的请求,只是为了看看我是否可以到达那里

SQL> select apex_web_service.make_rest_request(
  2      p_url         => 'https://login.microsoftonline.com',
  3      p_http_method => 'GET',
  4      p_wallet_path => 'file:/home/oracle/wallet'
  5* ) from dual
SQL> /
ERROR:
ORA-29273: HTTP request failed
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 1035
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1148
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 934
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 1580
ORA-06512: at "APEX_190100.WWV_FLOW_WEBSERVICES_API", line 408
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

使用代理设置向 google 发出请求

select apex_web_service.make_rest_request(
    p_url         => 'https://google.com',
    p_http_method => 'GET',
    p_wallet_path => 'file:/home/oracle/wallet',
    p_wallet_pwd => 'MyPassword' ,
  6      p_proxy_override => 'http://myproxy:myport'
  7  ) from dual ;
ERROR:
ORA-29273: HTTP request failed
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 1035
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1148
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 934
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 1580
ORA-06512: at "APEX_190100.WWV_FLOW_WEBSERVICES_API", line 408
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

在没有代理设置的情况下向 google 请求

SQL> select apex_web_service.make_rest_request(
  2      p_url         => 'https://google.com',
  3      p_http_method => 'GET',
  4      p_wallet_path => 'file:/home/oracle/wallet'
  5* ) from dual
SQL> /
ERROR:
ORA-29273: HTTP request failed
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 1035
ORA-12535: TNS:operation timed out
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1148
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 934
ORA-06512: at "APEX_190100.WWV_FLOW_WEB_SERVICES", line 1580
ORA-06512: at "APEX_190100.WWV_FLOW_WEBSERVICES_API", line 408
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  • 这是网络问题还是有关入站/出站流量的代理问题?当我不指定代理时,我可以通过端口 443 访问 Microsoft,但不能访问 Google。
  • 为什么我得到的证书与证书无关,却是无效的?
  • 当我在中间有代理时,如何设置我的 APEX 以使用 Azure 或任何其他提供商上的身份验证?
  • 当我独立使用 ORDS 时,我是否可以继续使用它,或者我需要 Tomcat 的反向代理?

我尝试通过运行将 ACE 配置为在端口中使用 HTTP_PROXY

begin
  sys.dbms_network_acl_admin.append_host_ace(
    host        => 'myproxyserver'
   ,lower_port  => 8080
   ,upper_port  => 8080
   ,ace         => xs$ace_type(
      privilege_list     => xs$name_list('http_proxy')
     ,granted            => true
     ,principal_name     => 'MY_PRINCIPAL'
     ,principal_type     => XS_ACL.PTYPE_DB
    )
  );
end;
/
Run Code Online (Sandbox Code Playgroud)

即使我授予 ACE 对钱包的权限

SET SERVEROUTPUT ON
BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE
  (
    WALLET_PATH => 'file:/home/oracle/wallet',
    ACE => XS$ACE_TYPE(
                        PRIVILEGE_LIST => XS$NAME_LIST('use_passwords','use_client_certificates'),
                        PRINCIPAL_NAME => 'MY_PRINCIPAL',
                        PRINCIPAL_TYPE => XS_ACL.PTYPE_DB
                      )
  );
EXCEPTION WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE('Error while configuring ACL for wallet: '|| SQLERRM);
END;
/
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误。

任何帮助,将不胜感激!谢谢

Rob*_*dez 0

感谢所有发布答案的人,但最终,经过一段时间的努力,我找到了根本原因。事实上Oracle毕竟是对的,因为微软改变了身份验证的处理方式,当你使用Office365和Azure Active Directory时,要么使用Oauth2,要么使用OpenID。

在本例中,我的组织使用的是 Office 365,一开始从以下位置导入 PKI 证书就足够了:

https://www.microsoft.com/pki/mscorp/cps/default.htm

在 Azure Active Directory (AAD) 中完成更改后,您现在还需要来自office.com的全局签名证书

我希望它能够向尝试使用 Apex Social 登录通过 Azure Active Directory 进行身份验证时遇到相同问题的其他用户澄清。

您可以直接从office365.com下载证书

在此输入图像描述

将新的两个证书添加到钱包后,您现在可以毫无问题地进入:

select apex_web_service.make_rest_request(
    p_url         => 'https://login.microsoftonline.com',
    p_http_method => 'GET',
  4      p_wallet_path => 'file:/home/oracle/wallet' ) from dual ;

APEX_WEB_SERVICE.MAKE_REST_REQUEST(P_URL=>'HTTPS://LOGIN.MICROSOFTONLINE.COM',P_
--------------------------------------------------------------------------------


<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
<!DOCTYP


SQL>
Run Code Online (Sandbox Code Playgroud)