连接到 SoftHSM java

2023-11-25

Code:

String pkcs11cfg = "pkcs11.cfg";
Provider p = new SunPKCS11(pkcs11cfg);
Security.addProvider(p);

KeyStore ks = KeyStore.getInstance("PKCS11", p);
ks.load(null, pin);

System.out.println(ks.size()); // prints 0

cfg:

name = pkcs11Test
library = /usr/local/lib/libsofthsm.so
slot = 1

问题是我有一些密钥对,我用 pkcs11-tool 添加了它们。
softhsm的版本是1.2.1
为什么KeyStore中没有任何别名?如何解决这个问题?


我们即将发布 SoftHSM 1.3.0。它支持证书并使用 Java 进行了测试。

SoftHSM.java:

import java.io.*;
import java.math.*;
import java.util.*;

import java.security.*;
import java.security.interfaces.*;
import java.security.cert.*;
import sun.security.pkcs11.*;
import org.bouncycastle.x509.*;

import javax.security.auth.x500.X500Principal;

import org.bouncycastle.asn1.x509.BasicConstraints;
import org.bouncycastle.asn1.x509.ExtendedKeyUsage;
import org.bouncycastle.asn1.x509.GeneralName;
import org.bouncycastle.asn1.x509.GeneralNames;
import org.bouncycastle.asn1.x509.KeyPurposeId;
import org.bouncycastle.asn1.x509.KeyUsage;
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.x509.X509V3CertificateGenerator;

class SoftHSM
{
    public static void main(String args[]) throws Exception {
        // Set up the Sun PKCS 11 provider
        String configName = "softhsm.cfg";
        Provider p = new SunPKCS11(configName);

        if (-1 == Security.addProvider(p)) {
            throw new RuntimeException("could not add security provider");
        }

        // Load the key store
        char[] pin = "1234".toCharArray();
        KeyStore ks = KeyStore.getInstance("PKCS11", p);
        ks.load(null, pin);

        // Generate the key
        SecureRandom sr = new SecureRandom();
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", p);
        keyGen.initialize(1024, sr);
        KeyPair keyPair = keyGen.generateKeyPair();
        PrivateKey pk = keyPair.getPrivate();

        // Java API requires a certificate chain
        X509Certificate[] chain = generateV3Certificate(keyPair);

        ks.setKeyEntry("ALIAS-GOES-HERE", pk, "1234".toCharArray(), chain);

        ks.store(null);

        System.out.println("OK");
    }


    public static X509Certificate[] generateV3Certificate(KeyPair pair) throws InvalidKeyException, NoSuchProviderException, SignatureException {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

        X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();

        certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
        certGen.setIssuerDN(new X500Principal("CN=Test Certificate"));
        certGen.setNotBefore(new Date(System.currentTimeMillis() - 10000));
        certGen.setNotAfter(new Date(System.currentTimeMillis() + 10000));
        certGen.setSubjectDN(new X500Principal("CN=Test Certificate"));
        certGen.setPublicKey(pair.getPublic());
        certGen.setSignatureAlgorithm("SHA256WithRSA");

        certGen.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(false));
        certGen.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment));
        certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_serverAuth));

        certGen.addExtension(X509Extensions.SubjectAlternativeName, false, new GeneralNames(new GeneralName(GeneralName.rfc822Name, "[email protected]")));

        X509Certificate[] chain = new X509Certificate[1];
        chain[0] = certGen.generateX509Certificate(pair.getPrivate(), "SunPKCS11-SoftHSM");

        return chain;
    }
}

Softhsm.cfg:

name = SoftHSM
library = /usr/local/lib/libsofthsm.so
slot = 2
attributes(generate, *, *) = {
   CKA_TOKEN = true
}
attributes(generate, CKO_CERTIFICATE, *) = {
   CKA_PRIVATE = false
}
attributes(generate, CKO_PUBLIC_KEY, *) = {
   CKA_PRIVATE = false
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接到 SoftHSM java 的相关文章

随机推荐

  • 在 asp.net 中只能将 ScriptManager 的一个实例添加到页面中

    当我尝试添加用户控件时出现此错误 只能将 ScriptManager 的一个实例添加到页面中 Code ascx
  • web2py数据库中的表示格式

    db define table person Field name format name s 这个格式在这里有什么作用 The format参数用于确定如何显示引用 person 表的其他表中的字段 例如 如果您定义 db define
  • 字符串在 Java 源代码中何时何地初始化/存储?

    这是我的源代码 public class Koray public static void main String args System out println This is a sample program 当我编译它时 我得到了字节
  • 如何在node.js中实现登录验证

    我有这个节点服务器正在运行 var server http createServer function request responsehttp if request method POST var body request on data
  • 如何测试类型是否是匿名的? [复制]

    这个问题在这里已经有答案了 我有以下方法将对象序列化为 HTML 标记 我只想在类型不是匿名的情况下执行此操作 private void MergeTypeDataToTag object typeData if typeData null
  • 从映射驱动器或共享文件夹运行 .NET 程序

    我编写了一个 C Windows 窗体应用程序 用于将一台计算机上的远程文件夹 源 文件夹是映射驱动器 Z folder 中的文件和文件夹与另一台计算机上的另一个远程文件夹 目标 合并文件夹是共享文件夹的 UNC 路径 computerna
  • 为什么我们总是喜欢在SQL语句中使用参数?

    我对数据库工作非常陌生 现在我可以写了SELECT UPDATE DELETE and INSERT命令 但我见过很多论坛 我们更喜欢这样写 SELECT empSalary from employee where salary salar
  • 如何将文件从远程服务器中的目录 A 移动到目录 B?

    我正在使用 JSch 连接到由 GWT 制作的网站中的 SFTP 我读过一个小例子sftpChannel get sftpChannel rename sftpChannel rm 但我没有找到从远程服务器复制文件的解决方案a目录到远程服务
  • 无法在此事件处理程序中执行操作

    我正在尝试从 DataGridView 中删除一行我使用两种类型的指令 A VouchersDGV Rows Clear B If Not DGV Rows RowIndex IsNewRow Then DGV Rows RemoveAt
  • Matlab 中的高效分类

    我有一张尺寸为 RGB 的图像uint8 576 720 3 我想将每个像素分类为一组颜色 我已经使用rgb2lab从RGB空间到LAB空间 然后删除L层 所以现在是double 576 720 2 由AB组成 现在 我想将其分类为我在另一
  • 总线错误排查

    我正在尝试反转字符串 这是我尝试过的代码 include
  • 编写 C++ 版本的代数游戏 24

    我正在尝试编写一个像游戏 24 一样工作的 C 程序 对于那些不知道如何玩的人 基本上你会尝试通过 四个代数运算符找到 4 个数字总计为 24 的任何方法 和括号 举个例子 假设有人输入 2 3 1 5 2 3 5 1 24 由于括号位置的
  • ADB 安装失败并显示 INSTALL_FAILED_TEST_ONLY

    我在将 apk 安装到我的设备时遇到问题 adb install lt apk gt 使用上述命令将返回以下内容 5413 KB s 99747 bytes in 0 017s pkg data local tmp AppClient Te
  • SQL 的扩展占位符,例如id 在哪里 (??)

    赏金更新 已经从马克那里得到了很好的答案 将 改编为 如下 然而 除了 DBIx 之外 我仍在寻找类似的方案 我只是想兼容anything 我需要有关我为参数化 SQL 语句中的 扩展 占位符选择的语法的建议 因为构建一些构造 IN 子句
  • 带弹性盒的计算器键盘布局

    我正在用 Flexbox 构建一个计算器 我想要其中一个键的高度是两倍 另一个键的宽度是两倍 我用谷歌搜索了很多 但找不到这两个案例 对于两倍高度的键 我发现的唯一答案是flex direction as column 但在这种情况下 我将
  • iPython 笔记本避免在函数内打印

    我想阻止某个函数在 iPython 笔记本中打印 在标准 python 中 可以防止打印问题中回答的某些代码行 防止函数在 Python 的批处理控制台中打印然而 此方法在 iPython Notebook 中不起作用 在内核重新启动之前会
  • 您如何在协作、版本控制的环境中处理 Oracle 软件包? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我在 Oracle 的多开发人员环境中工作 有一个大包 我们有DEV gt TST gt PRD的促销模式 目前 所有包编辑都是直接在 TOAD 中进行 然后编译到 DEV 包中 我们遇到
  • 使用 Bash 重定向到多个文件时重定向不明确

    echo gt home jem rep 0 1 3 logs SystemOut log bash home jem rep 0 1 3 logs SystemOut log ambiguous redirect 我可以一次重定向到多个文
  • 如何根据特殊条件进行分组

    目前 当我发出此 SQL 时 它会获取不同的用户名 我有一些不同的用户名 它们代表组 例如GRP BSN 我想将所有其他用户名 恰好是数字 分组到一个组中 例如GRP OTHERS select username count from ho
  • 连接到 SoftHSM java

    Code String pkcs11cfg pkcs11 cfg Provider p new SunPKCS11 pkcs11cfg Security addProvider p KeyStore ks KeyStore getInsta