【问题标题】:Using browser's certificate in java program在java程序中使用浏览器的证书
【发布时间】:2014-05-05 05:35:19
【问题描述】:

我正在尝试在 java 中使用 HttpURLConnection 发出 HTTP GET 请求。 当我使用浏览器时,它说我的证书不受信任,你想继续吗? 我接受证书并 GET 请求获取数据。但我在 java 中得到证书异常(下面给出)

我从这个例外中了解到,我需要下载该证书并将其放入 发出 GET 请求之前的 java 系统属性。

我的问题是。

  1. 如何从浏览器下载此证书?
  2. 我可以在我的 java 程序中使用浏览器的证书存储吗?我需要知道什么才能使用它?
  3. 如果我想在我的密钥库中安装证书,我需要做什么?

非常感谢:)

我正在尝试使用 keytool 命令下载证书。我不知道证书存储在服务器中的哪个位置,但我给出了我在浏览器中使用的服务器路径,并且浏览器说证书不受信任。

URL gatewayServiceUrl = new URL("http://192.168.55.179:56400/nwa");
        HttpURLConnection connection = (HttpURLConnection) gatewayServiceUrl.openConnection();
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Authorization", getExample.getBasicAuth());
        connection.connect();
        if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
            System.out.println("success");
            System.out.println(getExample.getDataFromStream(connection.getInputStream()));
        } else {
            System.out.println("success");
            System.out.println(getExample.getDataFromStream(connection.getErrorStream()));
        }
        System.out.println(connection.getResponseCode());






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
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
    at com.testweb.GetExample.main(GetExample.java:18)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)

【问题讨论】:

  • 你必须配置你的SSL证书并接受d证书的签名
  • 请先显示你的代码..到目前为止你尝试了什么

标签: java google-chrome ssl ssl-certificate httpurlconnection


【解决方案1】:

您必须将服务器证书的颁发者 CA(或者直接添加服务器证书,例如,如果您的 cds 是自签名的)到信任库,以避免 PKIX 路径构建器异常。

默认情况下,java 信任库位于 JAVA_HOME/jre/lib/security/cacerts(您可以使用 javax.net.ssl.trustStore 属性指定另一个信任库)。

为此,首先下载服务器证书。您可以下载服务器证书,例如使用 Chrome 连接到服务器 url 并单击绿色锁,然后选择选项卡连接并单击证书信息:

然后将此证书保存在光盘上。

现在您必须将此证书添加到 java 信任库,您可以使用 java keytool 来完成(如果在您的路径中,则使用 keytool,如果没有 keytool 在 JAVA_HOME/bin/keytool 上):

keytool -import -trustcacerts -alias myServerCertificate -file path/myServerCert.crt -keystore JAVA_HOME/jre/lib/security/cacerts

cacerts 的默认密码是:changeit

希望这会有所帮助,

【讨论】:

    【解决方案2】:

    其他答案有效,但我发现在浏览器中导出证书很麻烦。这是我从命令行导出然后导入证书的步骤: https://gist.github.com/jeffsheets/d2880dc1e2ea241b19f140c54809f750

    将证书从网站导出到 .cer 文件的命令(示例使用 google.com):

    openssl s_client -servername google.com -connect google.com:443 </dev/null 2>/dev/null | openssl x509 -inform PEM -outform DER -out google.com.cer
    

    导入本地 java 信任库的命令(使用您自己的 JAVA_HOME 位置)

    "$JAVA_HOME"/bin/keytool -keystore "$JAVA_HOME"/jre/lib/security/cacerts -importcert -alias google.com -file google.com.cer
    
    • 默认的 java keystore 密码是 changeit

    • 如果您收到更新被拒绝消息,在 Windows 文件资源管理器中设置 cacerts 文件的安全性为所有用户修改(或 linux 上的 chmod)

    • 如果没有找到 keytool,定义一个 JAVA_HOME 环境变量(或 将 $JAVA_HOME 替换为完整路径)

    【讨论】:

      【解决方案3】:

      否则,请尝试按照您在此链接中找到的解决方案:https://stackoverflow.com/a/3685601/2088039

      您可以使用 Firefox 导出证书,this site 有说明。然后使用keytool添加证书。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-16
        • 2012-04-23
        • 2013-11-02
        • 2018-05-04
        • 1970-01-01
        • 2011-01-30
        • 2012-01-11
        • 2018-06-12
        相关资源
        最近更新 更多