“PKIX路径构建失败”和“无法找到请求目标的有效认证路径”

我正在尝试使用twitter4j库为我的java项目获取推文,该项目使用java.net.HttpURLConnection(可以在堆栈跟踪中看到)。在我的第一次运行中,我收到了一个关于证书sun.security.validator.ValidatorExceptionsun.security.provider.certpath.SunCertPathBuilderException的错误。然后我通过以下方式添加了twitter证书:

C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"

但没有成功。以下是获取推文的程序:

public static void main(String[] args) throws TwitterException {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("myConsumerKey")
.setOAuthConsumerSecret("myConsumerSecret")
.setOAuthAccessToken("myAccessToken")
.setOAuthAccessTokenSecret("myAccessTokenSecret");
    

TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
    

try {
Query query = new Query("iphone");
QueryResult result;
result = twitter.search(query);
System.out.println("Total amount of tweets: " + result.getTweets().size());
List<Status> tweets = result.getTweets();
        

for (Status tweet : tweets) {
System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
}
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Failed to search tweets: " + te.getMessage());
}

这里是错误:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=d35baff5 or
http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: 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.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
... 5 more
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)
... 20 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)
... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
2551873 次浏览

在这里,当受信任证书的PATH不匹配时,通常会发生这种异常。检查安全通信需要此服务器证书的配置或路径。

经过几个小时的尝试构建cert文件以使我的Java6安装与新的twitter cert一起工作,我终于偶然发现了一个非常简单的解决方案,该解决方案隐藏在其中一个留言板的注释中。只需从Java7安装中复制cacerts文件并覆盖Java6安装中的文件。可能最好先备份cacerts文件,然后您只需复制新文件并BOOM!它就可以工作了。

请注意,我实际上复制了一个Windows cacerts文件到Linux安装,它工作得很好。

该文件位于旧的和新的Javajdk安装中的jre/lib/security/cacerts中。

希望这能节省别人几个小时的恶化。

我偶然发现了这个问题,花了很多时间的研究来解决,特别是自动生成的证书,与官方证书不同,它非常棘手,Java不喜欢它们。

请检查以下链接:解决Java中的证书问题

基本上,您必须将服务器中的证书添加到JavaHome证书。

  1. 生成或获取您的证书并将Tomcat配置为在Servers.xml中使用它
  2. 下载类InstallCert的Java源代码并在服务器运行时执行它,并提供以下参数server[:port]。不需要密码,因为原始密码适用于Java证书(“Changeit”)。
  3. 程序将连接到服务器,Java将抛出异常,它将分析服务器提供的证书,并允许您在执行程序的目录中创建jssecerts文件(如果从Eclipse执行,请确保在Run -> Configurations中配置Work目录)。
  4. 手动将该文件复制到$JAVA_HOME/jre/lib/security

遵循这些步骤后,使用证书的连接在Java内将不再生成异常。

以下源代码很重要,它从(Sun)Oracle博客中消失了,我发现它的唯一页面是在提供的链接上,因此我将其附在答案中以供参考。

/*
* Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*   - Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*
*   - Redistributions in binary form must reproduce the above copyright
*     notice, this list of conditions and the following disclaimer in the
*     documentation and/or other materials provided with the distribution.
*
*   - Neither the name of Sun Microsystems nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* Originally from:
* http://blogs.sun.com/andreas/resource/InstallCert.java
* Use:
* java InstallCert hostname
* Example:
*% java InstallCert ecc.fedora.redhat.com
*/


import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;


/**
* Class used to add the server's certificate to the KeyStore
* with your trusted certificates.
*/
public class InstallCert {


public static void main(String[] args) throws Exception {
String host;
int port;
char[] passphrase;
if ((args.length == 1) || (args.length == 2)) {
String[] c = args[0].split(":");
host = c[0];
port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
String p = (args.length == 1) ? "changeit" : args[1];
passphrase = p.toCharArray();
} else {
System.out.println("Usage: java InstallCert [:port] [passphrase]");
return;
}


File file = new File("jssecacerts");
if (file.isFile() == false) {
char SEP = File.separatorChar;
File dir = new File(System.getProperty("java.home") + SEP
+ "lib" + SEP + "security");
file = new File(dir, "jssecacerts");
if (file.isFile() == false) {
file = new File(dir, "cacerts");
}
}
System.out.println("Loading KeyStore " + file + "...");
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
in.close();


SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory factory = context.getSocketFactory();


System.out.println("Opening connection to " + host + ":" + port + "...");
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setSoTimeout(10000);
try {
System.out.println("Starting SSL handshake...");
socket.startHandshake();
socket.close();
System.out.println();
System.out.println("No errors, certificate is already trusted");
} catch (SSLException e) {
System.out.println();
e.printStackTrace(System.out);
}


X509Certificate[] chain = tm.chain;
if (chain == null) {
System.out.println("Could not obtain server certificate chain");
return;
}


BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));


