Java не может прочитать файл .p12, хранящийся в столбце Oracle Blob во время инициализации хранилища ключей - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь выполнить необычную функциональность, используя Java внутри схемы базы данных Oracle, но через несколько недель я заболел странным поведением Java.

Моя желаемая функциональность

Я хочу применить цифровую подпись к документу XML (используя существующий файл сертификата p12), используя процедуры Oracle PL / SQL и классы Java, хранящиеся в той же схеме базы данных (я стараюсь избегать использования внешних API / веб-служб дляфункциональность цифровой подписи).

Контекстная информация

Это краткий обзор структуры решения: 1. Я хочу использовать классы Java, хранящиеся в том же экземпляре Oracle Database 2. Я хочу вызватьJava-классы из PL / SQL 3. Основные функции подписи будут реализованы внутри класса Java, который подключится к базе данных Oracle и получит два файла Blob: цифровой сертификат, хранящийся в виде файла p12 в одном столбце Blob, и файл XML, который будет подписан, в другомСтолбец BLOB-объекта.

Проблема

После несколькихТестирование Я обнаружил странное поведение Java.Java может читать содержимое столбцов Blob без проблем (он может исследовать размер BLOB-объекта, распечатывать содержимое и т. Д.)

Но когда я пытаюсь использоватьстолбец BLOB-объекта (тот, который содержит файл p12) в качестве InputStream для класса Keystore, java может не загрузить сертификат в Keystore.

Вот фрагмент кода только дляпосмотрим, есть ли у вас какие-либо идеи о , как заставить класс Keystore читать содержимое Blob в качестве входных данных ...

public static String Blob_X509Cert_Test() {
    String v_hilera = null;
    try {
         Connection con = DriverManager.getConnection
                          ("jdbc:oracle:thin:@myserver:15210:mysid",
                            "myuseraccount","mypassword");
         Statement stmt=con.createStatement();
         ResultSet rs = stmt.executeQuery("select blob_cert from tmp_blob");
         if (rs.next()) {
            Blob v_blob = rs.getBlob("blob_cert");
            InputStream v_is = v_blob.getBinaryStream();
            int v_b = v_is.read();
            KeyStore p12;
            try {
                 p12 = KeyStore.getInstance("pkcs12");
                 try {
                      p12.load(v_is, "p12password".toCharArray());
                      Enumeration<String> e = p12.aliases();
                      while (e.hasMoreElements()) {
                             String alias = (String) e.nextElement();
                             X509Certificate c = (X509Certificate)
                                                 p12.getCertificate(alias);
                             Principal subject = c.getSubjectDN();
                             String subjectArray[] =
                                        subject.toString().split(",");
                             for (String s : subjectArray) {
                                  String[] str = s.trim().split("=");
                                  String key = str[0];
                                  String value = str[1];
                             }
                 }
            } catch (NoSuchAlgorithmException | CertificateException e1) {
                    e1.printStackTrace();
            }
         } catch (KeyStoreException e1) {
                  e1.printStackTrace();
    }
    return v_hilera;
}

Этот фрагмент кода может быть неполным (я привел это здесь только для того, чтобы помочь концептуальному пониманию, но я готов поделиться большим количеством кода, если необходимо).

В своем исследовании я выделил проблему в метод Keystore.load (), который можетне читать содержимое BLOB-объекта (возможно, проблема может быть на другом сайте).

Если я использую локальную файловую систему в качестве входного потока для Keystore.load (), все работает как положено ...

Если вы попробуете этот кусок кода:

FileInputStream v_fis = new FileInputStream("C:/temp/TD_Cramos_Test.p12");
System.out.println("v_fis.available(): " + v_fis.available());

Результат: 6736 (размер содержимого файла)

Если вы попробуете ту же функциональность, но с Blob"file", результатом будет cero байт:

InputStream v_is = v_blob.getBinaryStream();
System.out.println("v_is.available(): " + v_is.available());    

Результат: 0 (по какой-то причине содержимое BLOB-объекта не читается)

Любая помощь или руководство будеточень признателен,

Карлос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...