Java/Jetty:TLS客户端认证中签名算法的选择 序言

Java/Jetty:TLS客户端认证中签名算法的选择 序言,java,jetty,ssl-client-authentication,Java,Jetty,Ssl Client Authentication,OpenJDK 11.0.2 2019-01-15 在使用TLSv1.2连接Jetty(9.4.14.v20151114)服务器时,我使用的是相互身份验证,密码套件为TLS_ECDHE_RSA_和_AES_256_GCM_SHA384 我的客户端使用标准Java TLS机制: javax.net.ssl.SSLContext SSLContext=SSLContext.getInstance(“TLS”); javax.net.ssl.KeyManager KeyManager=。。。; jav

OpenJDK 11.0.2 2019-01-15

在使用TLSv1.2连接Jetty(9.4.14.v20151114)服务器时,我使用的是相互身份验证,密码套件为TLS_ECDHE_RSA_和_AES_256_GCM_SHA384

我的客户端使用标准Java TLS机制:

javax.net.ssl.SSLContext SSLContext=SSLContext.getInstance(“TLS”);
javax.net.ssl.KeyManager KeyManager=。。。;
javax.net.ssl.TrustManager TrustManager=。。。;
init(new KeyManager[]{KeyManager},new TrustManager[]{TrustManager},null);
javax.net.ssl.SSLSocketFactory socketFactory=sslContext.getSocketFactory();
// ... 等等
我的客户端使用智能卡支持的PKCS11密钥库:

Provider pkcs11Provider=Security.getProvider(“SunPKCS11”).configure(configFile);
Security.addProvider(pkcs11Provider);
callbackHandler保护callbackHandler=。。。;
KeyStore KeyStore=KeyStore.Builder.newInstance(“PKCS11”,provider,callbackHandler).getKeyStore();
问题 Jetty发送了一长串支持的签名算法,用于客户端身份验证。客户端通过调用以下命令来决定使用其中的哪一个:

sun.security.ssl.SignatureScheme.getPreferableAlgorithm(列表方案、私钥签名密钥、协议版本);
这将选择签名方案RSASSA-PSS

后来,在方法上

java.security.Signature$Delegate.chooseProvider(int-type,java.security.Key,SecureRandom-sr)
客户端选择支持所选RSASSA-PSS算法的java.security.Provider$服务。RSASSA-PSS服务的提供程序是sun.security.rsa.SunRsaSign。密钥库中使用的SunPKCS11提供程序不提供RSASSA-PSS服务

问题是,此SunRsaSign提供程序的服务不支持用于签名的基于PKCS11的私钥,我得到了以下堆栈跟踪(手动复制,注意拼写错误):

问题 所选签名算法似乎是由不支持客户端身份验证中使用的私钥的java.security.Provider实现的

有办法解决这个问题吗?我是否可以让客户端以某种方式选择与PKCS11密钥库一起工作的客户端签名算法(例如RSA_PKCS1_SHA512)?我可以将Jetty服务器配置为不建议不起作用的客户端签名算法吗

编辑 Jetty SSLContextFactory配置(可能包含输入错误):


keystore.jks
...
truststore.jks
真的
TLSv1.2
TLS_ECDHE_RSA_与_AES_256_GCM_SHA384

您在客户端和服务器上配置了哪些TLS版本?服务器上的SslContextFactory配置是什么?启动后是否已转储服务器状态以查看其配置情况?@JoakimErdfelt TLSv1.2。我添加了SslContextFactory配置。我不知道应该在服务器中查找什么来确定如何建议客户端签名算法。我将此报告为一个bug:您在客户端和服务器上配置了什么TLS版本?服务器上的SslContextFactory配置是什么?启动后是否已转储服务器状态以查看其配置情况?@JoakimErdfelt TLSv1.2。我添加了SslContextFactory配置。我不知道要在服务器中查找什么来确定如何建议客户端签名算法。我报告这是一个bug:
java.security.InvalidKeyException: No installed provider supports this key: sun.security.pkcs11.P11Key$P11PrivateKey
    at java.base/java.security.Signature$Delegate.chooseProvider(Signature.java:1163)
    ...