System.out.println();
System.out.println("Server sent " + chain.length + " certificate(s):");
System.out.println();
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
System.out.println
(" " + (i + 1) + " Subject " + cert.getSubjectDN());
System.out.println("   Issuer  " + cert.getIssuerDN());
sha1.update(cert.getEncoded());
System.out.println("   sha1    " + toHexString(sha1.digest()));
md5.update(cert.getEncoded());
System.out.println("   md5     " + toHexString(md5.digest()));
System.out.println();
}


System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
String line = reader.readLine().trim();
int k;
try {
k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
} catch (NumberFormatException e) {
System.out.println("KeyStore not changed");
return;
}


X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
ks.setCertificateEntry(alias, cert);


OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();


System.out.println();
System.out.println(cert);
System.out.println();
System.out.println
("Added certificate to keystore 'jssecacerts' using alias '"
+ alias + "'");
}


private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();


private static String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int b : bytes) {
b &= 0xff;
sb.append(HEXDIGITS[b >> 4]);
sb.append(HEXDIGITS[b & 15]);
sb.append(' ');
}
return sb.toString();
}


private static class SavingTrustManager implements X509TrustManager {


private final X509TrustManager tm;
private X509Certificate[] chain;


SavingTrustManager(X509TrustManager tm) {
this.tm = tm;
}


public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException();
}


public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
throw new UnsupportedOperationException();
}


public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
this.chain = chain;
tm.checkServerTrusted(chain, authType);
}
}
}
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

它用于跳转证书验证。

警告!

仅用于开发目的,这是不安全的!

  1. 转到浏览器中的URL:
  • Firefox-单击HTTPS证书链(URL地址旁边的锁定图标)。单击"more info" > "security" > "show certificate" > "details" > "export.."。拿起名称并选择文件类型example.cer
  • Chrome-单击地址栏中左侧的站点图标,选择“证书”->“详细信息”->“导出”并以“Der编码的二进制,单个证书”的格式保存。
  1. 现在您有一个带有keystore的文件,您必须将其添加到您的JVM中。确定cacerts文件的位置,例如。 C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  2. 接下来在命令行中将example.cer文件导入cacerts(可能需要管理员命令提示符):

keytool -import -alias example -keystore "C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts" -file example.cer

您将被要求输入默认为changeit的密码

重新启动您的JVM/PC。

来源: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html

我在ubuntu 15.10上遇到同样的问题。请尝试在本地下载插件,例如https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip并使用此命令安装:

sudo /usr/share/elasticsearch/bin/plugin install file:/home/dev/Downloads/elasticsearch-kopf-master.zip

路径可能会有所不同,具体取决于您的环境。

问候。

对我来说,证书错误弹出,因为我有小提琴在后台运行,这搞乱了证书。它充当代理,如此接近并重新启动eclipse。

我的UI方法:

  1. 这里下载密钥库资源管理器
  2. 打开$JAVA_HOME/jre/lib/security/cacerts
  3. 输入PW: change eit(可以在Mac上更改)
  4. 导入您的. crt文件

CMD线:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
  2. 输入PW:changeit(可以在Mac上更改)

当JDK和JRE 1.8.0_112都出现在我的系统上时,情况略有不同。

我使用已知的命令将新的CA证书导入[JDK_FOLDER]\jre\lib\security\cacerts

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>

不过,我还是收到了同样的PKIX路径构建失败错误。

我使用java -Djavax.net.debug=all ... > debug.log将调试信息添加到java CLI中。在debug.log文件中,以TrustStore是:开头的行实际上指向[JRE_FOLDER]\lib\security\cacerts中的cacerts存储。

在我的情况下,解决方案是将JDK使用的cacerts文件(添加了新的CA)复制到JRE使用的cacerts文件上,并修复了这个问题。

我想导入smtp.gmail.com的证书。对我有效的唯一解决方案是

  1. 输入命令查看此证书

    D:\openssl\bin\openssl.exe s_client -connect smtp.gmail.com:465
    
  2. -----BEGIN CERTIFICATE----------END CERTIFICATE-----之间的行复制并保存到文件gmail.cer

  3. 运行

    keytool -import -alias smtp.gmail.com -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file C:\Users\Admin\Desktop\gmail.cer
    
  4. 输入密码:changeit

  5. 点击“是”导入证书

  6. 重启Java

现在运行命令,你就可以走了。

我在尝试通过他们的更新站点在Eclipse中安装Cucumber-Eclipse插件时遇到了这个问题。我收到了相同的SunCertPathBuilderException错误:

Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

虽然其他一些答案对这个问题的给定情况是适当和有帮助的,但它们对我的问题没有帮助和误导。

在我的情况下,问题是为他们的更新站点提供的URL是:

