Oracle Cloud ›Ошибка utl_http с ORA-29273: сбой HTTP-запроса ORA-29024: сбой проверки сертификата ORA-06512

Я работаю с временной учетной записью Oracle Cloud. То, что я считал идентичной функциональностью, работает с веб-службой Apex, но не с UTL_HTTP. Итак, этот фрагмент работает и возвращает искомую проблему.

DECLARE   
   L_json_response     varchar2(32767);
BEGIN   
   apex_web_service.g_request_headers(1).name := 'Content-Type';   
   apex_web_service.g_request_headers(1).Value := 'application/json';         
   L_json_response := apex_web_service.make_rest_request ( p_url => 
   'https://mycompany.atlassian.net/rest/api/3/issue/BLABLA-23862', p_http_method => 'GET', 
    p_username => 'My.Username@mycompany', p_password => 'osBJWHhPasdffNVOQ5AA11D5'); -- Password is my Jira API Token      
   EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'An error was encountered - 
  '||SQLCODE||' -ERROR- '||SQLERRM);
END;

Я не могу использовать веб-службу Apex в конечном продукте, и нам нужно использовать UTL_HTTP. Насколько я понимаю, этот фрагмент должен делать то же самое:

DECLARE
    req utl_http.req;
    res utl_http.resp;
    url varchar2(4000) := 'https://mycompany.atlassian.net/rest/api/3/issue/BLABLA-23862';
    buffer varchar2(4000);
BEGIN
    req := utl_http.begin_request(url, 'GET');
    utl_http.set_header(req, 'Content-Type', 'application/json');
    utl_http.set_header(req, 'Authorization', 'Basic ' || utl_encode.base64_encode('my.msername@mycompany:osBJWHhPasdffNVOQ5AA11D5'));

    res := utl_http.get_response(req);
    utl_http.read_text(res, buffer);
END;

Но возвращается:

ORA-29273: сбой HTTP-запроса
ORA-29024: сбой проверки сертификата
ORA-06512: в SYS.UTL_HTTP, строка 639
ORA-06512: в SYS.UTL_HTTP, строка 1415 ORA- 06512 ...


person user1685493    schedule 29.12.2020    source источник
comment
https://oracle-base.com/articles/misc/utl_http-and-ssl   -  person OldProgrammer    schedule 29.12.2020


Ответы (2)


В каком-то смысле @OldProgrammer ответил на этот комментарий от 29.12.2020, но я не знаю, как приписать ответ.

Мне нужно было либо связать код UTL_HTTP с кошельком по умолчанию, либо создать новый. APEX_WEB_SERVICE, вероятно, делает это неявно, в то время как UTL_HTTP должен это прописать.

Мой вопрос касался Oracle Cloud, и я не мог заставить цепочку инструментов из ссылки OldProgrammers работать в Oracle Cloud. Выкатил виртуальную машину, и все работает.

person user1685493    schedule 04.01.2021

Ключ - это UTL_HTTP.SET_WALLET('');. Вам необходимо установить кошелек (с параметром пустой строки) перед первоначальным HTTP-запросом. Следующий фрагмент кода протестирован в базе данных Oracle Cloud ATP (Autonomous Transition Processing):

  1. Настроить сетевой ACL
BEGIN
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl  => 'my_acl.xml',
                                    description => 'ACL for http request.',
                                    principal => 'MY_USER',
                                    is_grant  => true,
                                    privilege => 'connect');
  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'my_acl.xml',
                                       principal => 'MY_USER',
                                       is_grant  => true,
                                       privilege => 'resolve');
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'my_acl.xml', host => 'www.oracle.com');
END;
  1. Тестовый запрос https
DECLARE
  l_text VARCHAR2(32767);
BEGIN
  UTL_HTTP.SET_WALLET('');
  l_text := UTL_HTTP.REQUEST('https://www.oracle.com/index.html');
  dbms_output.put_line(l_text);
END;

См. официальный документ и пример (внизу страницы):

person Dai    schedule 06.03.2021