Openssl 从PIV智能卡提取名称

Openssl 从PIV智能卡提取名称,openssl,redhat,smartcard,apdu,pkcs#11,Openssl,Redhat,Smartcard,Apdu,Pkcs#11,我正在尝试从PIV智能卡中提取以下内容: 主题通用名 证书使用者Alt Name/Microsoft主体名称 我正在使用RedHat 6(最终是7)和CoolKey作为我的PKCS11模块 我需要一种无需智能卡pin即可通过代码提取此信息的方法,无论是从shell命令还是智能卡库。目前,我可以使用shell命令'pkcs11 tools--module-T'获取公共名称,因此Subject Alt Name确实是我想要的,但是如果可用,我想找到一种更好的方法来获取公共名称 我知道无需输入pin即

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

  • 主题通用名
  • 证书使用者Alt Name/Microsoft主体名称
  • 我正在使用RedHat 6(最终是7)和CoolKey作为我的PKCS11模块

    我需要一种无需智能卡pin即可通过代码提取此信息的方法,无论是从shell命令还是智能卡库。目前,我可以使用shell命令'pkcs11 tools--module-T'获取公共名称,因此Subject Alt Name确实是我想要的,但是如果可用,我想找到一种更好的方法来获取公共名称

    我知道无需输入pin即可获得此信息,因为我可以在RHEL(esc)上附带的智能卡管理器中查看所有信息。我有一个根证书链、中间证书链和从属证书链

    我的想法是,我必须从卡中提取证书,用本地CA验证该证书,然后解密它。我花了几天时间阅读关于APDU、智能卡和openssl的文档,但一无所获

    编辑 RHEL智能卡管理器视图:

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

    事实上,我已经转而使用pkcs15工具,因为pkcs11工具切断了更长的通用名称(您可以在屏幕截图的标题栏中看到这一点,同一期)。 “pkcs15工具--列表信息”的输出

    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            :
    
    使用带卡读卡器:
    PKCS#15卡[姓氏.姓氏.中间名.12345678]:
    版本:0
    序列号:
    制造商编号:piv_II
    旗帜:
    

    我当前的方法是简单地将括号中的字符串解析为通用名,并让用户使用Redhat智能卡工具手动输入Alt name。

    我能够使用Java bouncycastle和iaik pkcs11包装器获取通用名和UPN/证书Alt name

    //指向.so库文件的路径
    模块pkcs11Module=Module.getInstance(this.getProperties().getProperty(“PKCS11_库”);
    pkcs11Module.initialize(空);
    插槽[]slotsWithToken=pkcs11Module.getSlotList(Module.SlotRequirement.TOKEN_存在);
    CertificateFactory=CertificateFactory.getInstance(“X.509”);
    用于(插槽s:SLOTSWITKEN){
    Session Session=s.getToken().openSession(Token.SessionType.SERIAL_Session,Token.SessionReadWriteBehavior.RO_Session,null,null);
    session.findObjectsInit(新的X509PublicKeyCertificate());
    Object[]objects=null;
    while((objects=session.findObjects(1)).length>0){
    用于(对象c:对象){
    X509PublicKeyCertificate证书=(X509PublicKeyCertificate)c;
    字节[]certValue=cert.getValue().getByteArrayValue();
    证书cc=certFactory.generateCertificate(新的ByteArrayInputStream(certValue));
    if(X509证书的cc实例){
    x509证书x509=(x509证书)抄送;
    //通用名称:
    字符串名称=新的X500Name(x509.getSubjectDN().getName()).getRDNs()[0].getFirst().getValue().toString();
    
    Collection查看a我找不到术语Subject Common Name。我猜他指的是存储在卡上的一个或所有证书的Subject CN。Subject Common Name是Redhat智能卡管理器所称的名称,是插入卡时GUI中显示的名称。它被列为“令牌标签”当运行pkcs11工具-T时。这可能在PIV规范第41页上被列为“名称”?至于alt名称,我看到的唯一提及是在第26页。pkcs11工具显示的“令牌标签”可以通过
    C_GetTokenInfo
    提取(请参阅)。您是否可以编辑您的答案,以包括pkcs11工具的输出和Redhat smartcard manager显示的屏幕截图。一旦我们确定了您的确切需求,我可以为PKCS#11提供更具体的代码示例。