Я пытаюсь выполнить необычную функциональность, используя 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-объекта не читается)
Любая помощь или руководство будеточень признателен,
Карлос.