使用自定义 keystore .jks 文件和密码的 SSL 连接并将请求发送到 URL

标签 ssl httpclient ssl-certificate keystore truststore

我需要使用自定义 keystore .jks 文件和密码向 URL 发送请求。下面是一段代码。它不是很干净。我需要清理它 :-) 我看到 ava.lang.NoSuchFieldError 异常。我不知道我在这里错过了什么:-/

    try{

                   KeyStore truststore = KeyStore.getInstance(KeyStore.getDefaultType());
        InputStream keystoreInput = new FileInputStream(KEY_STORE_PATH);
        truststore.load(keystoreInput, KEY_STORE_PASSWORD.toCharArray());
        System.out.println("Keystore has " + truststore.size() + " keys"); 

        TrustManagerFactory trustManagerFact = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        trustManagerFact.init(truststore);

        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManager[] trustManagers = trustManagerFact.getTrustManagers();

        KeyManager[] keyManagers = getKeyManagers("jks", new FileInputStream(KEY_STORE_PATH), KEY_STORE_PASSWORD.toString());
        sslContext.init(keyManagers, trustManagers, new SecureRandom());
        SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext,new StrictHostnameVerifier());
        //sslContext.init(keyManagers, trustManagers, new SecureRandom());

        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("https", 443, socketFactory));


        // This is the default port number only; others are allowed

           System.out.println("Trying to get connection");
        //DefaultHttpClient httpclient = new DefaultHttpClient();

        ClientConnectionManager manager = httpclient.getConnectionManager();
         System.out.println("got connection");
        manager.getSchemeRegistry().register(new Scheme("https", 443, socketFactory));

        HttpGet httpget = new HttpGet(serviceUrl);

        // SOAP request send

        response = httpclient.execute(httpget);

............//更多代码

public static KeyManager[] getKeyManagers(String keyStoreType, InputStream keyStoreFile, String keyStorePassword) 抛出异常{ KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(keyStoreFile, keyStorePassword.toCharArray()); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, keyStorePassword.toCharArray()); 返回 kmf.getKeyManagers();

我看到以下异常

java.lang.NoSuchFieldError:org/apache/http/protocol/HTTP.DEF_CONTENT_CHARSET 在 org.apache.http.impl.client.DefaultHttpClient.setDefaultHttpParams(DefaultHttpClient.java:175) 在 org.apache.http.impl.client.DefaultHttpClient.createHttpParams(DefaultHttpClient.java:158) 在 org.apache.http.impl.client.AbstractHttpClient.getParams(AbstractHttpClient.java:448) 在 org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:309) 在 org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:466)

于 ClientConnectionManager manager = httpclient.getConnectionManager();

你们能告诉我我在这里缺少什么吗?

最佳答案

这种情况在使用 SSL 时很常见,尤其是在使用 3rd 方库时。基本上你有 jar 文件版本不匹配。检查您使用的 jar 文件的版本是否正确。你在使用像 BouncyCaSTLe 这样的东西吗?检查这个 jar 的版本。

关于使用自定义 keystore .jks 文件和密码的 SSL 连接并将请求发送到 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16325366/

相关文章:

php - SSL 问题,登录网站

python - 在 Ubuntu 14.04 上使用 Apache 为我的 Django 2.0.1 服务器部署 SSL (droplet)

java - 如何在命令行参数中配置系统属性 (ssl/tls) 的 Eclipse 运行配置

java - 使用 Android 发布 XML 文件

ssl - WebSphere 多 SSL 版本支持

wcf - 不使用 IIS 的 WCF 服务上的证书

api - 如何安全地使用 Reddit API? (HTTPS)

java - HttpClient,如何发送 URI 字符串中的非法字符

javascript - 无论证书有效性如何,我的 node.js https 客户端始终有效

amazon-web-services - 如何对Amazon ELB SSL使用* .pfx证书