https://cucumber.io/cucumber-eclipse/update-site

但是,当通过浏览器导航到它时,它会重定向到(注意添加的“. github”):

http://cucumber.github.io/cucumber-eclipse/update-site/

因此,解决方案是在eclipse中添加更新站点时简单地使用更新站点URL的重定向版本。

添加cacerts对我不起作用。 使用标志-Djavax.net.debug=all启用日志后,就知道从jssecacerts读取java了。

导入到jssecacerts终于工作了。

目标:

  1. 使用https连接
  2. 验证SSL链
  3. 不要和Cacerts打交道
  4. 在运行时添加证书
  5. 不要丢失cacerts的证书

如何做到:

  1. 定义自己的密钥库
  2. 将证书放入密钥库
  3. 使用我们的自定义类重新定义SSL默认上下文
  4. ????
  5. 利润

我的Keystore包装文件:

public class CertificateManager {


private final static Logger logger = Logger.getLogger(CertificateManager.class);


private String keyStoreLocation;
private String keyStorePassword;
private X509TrustManager myTrustManager;
private static KeyStore myTrustStore;


public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
this.keyStoreLocation = keyStoreLocation;
this.keyStorePassword = keyStorePassword;
myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
}


public void addCustomCertificate(String certFileName, String certificateAlias)
throws Exception {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
Certificate certificate = myTrustStore.getCertificate(certificateAlias);
if (certificate == null) {
logger.info("Certificate not exists");
addCertificate(certFileName, certificateAlias);
} else {
logger.info("Certificate exists");
}
tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(myTrustStore);
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
setMytrustManager((X509TrustManager) tm);
logger.info("Trust manager found");
break;
}
}
}


private InputStream fullStream(String fname) throws IOException {
ClassLoader classLoader = getClass().getClassLoader();
InputStream resource = classLoader.getResourceAsStream(fname);
try {
if (resource != null) {
DataInputStream dis = new DataInputStream(resource);
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
return new ByteArrayInputStream(bytes);
} else {
logger.info("resource not found");
}
} catch (Exception e) {
logger.error("exception in certificate fetching as resource", e);
}
return null;
}


public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
try {
InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(in, pass.toCharArray());
logger.info("Keystore was created from resource file");
return keyStore;
} catch (Exception e) {
logger.info("Fail to create keystore from resource file");
}


File file = new File(keystore);
KeyStore keyStore = KeyStore.getInstance("JKS");
if (file.exists()) {
keyStore.load(new FileInputStream(file), pass.toCharArray());
logger.info("Default keystore loaded");
} else {
keyStore.load(null, null);
keyStore.store(new FileOutputStream(file), pass.toCharArray());
logger.info("New keystore created");
}
return keyStore;
}


private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
IOException, KeyStoreException, NoSuchAlgorithmException {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream certStream = fullStream(certFileName);
Certificate certs = cf.generateCertificate(certStream);
myTrustStore.setCertificateEntry(certificateAlias, certs);
FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
myTrustStore.store(out, getKeyStorePassword().toCharArray());
out.close();
logger.info("Certificate pushed");
}


public String getKeyStoreLocation() {
return keyStoreLocation;
}


public String getKeyStorePassword() {
return keyStorePassword;
}
public X509TrustManager getMytrustManager() {
return myTrustManager;
}
public void setMytrustManager(X509TrustManager myTrustManager) {
this.myTrustManager = myTrustManager;
}
}

如有必要,此类将创建密钥库,并能够管理其中的证书。现在为SSL上下文类:

public class CustomTrustManager implements X509TrustManager {


private final static Logger logger = Logger.getLogger(CertificateManager.class);


private static SSLSocketFactory socketFactory;
private static CustomTrustManager instance = new CustomTrustManager();
private static List<CertificateManager> register = new ArrayList<>();


public static CustomTrustManager getInstance() {
return instance;
}


private X509TrustManager defaultTm;


public void register(CertificateManager certificateManager) {
for(CertificateManager manager : register) {
if(manager == certificateManager) {
logger.info("Certificate manager already registered");
return;
}
}
register.add(certificateManager);
logger.info("New Certificate manager registered");
}


private CustomTrustManager() {
try {
String algorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);


tmf.init((KeyStore) null);
boolean found = false;
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
defaultTm = (X509TrustManager) tm;
found = true;
break;
}
}
if(found) {
logger.info("Default trust manager found");
} else {
logger.warn("Default trust manager was not found");
}


SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{this}, null);
SSLContext.setDefault(sslContext);
socketFactory = sslContext.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);




logger.info("Custom trust manager was set");
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
logger.warn("Custom trust manager can't be set");
e.printStackTrace();
}
}


