Java - PKCS11 和 MSKeyStore

2023-12-07

我正在尝试使用 MS-KeyStore 中的不同证书签署一个字符串。 但是,我知道有从 MS-Keystore 中的令牌导入的密钥。 所以,我的问题是 - 如果我通过密钥库并尝试使用引用 pkcs11 的证书进行签名,我会弹出一个窗口,要求输入 pkcs11 密码。 如何检查证书是否来自我的令牌?

提前致谢!!!

这是我现在的代码:

  String alias;
    byte[] data = "test".getBytes();
    char[] pin = "pass".toCharArray();

    try {


        KeyStore ks = KeyStore.getInstance("Windows-MY");
        ks.load(null, pin);
        System.out.println("Provider: "+ks.getProvider());
        System.out.println("KS size: " + ks.size());

        Enumeration enumeration = ks.aliases();

        while (enumeration.hasMoreElements()) {
            alias = (String) enumeration.nextElement();

            PrivateKey privateKey = (PrivateKey) ks.getKey(alias, null);
            Certificate certificate = ks.getCertificate(alias);

            Provider provider = ks.getProvider();
            Signature signature = Signature.getInstance("SHA1withRSA", provider);
            try {
                signature.initSign(privateKey);
                signature.update(data);

                byte[] signedSignature = signature.sign();
                System.out.println("\tGenerated signature for " + alias);

                signature.initVerify(certificate);
                signature.update(data);
                if (signature.verify(signedSignature)) {
                    System.out.println("\tSignature verifified for " + alias);
                } else {
                    System.out.println("\tCould not verify signature for " + alias);
                }
            } catch (Exception ex) {
                System.out.println("\tError for " + alias);
            }

        }

    } catch (KeyStoreException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (CertificateException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (FileNotFoundException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (UnrecoverableKeyException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }

恐怕您无法可靠地判断证书的来源,至少在 MS CAPI 提供程序的 Java 级别上无法判断。但这是设计的一部分 - MS CAPI 或多或少打算封装和隐藏证书/密钥的来源。

判断您的密钥/证书来自 PKCS#11 设备的安全方法是使用SUN PKCS#11 提供商。但是,这样做的缺点是您需要静态指定本机 PKCS#11 库的路径(在 java.security 文件中,您可以在其中静态配置提供程序)或动态请求它作为用户输入。

如果在您的情况下使用 PKCS#11 提供程序太麻烦,我建议实现一个证书选择对话框来过滤合适的证书。将 MSCAPI 限制为源自 PKCS#11 的证书不会立即提高安全性 - 您的用户可能有充分的理由安装了其他证书/密钥(通常以 PKCS#12 文件的形式)。您应该只检查(并帮助用户根据此标准过滤证书)最终选择的证书/密钥是否符合您的标准:正确的密钥使用(例如数字签名)、健全的扩展密钥使用、可接受或已知的策略存在于证书等

在欧盟,我们正在慢慢朝着“安全签名创建设备上的合格证书”的概念发展。这意味着此类设备(例如智能卡)上附带的证书将包含特殊策略,CA 禁止将这些策略用于任何其他证书(例如软件证书)。因此,这将有效地允许您确保证书源自安全的硬件设备。您可以检查所涉及的证书是否支持此功能。这欧洲电信标准协会文件列出您必须查找的相应 OID。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - PKCS11 和 MSKeyStore 的相关文章

  • 在 Eclipse 中隐藏重复的工具栏项

    我不知道如何 但我的 STS 有重复的工具栏项目 我不知道如何删除它们 这是我复制的工具栏的样子 我想摆脱这些 我试图隐藏工具栏 但这没有帮助 有人知道如何删除重复的吗 自从升级到 Oxygen 以来 我一直遇到同样的问题 我无法可靠地重现
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 使用 Eclipse 将具有外部依赖项的 Java 项目导出到 jar

    有没有一种简单的方法可以将 Java 项目 包括其所有外部依赖项 导出到标准 jar 文件 我开发了一个使用多个 Apache 库的 SDK 我希望能够将该项目作为单个 jar 发布 到目前为止我找到的这个问题的答案要求将项目打包为 Run
  • 为什么我的 @OneToMany 属性出现主键违规?

    我有一个实体 Entity public class Student GeneratedValue strategy GenerationType AUTO Id private long id OneToMany private Set
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • java 中的 Try-with-resources 和 return 语句

    我想知道是否放一个return里面的声明尝试资源block 防止资源自动关闭 try Connection conn return conn createStatement execute 如果我写这样的东西将会联系被关闭 Oracle 文
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • 按名称获取 ArrayList

    这是正确的获取方式吗ArrayList
  • 默认情况下,JSF 生成不可用的 ID,这些 ID 与 Web 标准的 CSS 部分不兼容

    活跃的 JSF 或 Primefaces 用户能否解释一下为什么默认情况下会发生这种情况 为什么没有人对此采取任何措施
  • 单元测试、集成测试还是设计中的问题?

    我编写了我的第一个单元测试 我认为它过于依赖其他模块 我不确定是否是因为 这是一个复杂的测试 我实际上已经编写了集成测试或 我的设计有问题 我首先要说的是 虽然我有大约 4 年的开发经验 但我从未学过 也没有人教过自动化测试 我刚刚使用 H
  • Java:java.util.Preferences 失败

    我的程序将加密的产品密钥数据保存到计算机上java util Preferences类 系统首选项 而不是用户 问题是 在 Windows 和 Linux 上 尚未在 OSX 上测试过 但可能是相同的 如果我不运行该程序sudo或者具有管理
  • Java 常量枚举[重复]

    这个问题在这里已经有答案了 可能的重复 理解 Java 中的枚举 https stackoverflow com questions 1419835 understanding enums in java 为什么我们应该使用枚举而不是 Ja
  • 用于安装 R 软件包的备用编译器:clang:错误:不支持的选项“-fopenmp”

    我正在尝试在 OS X 10 11 6 上使用 R 版本 3 4 0 安装 rJava 包 install packages rJava type source 我收到以下错误 clang o libjri jnilib Rengine o
  • 线程上下文类加载器和普通类加载器的区别

    线程的上下文类加载器和普通类加载器有什么区别 也就是说 如果Thread currentThread getContextClassLoader and getClass getClassLoader 返回不同的类加载器对象 将使用哪一个
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • 设置 Firefox 配置文件以使用 Selenium 和 Java 自动下载文件

    我想使用 Selenium WebDriver 和 Java 验证文件下载 要下载的文件为 PDF 格式 当 WebDriver 单击 AUT 中的 下载 链接时 Firefox 将打开以下下载确认窗口 我希望 Firefox 自动下载文件
  • while循环只执行一次

    我很难弄清楚为什么 while 循环实际上不会循环 它运行一次并停止 import java util public class mileskm public static void main String args Scanner inp
  • 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

    我正在尝试运行我的应用程序 但不断收到标题中列出的错误 我读过周围的内容 人们说尝试将主题更改为 AppCombat 主题 但这似乎不起作用 以下是我遇到的错误 Process com example jmeyer27 crazytiles
  • 在 for 循环比较中使用集合大小

    Java 中 Collections 的 size 方法是否有编译器优化 考虑以下代码 for int i 0 i

随机推荐

  • 为什么我不能创建一个大小由全局变量确定的数组?

    为什么数组a没有被全局变量初始化size include
  • jqGrid:子网格不填充数据

    我有一个子网格 当您单击 Cheese 旁边的 号时 会触发 ajax 查询 并且我会看到子网格列名称 但实际数据不会填充到子网格中 无论我尝试扩展哪个网格 问题都会发生 但 奶酪 示例如下所示 您可以在屏幕截图中 FireBug 输出的底
  • 在 ASP.NET MVC 中匹配跨多个“/”的 URL 参数

    在 ASP NET MVC 中匹配跨多个 的 URL 参数的最佳方法是什么 Eg URL http example com controller action p1 p2 p3 p4 我只想将一个参数传递给操作方法 上面是 p1 p2 p3
  • scapy 数据包操作和原始 pkt.time

    我有 python scapy 和平代码将我的数据存储到数据库中 IP src 和 dst 端口 我用它来进行一些统计 在某些数据包上 我正在执行一些操作 更改目标端口 然后将它们发送回接口 问题是我正在操作的这个数据包具有与原始数据包不同
  • 如何在nodejs中使用getRandomValues()?

    我正在使用 Javascript 生成wireguard 密钥对 但它是面向浏览器的 因此我删除了窗口对象 并且还有一个阻止创建私钥的问题 问题是这行代码我无法在nodejs中运行 function generatePresharedKey
  • BigQuery 试运行会返回什么?

    BigQuery 文档说 在表的较小分区而不是一个大表上测试查询 如果使用 API 请验证查询的语法并使用 dryRun 标志获取数据处理统计信息 但他们也表示 对于 dryRun 如果设置 则不会实际运行查询 有效的查询将返回空响应 而无
  • 调用 GBrowserIsCompatible() 时 Google 地图 API JavaScript 错误

    我在以下行中收到错误 if GBrowserIsCompatible 这是我的代码仍然无法工作
  • 尝试将 SELECT SCOPE_IDENTITY() 作为 C# 变量

    我正在一个表中插入一行 然后想要获取该新 ID 以便我可以将其添加到存储电子邮件地址的另一个变量中 var db Database Open myDB var insertCommand1 INSERT INTO myDB FirstNam
  • 寻找指南针 2 度之间最接近的差异 - Javascript

    我基本上是想找出指南针上两个点相距多少度 例如 如果一个人面朝 270 度 而指南针为 280 度 那么这两点之间就有 10 度 如果相对于第一个标题 它在左侧 我还想要一个负数 在右侧则为正数 例如 当 to 标题为 350 和 020
  • 防止选择和复制

    我想在 html 页面中不活动选择和复制文本 当我使用 Javascript 且处于非活动状态时 右键单击用户可以使用 Ctrl V 你不能 甚至不要尝试 不要惹恼你的用户 如果您将其公开发布在网络上 则可以复制 从技术上讲 用户一看到它就
  • 如何使用 Spring AOP 和 SPring boot 进行日志记录

    我使用与本示例教程中相同的 LoggingAspect 类https www javaguides net 2019 05 spring boot spring aop logging example tutorial html 但是当我调
  • 困惑为什么 PyGame 显示黑屏

    因此 在我决定问这个问题之前 我做了一些研究 看看我的问题是什么 并发现了这一点 代码仅在 Pygame 窗口中产生黑屏然而 这并不是那么有帮助 因为我没有遇到与此人相同的问题 我确信我的 PyGame 没有过时或类似的东西 因为我的代码的
  • 添加程序集引用还需要引用基础程序集

    我创建了一个程序集 该程序集有一个子类 该子类派生自另一个程序集中定义的父类 当我添加对子项的引用时 Visual Studio 还要求将引用添加到父项 为什么会这样 如何在不丢失任何功能的情况下防止它 你所描述的情况是部分可能的 您可以消
  • 渐变动画 - 减速和加速

    我正在制作一个动画CAGradientLayer 类似于苹果在 iPhone 主屏幕上使用 滑动解锁 动画的方式 然而我的动画有点不同 它在某些点会减慢和加速 到目前为止 我的代码是一个渐变动画并且可以工作 但是我如何让它在不同的点减慢 加
  • IBM Worklight - 无法使用现有别名注册到事件源回调。该别名已用于事件源

    我正在使用 IBM Worklight 6 0 0 并在 iOS 7 设备上进行测试 我有以下js错误 Cannot register to event source callback with an existing alias myPu
  • [function.fopen]:打开流失败:HTTP 请求失败! HTTP/1.1 401 未经授权

    function fopen 打开流失败 HTTP 请求失败 HTTP 1 1 401 未经授权 我定期收到此错误 即它仅在随机时间发生 任何想法会导致此错误 我已检查我的 php ini 并将allow url fopen 设置为 tru
  • 将 SQL 数据读取器数据加载到 DataTable 时遇到问题

    string query select from cfo daily trans hist try using SqlConnection connection new SqlConnection cnnString SqlCommand
  • c# 如何使用实时图表反转 Y 轴

    我试图简单地反转 Y 轴 以便该图向上而不是向下 从 6 开始 一直到 1 这是关于倒置图的用户文档 https lvcharts net App examples v1 wpf Inverted 20Series 这是我用来构建图表的示例
  • NodeJS 中的空合并赋值运算符 (??=)

    我正在尝试在 NodeJS 中使用 Nullish 合并赋值运算符 这可能吗 const setValue object path value gt const indices first 0 second 1 keys path repl
  • Java - PKCS11 和 MSKeyStore

    我正在尝试使用 MS KeyStore 中的不同证书签署一个字符串 但是 我知道有从 MS Keystore 中的令牌导入的密钥 所以 我的问题是 如果我通过密钥库并尝试使用引用 pkcs11 的证书进行签名 我会弹出一个窗口 要求输入 p