[英]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.