@Override
public X509Certificate[] getAcceptedIssuers() {
List<X509Certificate> out = new ArrayList<>();
if (defaultTm != null) {
out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
}
int defaultCount = out.size();
logger.info("Default trust manager contain " + defaultCount + " certficates");
for(CertificateManager manager : register) {
X509TrustManager customTrustManager = manager.getMytrustManager();
X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
out.addAll(Arrays.asList(issuers));
}
logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
X509Certificate[] arrayOut = new X509Certificate[out.size()];
return out.toArray(arrayOut);
}


@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
for(CertificateManager certificateManager : register) {
X509TrustManager customTrustManager = certificateManager.getMytrustManager();
try {
customTrustManager.checkServerTrusted(chain, authType);
logger.info("Certificate chain (server) was aproved by custom trust manager");
return;
} catch (Exception e) {
}
}
if (defaultTm != null) {
defaultTm.checkServerTrusted(chain, authType);
logger.info("Certificate chain (server) was aproved by default trust manager");
} else {
logger.info("Certificate chain (server) was rejected");
throw new CertificateException("Can't check server trusted certificate.");
}
}


@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
try {
if (defaultTm != null) {
defaultTm.checkClientTrusted(chain, authType);
logger.info("Certificate chain (client) was aproved by default trust manager");
} else {
throw new NullPointerException();
}
} catch (Exception e) {
for(CertificateManager certificateManager : register) {
X509TrustManager customTrustManager = certificateManager.getMytrustManager();
try {
customTrustManager.checkClientTrusted(chain, authType);
logger.info("Certificate chain (client) was aproved by custom trust manager");
return;
} catch (Exception e1) {
}
}
logger.info("Certificate chain (client) was rejected");
throw new CertificateException("Can't check client trusted certificate.");
}
}


public SSLSocketFactory getSocketFactory() {
return socketFactory;
}
}

这个类作为单例制作,因为只允许一个默认的SSL上下文。所以,现在用法:

            CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit");
String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt";
try {
certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
} catch (Exception e) {
log.error("Can't add custom certificate");
e.printStackTrace();
}
CustomTrustManager.getInstance().register(certificateManager);

可能,它不适用于此设置,因为我将证书文件保存在资源文件夹中,所以我的路径不是绝对的。但总的来说,它工作得很好。

1.查看证书

尝试在浏览器中加载目标URL并查看站点的证书(通常可以通过带有锁定标志的图标访问。它位于浏览器地址栏的左侧或右侧)是否过期或因其他原因不受信任。

2.安装最新版本的JRE和JDK

新版本通常带有更新的可信证书集。

如果可能,请卸载旧版本。这将使错误配置错误显式化。

3.检查你的配置:

  • 检查JAVA_HOME环境变量指向的位置。
  • 检查您用于运行程序的java版本。在IntelliJ检查中:
    • 文件->项目结构…->项目设置->项目->项目SDK:
    • 文件->项目结构…->平台设置->SDK

4.从新Java版本复制整个密钥库

如果您使用最新可用的JDK以外的JDK进行开发-请尝试将%JAVA_HOME%/jre/lib/security/cacerts文件替换为最新安装的JRE中的新文件(首先制作备份副本),正如@jeremy-Goodell在他的回答中建议的那样

5.将证书添加到您的密钥库

如果上面没有解决您的问题,请使用keytool将证书保存到Java的密钥库:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>

如@MagGGG在他的回答中建议的那样,可以从浏览器获得带有证书的文件。

注意1:您可能需要对链中的每个证书重复此操作到您站点的证书。从根开始。

注意2:<alias_name>在存储中的键中应该是唯一的,否则keytool将显示错误。

要获取您可以运行的存储中所有证书的列表:

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

如果出现问题,这将帮助您从存储中删除证书:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

我遇到了同样的问题,并使用以下简单步骤解决:

1)从谷歌下载InstallCert.java

2)使用javacInstallCert.java编译它

3)使用JavaInstallCert.java运行InstallCert.java,使用主机名和https端口,并在请求输入时按“1”。它将添加“localhost”作为受信任的密钥库,并生成一个名为“jssecacerts”的文件,如下所示:

Java InstallCertlocalhost:443

4)将jssecacerts复制到$JAVA_HOME/jre/lib/security文件夹中

这里解决问题的主要来源是:

https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html

问题背景:

我得到以下错误时,我尝试运行mvn清洁安装在我的项目,并通过Netbean IDE清洁和构建选项。 此问题是由于我们通过命令提示符通过NET bean IDE/下载时证书不可用,但可以通过浏览器下载文件。

错误

Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

决议:

1.下载相关URL的证书:

  • 通过“以管理员身份运行”启动IE(否则,我们将无法下载证书)
  • 在IE-中输入url>https://url/local-repo (在我的情况下,这个URL有一个不受信任的证书输入图片描述。)
  • 单击证书错误->查看证书下载证书
  • 选择详细信息选项卡->复制到文件->下一步->选择“DER编码的二进制X.509(. CER)
  • 将证书保存在某个位置,例如:c:/user/Sheldon/桌面/product.cer
  • 恭喜!您已成功下载该站点的证书

