Укажите сертификат и ключ в oracle кошельке - PullRequest
0 голосов
/ 07 февраля 2020

Я делаю запрос POST в PL / SQL, но сталкиваюсь с ошибкой Certificate validation failure. Если я запускаю его вне базы данных, в cURL или Postman он работает нормально.

В последних программах мне нужно указать сертификат клиента, закрытый ключ и сертификат CA. В cURL я использую --cert, --key и --cacert.

При работе в PL / SQL я могу указать только кошелек, в котором хранятся эти файлы, но я не выгляжу иметь возможность указать, какой сертификат и ключ я хочу использовать, и я думаю, что именно поэтому у меня возникают проблемы?

declare
    req utl_http.req;
    res utl_http.resp;
    url varchar2(4000) := 'https://server/';
    buffer varchar2(4000);
begin
    utl_http.set_wallet('file:wallet_path');
    req := utl_http.begin_request(url,'POST');
    utl_http.set_header(req,'header_name','header_text');
    res := utl_http.get_response(req);
    begin
        loop
            utl_http.read_line(res, buffer);
            dbms_output.put_line(buffer);
        end loop;
        utl_http.end_response(res);
    exception when utl_http.end_of_body then
        utl_http.end_response(res);
    end;
end;
/

1 Ответ

0 голосов
/ 10 февраля 2020

UTL_HTTP не имеет такой функциональности (и, возможно, содержит некоторые ошибки), но вы можете попробовать использовать Java Хранимые процедуры. Это намного более гибко, и я исправил ошибку «Ошибка проверки сертификата» только таким способом.

Существует пример функции запроса POST:

CREATE OR REPLACE JAVA SOURCE NAMED "example/HttpUtil" AS

import javax.net.ssl.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.cert.X509Certificate;
import java.sql.Blob;

public class HttpUtil {
    public static boolean doRequest(String link, Blob requestBody, Blob[] responseBody, String[] message) {
        String res = "Success";
        boolean result = true;
        try {
            request(link,requestBody,responseBody);
        } catch (Exception ex) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            ex.printStackTrace(pw);
            res = sw.toString();
            result = false;
        }
        message[0] = res;
        return result;
    }
    public static void request(String link, Blob requestBody, Blob[] responseBody) throws Exception {
        URL url = new URL(link);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setDoOutput(true);
        con.setRequestMethod("POST");
        con.setRequestProperty("Proxy-Connection", "Keep-Alive");
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
        con.setRequestProperty("Content-Length", String.valueOf(requestBody.length()));
        DataOutputStream outputStream = new DataOutputStream(con.getOutputStream());
        InputStream reqStream = requestBody.getBinaryStream();
        byte[] buff = new byte[1024];
        int len = 0;
        while ((len = reqStream.read(buff)) != -1) {
            outputStream.write(buff, 0, len);
        }
        int status = con.getResponseCode();
        InputStream in;
        if (status >= 400) {
            in = con.getErrorStream();
        } else  {
            in = con.getInputStream();
        }
        OutputStream out = responseBody[0].setBinaryStream(0);
        byte[] buf = new byte[1024];
        int n;
        while (-1 != (n = in.read(buf))) {
            out.write(buf, 0, n);
        }
        in.close();
        con.disconnect();
        out.flush();
    }
}

/

ALTER JAVA SOURCE "example/HttpUtil" COMPILE;

CREATE OR REPLACE FUNCTION http_request (is_url    IN            VARCHAR2,
                                         i_body    IN            BLOB,
                                         io_resp   IN OUT NOCOPY BLOB,
                                         o_message    OUT        VARCHAR2)
   RETURN BOOLEAN
AS LANGUAGE JAVA
NAME 'HttpUtil.doRequest(java.lang.String, java.sql.Blob, java.sql.Blob[], java.lang.String[]) return boolean';
...