0

0

解决 Oracle 数据库中 Java 存储过程 PKCS11 错误

霞舞

霞舞

发布时间:2025-10-28 18:00:03

|

172人浏览过

|

来源于php中文网

原创

解决 oracle 数据库中 java 存储过程 pkcs11 错误

本文旨在解决在 Oracle 数据库中执行 Java 存储过程时遇到的 "java.security.KeyStoreException: PKCS11 not found" 错误。该错误通常发生在 Java 代码尝试访问 USB Token 中的证书时,表明 Java 虚拟机 (JVM) 无法找到或加载 PKCS11 安全提供程序。本文将提供详细的排查步骤和解决方案,包括配置 `java.security` 文件、检查 JVM 环境以及使用 Oracle Wallet Manager 等方法,以确保 Java 代码能够正确访问 PKCS11 设备。

问题分析

当 Java 代码在 Oracle 数据库内部执行时,它运行在数据库服务器的 JVM 环境中。这个 JVM 环境可能与开发环境的 JVM 环境不同,导致在独立 Java 程序中正常工作的代码在 Oracle 数据库中运行时出现 java.security.KeyStoreException: PKCS11 not found 错误。 该错误表明 JVM 无法找到 PKCS11 提供程序,这通常是因为 java.security 配置文件未正确配置,或者 JVM 没有加载必要的 PKCS11 库。

解决方案

以下是解决此问题的步骤:

1. 配置 java.security 文件

java.security 文件用于配置 Java 安全属性,包括可用的安全提供程序。你需要确保 Oracle 数据库服务器的 JVM 使用的 java.security 文件包含了 PKCS11 提供程序的配置。

立即学习Java免费学习笔记(深入)”;

  1. 找到 java.security 文件:

    • 首先需要确定 Oracle 数据库 JVM 使用的 java.security 文件位置。 通常位于 $ORACLE_HOME/javavm/lib/security 目录下,也可能位于 JDK 安装目录下的 jre/lib/security 目录中。 具体的路径取决于 Oracle 数据库的版本和 JDK 的安装方式。
  2. 编辑 java.security 文件:

    • 使用文本编辑器打开 java.security 文件,并添加以下行:
    security.provider.13=sun.security.pkcs11.SunPKCS11 config_file.cfg
    • security.provider.13: 指定提供程序的优先级。 确保此数字未被其他提供程序使用。
    • sun.security.pkcs11.SunPKCS11: 指定 PKCS11 提供程序的类名。
    • config_file.cfg: 指定 PKCS11 配置文件的路径。 这个文件包含了 PKCS11 库的路径和其他配置信息。

2. 创建 PKCS11 配置文件 (config_file.cfg)

config_file.cfg 文件包含了 PKCS11 库的路径和其他配置信息。你需要根据你的 PKCS11 设备的具体情况创建此文件。

  1. 创建配置文件:

    • 创建一个名为 config_file.cfg 的文本文件,并添加以下内容:
    name = MyPKCS11
    library = /path/to/pkcs11.dll  # 替换为你的 PKCS11 库的实际路径
    slotListIndex = 0  # 替换为你的 token 所在的 slot 索引
    • name: 指定提供程序的名称。 可以自定义。
    • library: 指定 PKCS11 库的路径。 这是最重要的配置项,需要指向你的 USB Token 驱动程序提供的 PKCS11 库文件(例如,.dll、.so 或 .dylib 文件)。 你需要从你的 USB Token 厂商获取此文件。
    • slotListIndex: 指定 token 所在的 slot 索引。 如果只有一个 token,通常设置为 0。 如果有多个 token,你需要确定你的 token 所在的 slot 索引。 可以使用工具(例如 pkcs11-tool)来查看 slot 列表。
  2. 放置配置文件:

    • 将 config_file.cfg 文件放置在 Oracle 数据库服务器可以访问的位置。 建议将其放置在 $ORACLE_HOME/javavm/lib/security 目录下,或者在 java.security 文件中指定的其他位置。

3. 检查 JVM 环境

