netty中使用SunPKCS11的TLS客户端身份验证的gRpc失败

我有一些Java 8应用程序,使用gRPC进行网络通信。 为了确保这一点,我使用TLS和客户端身份验证。 现在,我尝试从软件密钥切换到智能卡,持有私钥和证书(链)进行客户端身份验证。 我的代码,使网状 GRPC的使用里面的太阳PKCS#11提供商如下所示:

static NettyChannelBuilder getChannel(final String host, final int port, 
  final File trustAnchorsFile) throws Exception{
  String configName = "pkcs11.cfg"; // FIXME


  SunPKCS11 sunpkcs11 = new SunPKCS11(configName);
  Security.addProvider(sunpkcs11);
  KeyStore.Builder scBuilder = KeyStore.Builder.newInstance("PKCS11", sunpkcs11,
        new KeyStore.PasswordProtection("11111111".toCharArray())); //FIXME

  KeyManagerFactory factory = KeyManagerFactory.getInstance("NewSunX509");  
  KeyStoreBuilderParameters param = new KeyStoreBuilderParameters(scBuilder);
  factory.init(param);
  SslContextBuilder builder = GrpcSslContexts.forClient(); 

  builder = builder.trustManager(trustAnchorsFile)
                 .keyManager(factory)
                 .clientAuth(ClientAuth.REQUIRE);

  return NettyChannelBuilder.forAddress(host, port).sslContext(builder.build());
}

测试我看到的代码,它对照智能卡进行身份验证(提供一些错误的PIN(而不是“11111111”)会减少卡上相应的重试计数器。此外,使用pkcs11 dll的调试版本,正在使用太阳PKCS11提供商 ,我明白了,太阳提供商验证,列出了所有按键,读取所有证书等(经常),但不会尝试进行一些私人的按键操作。此外,提供为-Djava.security.debug = sunpkcs11到JVM没有给出任何进一步的内部(我偶然发现,SSL客户端身份验证使用智能卡在Java 6中工作,但在Java 7中失败)。

使用wireshark查看TLS协议握手看起来像,客户端试图省略使服务器关闭连接的客户端身份验证部分。 这导致客户端出现一些例外情况:

io.grpc.StatusRuntimeException:UNAVAILABLE:在io.grpc.stub.ClientCalls.toStatusRuntimeException处执行协议协商时关闭通道(ClientCalls.java:227)在io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:208)处处于io .grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:141)

从PEM文件提供与智能卡完全相同的密钥和证书给SslContextBuilder会产生工作连接,因此我得出结论认为,证书和密钥本身不构成问题,但可能/可能是某种配置sunpkcs11?

有没有人成功使用带有PKCS#15智能卡/ PKCS#11令牌的gRPC? 有没有人有进一步的建议,如何轻松理解,在这里失败?

链接地址: http://www.djcxy.com/p/73819.html

上一篇: gRpc with TLS Client Authentication using SunPKCS11 in netty fails

下一篇: Java SunPKCS11 access USB crypto