繁体   English   中英

从 Oracle 数据库执行 java 过程时出错

[英]Error while execute java procedure from Oracle Database

我有 java 代码可以从 USB 令牌读取证书。 该代码独立运行正常 Java class。

将 Java class 导入 Oracle 数据库 (19c) 后,使用loadjava实用程序,成功导入 Java class 但执行后出现以下错误:

java.security.KeyStoreException:找不到 PKCS11

上述错误表示未添加安全提供程序。 在独立的 Java class 中,要修复此错误,只需将以下行添加到 Java 目录中的java.security文件中:

security.provider.13=SunPKCS11 configration_file.cfg

我还将上面的行添加到java.security中,在数据库主目录的javavm文件夹中,但这并没有修复错误。

使用的Java代码是:

class GetSignatureNew {

    public static void main(String args[])
    {
        GetSignatureNew sdk = new GetSignatureNew();
    }

    public static String GetSignatureFun(String serialized)
    {
        String pwd = "*******";
        char[] pin = new char[pwd.length()]; 
        try
        {
            for (int i = 0; i < pwd.length(); i++) {
                pin[i] = pwd.charAt(i);
            }
            
            // Get Certificate and private key from token
            KeyStore ks = KeyStore.getInstance("PKCS11");
            ks.load(null, pin);
            Enumeration enu = ks.aliases();
            String alias = String.valueOf(enu.nextElement());           
            X509Certificate cert =  (X509Certificate) ks.getCertificate(alias);
            PrivateKey pk = (PrivateKey) ks.getKey(alias, pin);
            byte [] output = cert.getEncoded();         
            String b64 = Base64.getEncoder().encodeToString(output);
            return b64;
        }
        catch (Exception e) {
            e.printStackTrace(); 
            return e.toString();
        }
    }
}

任何人都有想法。

提前致谢。

执行 Java 程序 output 不正确,因为它给出

“java.security.KeyStoreException:找不到 PKCS11”

作为一种变通方法,我尝试在 oracle 上创建一个计划作业来运行批处理,并且该批处理将运行 java 代码。 不幸的是,当我运行批处理时,批处理成功运行,但如果我运行 oracle 作业,它也会运行错误

   STANDARD_ERROR="java.security.KeyStoreException: PKCS11 not found
    at java.base/java.security.KeyStore.getInstance(KeyStore.java:878)
    at GetSignatureDB.main(GetSignatureDB.java:102)
Caused by: java.security.NoSuc"   

安排作业

BEGIN
    SYS.DBMS_SCHEDULER.CREATE_JOB( job_name => 'einvoice_signature_job',
        job_type => 'EXECUTABLE',
        job_action => 'C:\WINDOWS\system32\cmd.exe',
        job_class => 'DEFAULT_JOB_CLASS',
        comments => 'Job to call batch script on Windows',
        auto_drop => FALSE,
        number_of_arguments => 3,
        enabled => FALSE);

    SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'einvoice_signature_job', argument_position => 1, argument_value => '/q'); 
    SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'einvoice_signature_job', argument_position => 2, argument_value => '/c'); 
    SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => 'einvoice_signature_job', argument_position => 3, argument_value => '"E:\Backup\eInvoice\GetCert.bat"'); 
    SYS.DBMS_SCHEDULER.ENABLE( 'einvoice_signature_job' ); 
END;
/

批处理文件

cd E:\Backup\eInvoice
E:
"C:\Program Files\Java\jdk-9.0.1\bin\java" GetSignatureNew 

其中 GetSignatureNew 是原始帖子中列出的 java class。

如果我手动运行,批处理工作正常。

但是当我运行 Oracle 作业时

BEGIN
    DBMS_SCHEDULER.RUN_JOB ('einvoice_signature_job');
END;

它运行并返回上述错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM