簡體   English   中英

帶有SSL證書的Java HTTPS連接錯誤

[英]Java HTTPS connection with SSL certificate Error

我正在嘗試在Apache服務器上使用通過StartSSL.com獲得的SSL證書。 與瀏覽器的連接很好,但是當我嘗試使用Java應用程序時,我得到了這個例外:

線程“main”中的異常javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到所請求目標的有效證書路徑

我不明白可能是什么問題,因為在瀏覽器中,我獲得了帶有綠色標簽的SSL。

問題是您的Java不信任證書。 您必須將其導入java的truststore

# Copy the certificate into the directory Java_home\Jre\Lib\Security
# Change your directory to Java_home\Jre\Lib\Security>
# Import the certificate to a trust store.
# Here's the import command:

keytool -import -alias ca -file somecert.cer -keystore cacerts -storepass changeit [Return]

Trust this certificate: [Yes]

changeit是默認的信任庫密碼。

對於導入信任庫的每個證書,都必須提供新別名。

導入方法是Here的引用

此消息是由於:

  1. JRE沒有將根CA作為其密鑰庫中的受信任條目。
  2. 服務器沒有發送正確的鏈。

但是,2在您的情況下無效,因為瀏覽器能夠構建鏈並驗證證書。

因此,您需要獲取根CA並將其作為受信任條目放在JRE密鑰庫中。 有很多資源記錄了“如何”。 其中之一是: https//access.redhat.com/documentation/en-US/Fuse_Message_Broker/5.3/html/Security_Guide/files/i379776.html

編輯1:由於您想要共享Java應用程序,我們將值得努力從CA獲取證書,該證書的根已經在您的應用程序支持的Java版本的信任庫中受信任。

據我所知,這與Java證書密鑰庫有關。 您的證書不被java接受。 以下是如何將證書添加到Java可信證書密鑰庫的鏈接: https//docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html

SO上已經存在類似的一些問題(如下所示: PKIX路徑構建失敗:無法找到所請求目標的有效證書路徑 )。

通常的答案是您的Java客戶端沒有完成證書鏈所需的證書。

如果您需要正確的證書驗證,那么您必須弄清楚證書鏈發生故障的位置。 如果您不這樣做(因為這是概念證明或開發沙箱,或其他),那么您可以通過將證書添加到您與客戶端一起使用的信任庫來輕松解決此問題。

編輯:

至於為什么你的瀏覽器會接受這個,你的瀏覽器可能會在你需要的鏈中擁有證書,或者你心不在焉地告訴你的瀏覽器信任證書,即使它也無法驗證證書。

我建議使用建立在apache http api上的http-request

import org.junit.Test;

import static org.apache.http.HttpHeaders.ACCEPT;
import static org.apache.http.HttpStatus.SC_OK;
import static org.apache.http.entity.ContentType.APPLICATION_XML;
import static org.junit.Assert.assertEquals;

public class HttpRequestSSLTest {

private final HttpRequest<?> httpRequest = HttpRequestBuilder.createGet("https://mms.nw.ru/")
        .trustAllCertificates()
        .trustAllHosts()
        .addDefaultHeader(ACCEPT, APPLICATION_XML.getMimeType())
        .build();

@Test
public final void ignoreSSLAndHostsTest() throws Exception {

    assertEquals(SC_OK, httpRequest.execute().getStatusCode());
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM