Openssl 从PIV智能卡提取名称
我正在尝试从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即
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提供更具体的代码示例。