Java SSL客户端未选择智能卡密钥

尤里·西姆克(Yuri Schimke)

我正在尝试在Java程序中使用爱沙尼亚ID卡进行SSL客户端身份验证。在Chrome / Firefox中,这对银行网站和测试服务器(nginx或openssl s_server)均适用。

但是,我的Java客户端(okhttp)对于本地密钥库工作正常,并且在尝试使用ID卡时失败。我将其归结为这个测试用例,它重现了我在调试器中看到的问题以及日志记录(-Djavax.net.debug = ssl:handshake)。

我可以与卡通信,例如可以打印同一密钥的证书。我正在Mac OSX上搭载DigiDoc3客户端

我可以看到似乎导致密钥被忽略的异常

sun.security.pkcs11.wrapper.PKCS11Exception: CKR_ATTRIBUTE_TYPE_INVALID
    at sun.security.pkcs11.wrapper.PKCS11.C_GetAttributeValue(Native Method)
    at sun.security.pkcs11.P11Key.getAttributes(P11Key.java:275)
    at sun.security.pkcs11.P11Key.privateKey(P11Key.java:330)
    at sun.security.pkcs11.P11KeyStore.loadPkey(P11KeyStore.java:1311)
    at sun.security.pkcs11.P11KeyStore.engineGetEntry(P11KeyStore.java:943)
    at java.security.KeyStore.getEntry(KeyStore.java:1521)
    at sun.security.ssl.X509KeyManagerImpl.getEntry(X509KeyManagerImpl.java:276)
    at sun.security.ssl.X509KeyManagerImpl.getCertificateChain(X509KeyManagerImpl.java:107)
    at com.baulsupp.oksocial.TestMain.main(TestMain.java:37)

测试程序输出

1.0.Authentication
ssl: KeyMgr: choosing key: Authentication (verified: OK)
null
null

测试码

package com.baulsupp.oksocial;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.Security;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import java.util.Set;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.X509ExtendedKeyManager;

public class TestMain {
  public static void main(String[] args)
      throws UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException,
      KeyStoreException, IOException {
    System.setProperty("javax.net.debug", "all");

    char[] password =
        System.getenv().get("PW").toCharArray();//System.console().readPassword("PW: ");

    X509ExtendedKeyManager km = (X509ExtendedKeyManager) getKeyManagers(password, 0)[0];

    String alias = km.chooseClientAlias(new String[] {"RSA"}, null, null);

    System.out.println(alias);

    X509Certificate[] chain = km.getCertificateChain(alias);
    System.out.println(chain);

    PrivateKey key = km.getPrivateKey(alias);
    System.out.println(key);
  }

  public static KeyManager[] getKeyManagers(char[] password, int slot)
      throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException,
      UnrecoverableKeyException {
    //Security.removeProvider("IAIK");

    //Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
    //Security.addProvider(provider);

    String config =
        "name=OpenSC\nlibrary=/Applications/qdigidocclient.app/Contents/MacOS/esteid-pkcs11.so\nslotListIndex="
            + slot;

    sun.security.pkcs11.SunPKCS11 pkcs11 =
        new sun.security.pkcs11.SunPKCS11(new ByteArrayInputStream(config.getBytes()));

    Security.addProvider(pkcs11);

    //debugProviders();

    KeyStore keystore = KeyStore.getInstance("PKCS11", pkcs11);

    keystore.load(null, password);

    //debugKeys(keystore);

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("NewSunX509");
    kmf.init(keystore, null);

    return kmf.getKeyManagers();
  }

  public static void debugKeys(KeyStore keystore) throws KeyStoreException {
    Enumeration<String> aliases = keystore.aliases();

    while (aliases.hasMoreElements()) {
      String s = aliases.nextElement();

      Certificate k = keystore.getCertificate(s);

      System.out.println(k);
    }
  }

  public static void debugProviders() {
    Provider[] providers = Security.getProviders();
    for (Provider p : providers) {
      System.out.println("\n\n" + p.getName());
      Set<Provider.Service> services = p.getServices();

      for (Provider.Service s : services) {
        System.out.println(s.getType() + " " + s.getAlgorithm());
      }
    }
  }
}

同时,我也提出了支持请求。

尤里·西姆克(Yuri Schimke)

完全基于Martin的回答,从源代码构建https://github.com/OpenSC/OpenSC并安装OpenSC-0.15.0.dmg提供了一个替代的驱动程序,该驱动程序首次起作用。我没有使用pkcs11-spy,因为它只是第一次工作。

String config =
    "name=OpenSC\n" +
        "library=/Library/OpenSC/lib/opensc-pkcs11.so\n";

我能够针对openssl进行测试

$ openssl s_server -verify 20 -key key.pem -cert cert.pem -accept 44330   -no_ssl3 -dhparam dhparam.pem -www 

哪个回应

