【问题标题】:Error Java connection HTTPS with SSL certificates带有 SSL 证书的 Java 连接 HTTPS 错误
【发布时间】:2017-03-28 03:12:05
【问题描述】:

我在用 Java 连接 SSL 时遇到问题。

我使用 java 1.7.80 和 S.O. : Ubuntu 14.04

我的问题是证书,甚至证书。我有四个必须使用 pkcs12 格式连接的元素。

testservizi.fattura.it.cer --> 标识远程服务器的证书

SDI-11036210158 --> 证书客户端

CAEntratetest.cer --> 证书 CA

private.key --> 私钥

1) 步骤 - 将文件 cer 转换为文件 pem

$ openssl x509 -in CAEntratetest.cer -outform PEM -out CAEntratetest.pem
$ openssl x509 -in SDI-11036210158.cer -inform DER -out SDI-11036210158.pem -outform PEM
$ openssl x509 -in testservizi.fatturapa.it.cer -inform DER -out testservizi.fatturapa.it.pem -outform PEM

2) 步骤 - 联合 pem 文件以创建链证书

$ cat CAEntratetest.pem SDI-11036210158.pem testservizi.fatturapa.it.pem > sum_cert.pem

3) 步骤 - 创建 p12 文件

$ openssl pkcs12 -export -in sum_cert.pem -inkey private.key -out sogei_auth.p12 -name sogei_auth

好的。我的第一个测试是在浏览器(Mozilla Firefox)中导入p12文件来验证操作。 导入成功,此时我输入url

https://testservizi.fatturapa.it/ricevi_file

他回答:

你好!这是一个 Axis2 Web 服务!

..完美的作品!!

现在我必须让它与 java 一起工作,并创建一个测试客户端

import java.io.File;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;

public class TestHTTPSClient {

    public static void main(String[] args) throws Exception {
        SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(new File("C:/testSSL/sogei_auth.p12"), "changeit".toCharArray()).build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext);
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        try {
            HttpGet httpget = new HttpGet("https://testservizi.fatturapa.it/ricevi_file");
            System.out.println("executing request " + httpget.getRequestLine());
            CloseableHttpResponse response = httpclient.execute(httpget);
            try {
                HttpEntity entity = response.getEntity();
                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                EntityUtils.consume(entity);
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
    }
}

2) 更改java.security中的keystore格式,否则无法读取文件p12

keystore.type=jks

改成

keystore.type=pkcs12

3) 在java中开始测试,我回答错误

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
..
.
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
... 26 more

你能帮帮我吗...

【问题讨论】:

    标签: java ssl https certificate


    【解决方案1】:

    如果不需要运行时认证,您可以将其存储在 jre cacerts 文件中以永久解决此问题!检查this 将证书安装到cacerts 的答案...

    并从您的源代码中删除所有与认证相关的代码!请说明您是否只想手动执行此运行时。

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多