确保 Oracle 数据库服务器的 JVM 已经正确加载了 PKCS11 提供程序。

ShopWe 网店系统
ShopWe 网店系统

1.修正会员卡升级会员级别的判定方式2.修正了订单换货状态用户管理中心订单不显示的问题3.完善后台积分设置数据格式验证方式4.优化前台分页程序5.解决综合模板找回密码提示错误问题6.优化商品支付模块程序7.重写优惠卷代码8.优惠卷使用方式改为1卡1号的方式9.优惠卷支持打印功能10.重新支付模块,所有支付方式支持自动对账11.去掉规格库存显示12.修正部分功能商品价格显示4个0的问题13.全新的支

下载
  1. 重启数据库实例:

    • 在修改 java.security 文件和创建 config_file.cfg 文件后,需要重启 Oracle 数据库实例,以使更改生效。
  2. 验证提供程序是否加载:

    • 可以通过编写一个简单的 Java 存储过程来验证 PKCS11 提供程序是否已经正确加载。 例如:
    import java.security.Provider;
    import java.security.Security;
    import java.sql.*;
    
    public class ListProviders {
        public static void listProviders() throws SQLException {
            Provider[] providers = Security.getProviders();
            for (Provider provider : providers) {
                System.out.println("Provider: " + provider.getName() + ", Version: " + provider.getVersion());
            }
        }
    }
    • 将此 Java 代码编译成 class 文件,并使用 loadjava 命令将其加载到 Oracle 数据库中。
    • 创建一个 PL/SQL 存储过程来调用此 Java 方法。
    • 执行 PL/SQL 存储过程,并查看输出。 你应该能够看到 SunPKCS11 提供程序在列表中。

4. 权限问题

确保运行 Oracle 数据库的用户具有访问 PKCS11 库和 USB Token 的权限。

  1. 文件系统权限:

    • 确保运行 Oracle 数据库的用户(通常是 oracle 用户)具有读取 PKCS11 库文件和 config_file.cfg 文件的权限。
  2. USB Token 权限:

    • 某些 USB Token 需要特定的权限才能访问。 你需要查阅你的 USB Token 厂商的文档,以了解如何配置正确的权限。

5. 使用 Oracle Wallet Manager (可选)

Oracle Wallet Manager 可以用于管理安全证书和密钥。 你可以使用 Oracle Wallet Manager 将 USB Token 中的证书导入到 Oracle Wallet 中,然后使用 Oracle Wallet 中的证书进行签名。

  1. 创建 Oracle Wallet:

    • 使用 Oracle Wallet Manager 创建一个新的 Oracle Wallet。
  2. 导入证书:

    • 将 USB Token 中的证书导入到 Oracle Wallet 中。
  3. 配置 Java 代码:

    • 修改 Java 代码,使其使用 Oracle Wallet 中的证书进行签名。

6. 注意事项

  • PKCS11 库版本: 确保使用的 PKCS11 库版本与你的 USB Token 兼容。
  • 多个 JVM: 如果你的 Oracle 数据库服务器上安装了多个 JVM,请确保你配置的是 Oracle 数据库 JVM 使用的 java.security 文件。
  • 环境变量: 某些 PKCS11 库可能需要设置特定的环境变量。 你需要查阅你的 USB Token 厂商的文档,以了解需要设置哪些环境变量。
  • 调试: 可以使用 Java 调试器来调试 Java 存储过程,以了解错误的详细信息。

7. 总结

解决 Oracle 数据库中 Java 存储过程的 "java.security.KeyStoreException: PKCS11 not found" 错误需要仔细的配置和排查。 通过配置 java.security 文件,创建 PKCS11 配置文件,检查 JVM 环境,并确保正确的权限,你可以成功地解决此问题,并使你的 Java 代码能够正确访问 USB Token 中的证书。 如果问题仍然存在,请查阅 Oracle 数据库和 USB Token 厂商的文档,或寻求专业的技术支持。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

838

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

737

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

3

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.5万人学习

Java 教程
Java 教程

共578课时 | 48.2万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号