---
Client certificate
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            xxxxxxxxx
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=EE, O=AS Sertifitseerimiskeskus, CN=ESTEID-SK 2011/[email protected]
        Validity
            Not Before: Jul 15 09:51:27 20xx GMT
            Not After : Jul 13 20:59:59 20xx GMT
        Subject: C=EE, O=ESTEID, OU=authentication, CN=SCHIMKE,YURI,xxxxxxxx, SN=SCHIMKE, GN=YURI/serialNumber=xxxxxxxx

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java SSL客户端未选择智能卡密钥

来自分类Dev

Java 7(充当客户端)使用Java 6中的密钥库和信任库的SSL握手失败

来自分类Dev

Java客户端证书和密钥库

来自分类Dev

RDP客户端不认为智能卡对身份验证有效

来自分类Dev

HAProxy SSL终止+客户端证书验证+ curl / Java客户端

来自分类Dev

哪些对象是持久的Java智能卡,以及何时?

来自分类Dev

跨平台Java Applet,用于使用智能卡签名

来自分类Dev

无法使用GP和Java连接某些智能卡

来自分类Dev

从java智能卡APDU收到奇怪的数据?

来自分类Dev

带有SSL的Java JMX客户端

来自分类Dev

使用PEM文件的Java SSL SOAP客户端

来自分类Dev

Java:如何添加SSL客户端身份验证

来自分类Dev

Java SSL客户端/服务器随机值

来自分类Dev

对 Java 客户端和 WebSphere MQ 使用 SSL 支持

来自分类Dev

Java SSL 套接字——客户端证书证明

来自分类Dev

尝试通过SSL访问Web服务的Java Web服务客户端-TrustManagerFactoryImpl未初始化

来自分类Dev

尝试通过SSL访问Web服务的Java Web服务客户端-TrustManagerFactoryImpl未初始化

来自分类Dev

我可以在非Java智能卡上上传Java卡小程序吗?

来自分类Dev

将SSL密钥库文件添加到Java可信存储中,以在PCF(Cloud Foundry)上进行HTTP客户端请求

来自分类Dev

Jolokia Java客户端

来自分类Dev

JAVA Grpc客户端

来自分类Dev

休息客户端JAVA

来自分类Dev

OAuth客户端Java

来自分类Dev

Druid 的 Java 客户端?

来自分类Dev

检查密钥是否在memcached中存在(spymemchaced-Java memcached客户端)

来自分类Dev

Java卡客户端 - 服务器接口可共享收益6F00

来自分类Dev

Java Web应用程序在哪里进行智能卡身份验证?

来自分类Dev

Java Web应用程序在哪里进行智能卡身份验证?

来自分类Dev

如何将java上的智能卡APDU命令转换为c#?

Related 相关文章

  1. 1

    Java SSL客户端未选择智能卡密钥

  2. 2

    Java 7(充当客户端)使用Java 6中的密钥库和信任库的SSL握手失败

  3. 3

    Java客户端证书和密钥库

  4. 4

    RDP客户端不认为智能卡对身份验证有效

  5. 5

    HAProxy SSL终止+客户端证书验证+ curl / Java客户端

  6. 6

    哪些对象是持久的Java智能卡,以及何时?

  7. 7

    跨平台Java Applet,用于使用智能卡签名

  8. 8

    无法使用GP和Java连接某些智能卡

  9. 9

    从java智能卡APDU收到奇怪的数据?

  10. 10

    带有SSL的Java JMX客户端

  11. 11

    使用PEM文件的Java SSL SOAP客户端

  12. 12

    Java:如何添加SSL客户端身份验证

  13. 13

    Java SSL客户端/服务器随机值

  14. 14

    对 Java 客户端和 WebSphere MQ 使用 SSL 支持

  15. 15

    Java SSL 套接字——客户端证书证明

  16. 16

    尝试通过SSL访问Web服务的Java Web服务客户端-TrustManagerFactoryImpl未初始化

  17. 17

    尝试通过SSL访问Web服务的Java Web服务客户端-TrustManagerFactoryImpl未初始化

  18. 18

    我可以在非Java智能卡上上传Java卡小程序吗?

  19. 19

    将SSL密钥库文件添加到Java可信存储中,以在PCF(Cloud Foundry)上进行HTTP客户端请求

  20. 20

    Jolokia Java客户端

  21. 21

    JAVA Grpc客户端

  22. 22

    休息客户端JAVA

  23. 23

    OAuth客户端Java

  24. 24

    Druid 的 Java 客户端?

  25. 25

    检查密钥是否在memcached中存在(spymemchaced-Java memcached客户端)

  26. 26

    Java卡客户端 - 服务器接口可共享收益6F00

  27. 27

    Java Web应用程序在哪里进行智能卡身份验证?

  28. 28

    Java Web应用程序在哪里进行智能卡身份验证?

  29. 29

    如何将java上的智能卡APDU命令转换为c#?

热门标签

归档