2.现在安装密钥存储库以解决问题。

  • 运行key工具命令将下载的密钥库追加到 现有证书文件。
  • 命令:jdk的bin文件夹中的以下命令(JAVA_HOME)

C:\Program Files\Java\jdk1.8.0_141\jre\bin>键工具-导入-文件 "C:/user/product.cer"-别名产品-keystore "C:/Program Files/Java /jdk1.8.0_141/jre/lib/security/cacerts".

  • 系统将提示您输入密码。输入密钥库密码: 再次输入“change eit”为“Trust this证书?[no]:”,输入 "是"

示例命令行命令/输出:

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]:  yes
Certificate was added to keystore
  • 现在你应该已经摆脱了NetBeans IDE中的“PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException”错误。

这不是Twitter特定的答案,但这是您搜索此错误时出现的问题。如果您的系统在连接到在Web浏览器中查看时似乎具有有效证书的网站时收到此错误,则可能意味着那个网站证书链不完整

简单总结一下:证书颁发机构不会使用他们的根证书来签署任何旧证书。相反,他们(通常)签署中间证书,这些证书也设置了证书授权中心标志(即允许签署证书)。然后,当你从CA购买证书时,他们会使用这些中间证书之一签署你的CSR。

您的Java信任存储很可能只有根证书,而不是中间证书。

配置错误的站点可能会返回只是他们签名的证书。问题:它是使用不在您的信任存储中的中间证书签名的。浏览器将通过下载或使用缓存的中间证书来处理此问题;这最大限度地提高了网站兼容性。然而,Java和OpenSSL等工具不会。这将导致问题中的错误。

你可以通过使用Qualys SSL测试来验证这种怀疑。如果你在一个网站上运行它,它说

此服务器的证书链不完整。

您还可以通过查看认证路径并查看文本额外下载来查看这一点。

修复方法:服务器管理员需要将Web服务器也配置为返回中间证书。例如,对于Comodo,这就是.ca-bundle文件派上用场的地方。例如,在具有mod_ssl的Apache配置中,您将使用SSLCertificateChainFile配置设置。对于nginx,您需要将中间证书和签名证书连接起来,并在SSL证书配置中使用该证书。您可以通过在线搜索“不完整证书链”找到更多信息。

