从PIV智能卡中提取名称

我正在尝试从PIV智能卡中提取以下内容:

  1. 主题通用名
  2. 证书主题替代名称/ Microsoft主体名称

我正在使用RedHat 6(最终是7)和CoolKey作为我的PKCS11模块。

我需要一种方法,可以通过代码提取此信息而无需使用智能卡针,无论是从Shell命令还是从智能卡库中获取。目前,我可以使用shell命令'pkcs11-tools --module -T'来获得通用名称,因此主题替代名称确实是我所追求的,但是我想找到一种更好的方式来获得通用名称(如果可用) 。

我知道此信息无需输入图钉即可使用,因为我可以在RHEL(esc)上随附的Smartcard Manager中查看所有信息。如果有的话,我有根,中级和下级的证书链。

我的想法是我必须从卡中提取证书,并使用本地CA验证该证书,然后对其进行解密。我花了几天的时间阅读有关APDU,智能卡和openssl的文档,却一无所获。

编辑RHEL智能卡管理器的视图: 在此处输入图片说明

这是打开卡并查看详细信息时智能卡查看器显示的内容。我要从卡中提取Microsoft主体名称,以及在“层次结构”部分以及其他位置显示的“通用名称”,并以红色文字显示。

从那以后我实际上已经切换到使用pkcs15-tool,因为pkcs11-tool切断了更长的通用名称(您可以在屏幕快照的标题栏中看到此名称,相同的问题)。输出:“ pkcs15-tool --list-info”

Using reader with a card: <reader name>
PKCS#15 Card [LASTNAME.FIRSTNAME.MIDDLENAME.12345678]:
        Version          : 0
        Serial number    : <big string>
        Manufacturer ID  : piv_II
        Flags            :

我当前的方法只是将括号中的字符串解析为通用名称,然后让用户使用Redhat智能卡工具手动输入替代名称。

我可以使用Java bouncycastle和iaik pkcs11包装器来获得通用名称和UPN /证书替代名称。

//path to .so library file
Module pkcs11Module = Module.getInstance(this.getProperties().getProperty("PKCS11_LIBRARY"));
pkcs11Module.initialize(null);
Slot[] slotsWithToken = pkcs11Module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
for(Slot s : slotsWithToken)    {
    Session session = s.getToken().openSession(Token.SessionType.SERIAL_SESSION, Token.SessionReadWriteBehavior.RO_SESSION, null, null);
    session.findObjectsInit(new X509PublicKeyCertificate());
    Object[] objects = null;
    while((objects = session.findObjects(1)).length > 0)    {
        for(Object c : objects) {
            X509PublicKeyCertificate cert = (X509PublicKeyCertificate) c;
            byte[] certValue = cert.getValue().getByteArrayValue();
            Certificate cc = certFactory.generateCertificate(new ByteArrayInputStream(certValue));
            if(cc instanceof X509Certificate)   {
                X509Certificate x509 = (X509Certificate) cc;
                //COMMON NAME:
                String name = new X500Name(x509.getSubjectDN().getName()).getRDNs()[0].getFirst().getValue().toString();
                Collection<List<?>> altNames = x509.getSubjectAlternativeNames();
                for(List<?> list : altNames)    {
                    ASN1Sequence seq = ASN1Sequence.getInstance(new ASN1InputStream(new ByteArrayInputStream((byte[]) list.get(1))).readObject());
                    ASN1TaggedObject obj = (ASN1TaggedObject) seq.getObjectAt(1);
                    //ALT NAME:
                    String upn = obj.getObject().toString();
                    upn = upn.substring(upn.lastIndexOf("]") + 1);
                }
            }
        }
    }
}

在upn的前面附加了“ [0]”,但我不确定为什么这样做,因此我对其进行了操作以消除此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么gpg无法从我的智能卡中提取密钥存根?

来自分类Dev

从文本中提取名称

来自分类Dev

智能卡发行

来自分类Dev

使用dplyr从列表中提取名称

来自分类Dev

从网址中提取名称实体

来自分类Dev

从混乱的文件中提取名称

来自分类Dev

从网址中提取名称实体

来自分类Dev

从句子中提取名称

来自分类Dev

智能卡CMS解密

来自分类Dev

智能卡相互认证

来自分类Dev

智能卡访问速度

来自分类Dev

读取智能卡的UID

来自分类Dev

从(名称,处理程序)对列表中提取名称

来自分类Dev

如何使用PIV智能卡(YubiKey 4)对应用程序二进制文件进行签名?

来自分类Dev

使用map()函数从列表中提取名称

来自分类Dev

如何从数组中的类中提取名称?

来自分类Dev

从对象中提取名称与测试匹配的属性

来自分类Dev

如何从字符串中提取名称和版本

来自分类Dev

从最外层元素中提取名称空间及其URI

来自分类Dev

从数据字符串中提取名称

来自分类Dev

从包含电子邮件的 PDF 中提取名称

来自分类Dev

使用 selenium 从标签中提取名称或 href 无需点击

来自分类Dev

从python中的字符串中提取名称

来自分类Dev

EMV智能卡TLV格式错误?

来自分类Dev

编写和读取智能卡的证书

来自分类Dev

智能卡及其文件

来自分类Dev

PCSC-智能卡获取UID

来自分类Dev

智能卡阅读器命名

来自分类Dev

如何从智能卡获取CPLC数据?