带有SSL相互身份验证的Jersey客户端

时间:2019-04-03 14:08:36

标签: java ssl jersey keytool jersey-client

我有一个使用jersey客户端用Java和im编写的代码,我尝试进行相互认证,所以我也有一个.jks,其中包含我由CA签名的证书,所以这是我的代码

    var allofThemExist = dbObjectses.All(x => hashet.Contains(x.FirstName) || hashet.Contains(x.LastName));

因此,当我仅使用1个证书执行该代码时,他工作良好,但是当我有2个证书时,他不工作,我认为问题是.jks不知道他必须使用哪个证书,但我不知道如何要指定他必须使用哪一个,我已经看了很多论坛,但看不到有人为我提供解决问题的方法

1 个答案:

答案 0 :(得分:0)

我有同样的问题,多亏了answer,我才得以解决。 基本上,没有办法“开箱即用”地执行此操作,必须实现自己的KeyManager。

我进一步简化了链接的答案,代码看起来像这样:

public class FilteredKeyManager implements X509KeyManager {

    private final X509KeyManager originatingKeyManager;

    public FilteredKeyManager(X509KeyManager originatingKeyManager) {
        this.originatingKeyManager = originatingKeyManager;
    }

    @Override
    public String chooseClientAlias(String[] arg0, Principal[] arg1, Socket arg2) {
        return "yourAliasHere";
    }
}

对于其余的重写方法,只需调用originatingKeyManager。

要创建SSLContext,我没有使用SSLConfigurator,但是参数相同(路径和密码)。

// Init keystore
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream ksFile = new FileInputStream("yourKeystorePath");
ks.load(ksFile, "keystorePassword".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, pass);

// Init truststore
KeyStore trustKeystore = KeyStore.getInstance("JKS"));
FileInputStream tsFile = new FileInputStream("yourTruststorePath"));
trustKeystore.load(tsFile, "truststorePassword".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustKeystore);

// Create instance of custom KeyManager
KeyManager[] km = new KeyManager[] { new FilteredKeyManager((X509KeyManager) kmf.getKeyManagers()[0]) };

// Create SSLContext using custom KeyManager
SSLContext context = SSLContext.getInstance("TLSv1");
context.init(km, ts, new SecureRandom());