这是对答案https://stackoverflow.com/a/36427118/1491414的补充。谢谢@MagGGG

  • 请确保您有管理员权限
  • 请使用双引号作为密钥库路径(-keystore C:\Program Files(x86)\Java\jre1.6.0_22\lib\security\cacerts"),因为在Windows操作系统中,默认安装位置将是Program Files,并且由于Program Files之间的空间,您将收到错误。

我用下面的方法修复了这个-

  1. 复制存在连接问题的url
  2. 转到Android Studio->设置->Http设置
  3. 在“测试连接”中,粘贴该url并按ok
  4. 在OK单击时,Android Studio会要求导入该证书 url,导入它
  5. 就这样。没有别的事可做,我的问题也消失了。没必要 也重新启动工作室。

当您使用atlassian软件出现上述错误时,例如。jira

2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous    Default Mail Handler [c.a.mail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user 'jira@xyz.pl' via protocol 'imaps, caused by: 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

您可以将证书添加到它的受信任密钥库(将missing_ca更改为正确的证书名称):

keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts

如果要求输入密码,请输入changeit并确认y

然后重启jira。

出现上述错误的原因是JDK与许多受信任的证书授权中心(CA)证书捆绑在一个名为“cacerts”的文件中,但该文件没有我们自签名证书的线索。换句话说,cacerts文件没有导入我们的自签名证书,因此没有将其视为受信任的实体,因此给出了上述错误。

如何修复上述错误

要修复上述错误,我们只需要将自签名证书导入cacerts文件即可。

首先,找到cacerts文件。我们需要找出JDK位置。如果您通过Eclipse或IntelliJ Idea等IDE之一运行应用程序,请转到项目设置并找出JDK位置。 例如,在Mac OS上,cacerts文件的典型位置将在此位置 /Library/Java /JavaVirtualMachines/\{\{JDK_version}}/Contents/Home/jre/lib/security 在Windows的机器上,它将位于\{\{Installation_directory}}/\{\{JDK_version}}/jre/lib/security

找到cacerts文件后,现在我们需要将自签名证书导入此cacerts文件。如果您不知道如何正确生成自签名证书,请查看上一篇文章。

如果您没有证书文件(. crt)而只有. jks文件,您可以使用以下命令生成. crt文件。如果您已经有. crt/. pem文件,那么您可以忽略以下命令

##从密钥库(. jks文件)生成证书####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

上面的步骤将生成一个名为selfsigned.crt.Now的文件将证书导入到cacerts

现在将证书添加到JRE/lib/security/cacerts(信任)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore \{\{cacerts path}}

对于例如

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

仅此而已,重新启动您的应用程序,它应该可以正常工作。如果它仍然不起作用并获得SSL握手异常。这可能意味着您使用的是不同的域,然后在证书中注册。

链接详细的解释和一步一步的解决方案是在这里。

如果您的存储库URL也适用于HTTP并且安全性不是问题,您可以转到settings.xml(通常但并非总是位于%USERPROFILE%/.m2)和用HTTP替换HTTPS以获取<repository><pluginRepository> URL。

例如,这:

<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-release</name>
<url>https://<artifactory>/libs-release</url>
</repository>

应该替换为:

<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-release</name>
<url>https://<artifactory>/libs-release</url>
</repository>

我通过传递arg-Djavax.net.ssl.trustStore=使用我自己的信任存储而不是JRE

无论信任库中的证书如何,我都收到了这个错误。对我来说,问题是在arg行上传递的属性的顺序。 当我输入-Djavax.net.ssl.trustStore=-Djavax.net.ssl.trustStorePassword=之前-Dspring.config.location=-jar参数时,我能够通过https成功调用我的rest调用。

如果您正在使用CloudFoundry并遇到证书问题,那么您必须确保使用包含证书的密钥存储服务再次推送jar。简单地取消绑定、绑定和重新启动是行不通的。

如果您的主机位于防火墙/代理后面,请在cmd中使用以下命令:

keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>

<proxy_hostname><proxy_port>替换为配置的HTTP代理服务器。将<remote_host_name:remote_ssl_port>替换为存在认证问题的远程主机(基本上是url)和端口之一。

获取打印的最后一个证书内容并复制它(也复制开始和结束证书)。将其粘贴到文本文件中并为其提供. crt扩展名。现在使用java keyool命令将此证书导入cacerts,它应该可以工作。

keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

尝试复制java cacerts:

cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts

如果您在java应用程序尝试与另一个应用程序/站点通信时在linux容器中看到此问题,那是因为证书已错误地导入到负载均衡器中。导入证书需要遵循一系列步骤,如果没有正确完成,您将看到以下问题

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
certification path to requested target

一旦证书正确导入,就应该完成。无需修改任何JDK证书。

这是一个解决方案,但以我关于这个问题的故事的形式:

我几乎死了尝试上面给出的所有解决方案(3天),没有什么对我有效。

我失去了所有的希望。

我联系了我的安全团队,因为我在代理后面,他们告诉我他们最近更新了他们的安全策略。

后来他们发布了一个新的“cacerts”文件,其中包含所有证书。

我删除了%JAVA_HOME%/jre/lib/security中存在的cacerts文件,它解决了我的问题。

因此,如果您面临这个问题,它可能来自您的网络团队也喜欢这样。

下载cert文件,并使用以下命令中的证书文件更新密钥库。

sudo keyool-ikcert-alias"aws2"-file~/Desktop/*aws.crt-keystore /Library/java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/security/cacerts

我为Intellij Idea解决了这个问题 我面临这个问题虽然,我改变了很多地方来解决问题。我找到了一个解决方案。右键单击您的项目,您将看到Maven,然后按生成源和更新文件夹重新导入输入图片描述

已经完成了。

我用Java8在Windows Server 2016上解决了这个问题,方法是从pkcs12商店导入证书到cacerts密钥库。

pkcs12存储路径:
C:\Apps\pkcs12.pfx

Javacacerts的路径:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

关键工具路径:
C:\Program Files\Java\jre1.8.0_151\bin

在命令提示符(作为管理员)中使用key工具定位到文件夹后,将cert从pkcs12导入到cacerts的命令如下:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

您将被提示:
1.输入目标密钥库密码(cacerts密码,默认为“change eit”)
2.输入源密钥库密码(pkcs12密码)


要使更改生效,请重新启动服务器机器(或只是重新启动JVM)。

我遇到了同样的问题,我使用的是8.1.0-3,但后来我使用了9.2.1-0,这个问题在没有任何手动步骤的情况下得到了修复。自签名证书工作正常。

我遇到了同样的问题,但在我的linux机器上更新了错误的jre。Tomcat很可能使用不同的jre,并且您的cli提示符配置为使用不同的jre。

确保你选择了正确的jre。

步骤#1:

ps -ef | grep tomcat

你会看到一些东西,比如:

root     29855     1  3 17:54 pts/3    00:00:42 /usr/java/jdk1.7.0_79/jre/bin/java

现在使用这个:

keytool -import -alias example -keystore  /usr/java/jdk1.7.0_79/jre/lib/security/cacerts -file cert.cer
PWD: changeit

*. cer文件可以如下所示进行遗传:(也可以使用自己的)

openssl x509 -in cert.pem -outform pem -outform der -out cert.cer

纠结了半天,终于找到了解决这个问题的方法。我在MAC 10.15.5(Catalina)中已经解决了这个问题。按照以下步骤操作。

  • 当我们在公司代理后面运行时,就会出现这个问题,在我的情况下,它是Zcaler。
  • 打开密钥链访问,导出CA证书。(选择CA证书,文件->导出项目并使用所需名称保存)
  • 从java文件夹复制现有cacerts的路径(/Library/Java /JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts )
  • 打开终端并导航到Keyool文件夹(/Library/Java /JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/bin )
  • 运行下面的命令。
  • 键工具-导入证书-文件(从keychainaccess导出证书的路径)-alias(命名)-keystore(java文件夹中现有cacerts的路径)
  • SUDO KeyTools-导入-file /Users/Desktop/RootCA.cer-alias demo-keystore /Library/Java /JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts
  • 它会要求输入密码,并将其作为:change eit
  • 它要求确认,说:是的

完成所有这些步骤后,退出eclipse并终端开始新的会话。

当证书比Java版本更新时,您将收到此错误。使用较新的Java版本将解决此问题。

问题是,你的eclipse无法连接它实际上正在尝试的站点。 我遇到过类似的问题,下面给出的解决方案对我有效。

  1. 关闭任何第三方互联网安全应用程序,例如Zcaler
  2. 如果您已连接,有时还需要断开VPN。

谢了

1-首先,将您的crt文件导入{JAVA_HOME}/jre/security/cacerts,如果您仍然面临此异常,请更改您的jdk版本。例如从jdk1.8.0_17jdk1.8.0_231

如果您仍然收到此错误

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
certification path to requested target

执行以下命令并重新启动java进程后

keytool -import -alias certificatealias -keystore C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts -file certificate.cer

那么JDK中存在一些问题。尝试从受信任的提供商安装JDK。 从受信任的提供商重新安装后,您将不会遇到此问题。

mac

接受的答案不适用于Mac,因为Mac(Chrome或Firefox)中没有可用的导出按钮。请选中这个答案以下载证书并按照以下步骤操作:

  1. 列出密钥库中安装的所有证书
cd $JAVA_HOME/lib/security
keytool -list -keystore cacerts

备注:

  • 密钥库的默认密码是:changeit
  • 对于Java-8或更低版本,使用命令cd $JAVA_HOME/jre/lib/security
  1. 在密钥库中导入证书之前,请备份密钥库
sudo cp cacerts cacerts.bak
  1. 在密钥库中导入下载的证书
sudo keytool -importcert -alias youralias -file /path/to/the/downloaded/certificate -keystore cacerts
  1. 检查证书是否存储在密钥库中
sudo keytool -list -keystore cacerts -alias youralias

如果您想查看更详细的信息,请添加-v标志:

sudo keytool -v -list -keystore cacerts -alias youralias

虽然我确实将证书复制到cacerts文件中,但错误并没有消失。

问题是证书上的日期过期,这就是它返回错误的原因。

我请求了一个新的有效证书,错误现在消失了。

我留下一些提示。

  1. 使用-Dssl.debug=true检查SSL。
  2. 检查您是否正在创建隧道或尝试忽略它
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (x509CertChain, authType) -> true).build();
httpClient = HttpClientBuilder.create()
.setSSLContext(sslContext)
.setConnectionManager(new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE))
.build()
)).build();


httpClient.execute(requisicao)

在我的情况下(Windows 10、IIS、本地开发环境(自签名SSL证书)、Apache JMeter)。我必须将两个证书导入缓存。 一个是我的自定义主机名: CN=localhost定制 第二个是localhost主机名: CN=localhost

问候。

为了Linux

  1. 下载证书:
echo \
openssl s_client -showcerts -servername DOMAIN_NAME -connect DOMAIN_NAME:443 2>/dev/null \
awk '/-----BEGIN CERTIFICATE-----/, /-----END CERTIFICATE-----/' >> ~/FILENAME.cer

占位符:

  • DOMAIN_NAME-服务域名
  • FILENAME-文件路径证书
  1. 导入证书到JavaCA证书(Java11):
keytool -importcert -trustcacerts -file ~/FILENAME.cer -alias ca_alias -keystore $JAVA_HOME/lib/security/cacerts
  1. 输入密钥库默认密码changeit
  2. 信任此证书:输入yes。输出:
Certificate was added to keystore

我正面临这个问题与Java8但它得到了解决后升级到Java11

错误

A problem occurred configuring root project 'uy-android-pagos'.
> Could not resolve all artifacts for configuration ':classpath'.
> Could not resolve com.goo  gle.firebase:firebase-crashlytics-gradle:2.1.0.
Required by:
project :
> Could not resolve com.goo  gle.firebase:firebase-crashlytics-gradle:2.1.0.
> Could not get resource 'https://depdes.artifactory.prod.cloud.ihf/artifactory/itau-oq6-frameworks-maven/com/goo%20%20gle/firebase/firebase-crashlytics-gradle/2.1.0/firebase-crashlytics-gradle-2.1.0.pom'.
> Could not GET 'https://depdes.artifactory.prod.cloud.ihf/artifactory/itau-oq6-frameworks-maven/com/goo%20%20gle/firebase/firebase-crashlytics-gradle/2.1.0/firebase-crashlytics-gradle-2.1.0.pom'.
> PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

解决方案

请记住,有许多可能的原因会产生此错误,在我的情况下,我通过以下方式修复了它:

  1. 将项目与Gradle文件同步
  2. 检查错误Could not resolve com.goo gle.firebase:firebase-crashlytics-gradle:2.1.0.
  3. build.gradle (:project)com.goo gle.firebase:firebase-crashlytics-gradle:2.1.0更改为com.google.firebase:firebase-crashlytics-gradle:2.1.0(注意空格)

依赖类路径中的任何错误都会生成这种类型的异常。检查生成问题的提交的gradle。

GL

如果您在IDE(例如Spring Tools SuiteEclipse)中遇到此错误,请首先尝试使用urlHTTP版本而不是HTTPS

当我尝试将SonarQube链接添加到Spring Tools Suite时遇到此错误。我将我的url替换为:

http://sonarqube...

而不是

https://sonarqube...

我已成功连接SonarQube

我希望这对像我这样正在寻找这个问题答案的人有所帮助。

在我的情况下,我解决了这个问题,从Android Studio终端运行以下命令

./gradlew assemble

在那之后,项目运行没有问题。

这是针对Glassfish服务器的:

通常Glassfish会查看存储在GLASSFISH_SERVER\glassfish\domains\domain1\config位置的cacerts.jks证书文件。您可以更改此配置或将cacerts.jks文件替换为cacerts文件。

Glassfish使用了一些默认的JVM选项:

 -XX:+UnlockDiagnosticVMOptions
-XX:NewRatio=2
-XX:MaxPermSize=192m
-Xmx512m
-client
-javaagent:C:/glassfish5/glassfish/lib/monitor/flashlight-agent.jar
-Djavax.xml.accessExternalSchema=all
-Djavax.net.ssl.trustStore=C:\glassfish5\glassfish\domains\domain1/config/cacerts.jks
-Djdk.tls.rejectClientInitiatedRenegotiation=true
-Djdk.corba.allowOutputStreamSubclass=true

如果您使用的是ubuntu/linux系统,请在终端中运行以下命令。

cd /usr/local/share/ca-certificates

CP /location文件/------. crt。(复制 /usr/local/share/ca-certificates中的crt文件)

sudo update-ca证书

受信任的证书存储在密钥工具中。当任何网站受信任的证书没有添加到密钥工具中时,会发生此错误。除了上述答案,请参考

在selenium断链脚本中面对PKIX路径构建失败异常

  • 将JDK版本从旧的jdk1.8.0_90版本更改为最新版本jdk1.8.0_239
  • 如上所述,将证书导入密钥库
  • 在基于java/React的原生Android项目中为gradle.properties文件添加密钥库属性

systemProp.javax.net.ssl.trustStore=C://程序 文件//采用打开J DK//j dk-8.0.282.8-hotspot//j re//lib//security//ca cert s

systemProp.javax.net.ssl.trust存储密码

解决此异常的简单步骤(我在java 11上做过),

  • 首先,您需要下载您尝试调用的目标域的公共SSL证书文件,为此
  • 在chrome中打开目标域名网站(示例:https://amazonservice.domain.com
  • 点击浏览器中URL前的小锁图标
  • 单击查看证书
  • 现在点击证书有效,如下所示
  • 输入图片描述
  • 现在将打开一个新的Popup,如下所示, Go
  • 打开详细信息标签
  • 选择顶部的根证书
  • 单击导出并将. ser文件保存到您的系统的目录中

现在你有了目标域的公共密钥库,你正试图在你的java应用程序中调用它,现在我们需要将该密钥库植入你的jre,为此,转到$JAVA_HOME/bin目录并运行以下命令

./keytool -importcert -alias someAliasName -keystore {JAVA_HOME}/lib/security/cacerts -file {PathToDownloads}/certificateFileName.cer

它会问你密码,如果你知道输入密码,证书的默认密码是changeit

参考文献

  1. https://confluence.atlassian.com/kb/how-to-import-a-public-ssl-certificate-into-a-jvm-867025849.html
  2. https://confluence.atlassian.com/kb/unable-to-connect-to-ssl-services-due-to-pkix-path-building-failed-error-779355358.html