我正在尝试使用 twitter4j 库为我的java项目发送推文 . 在我第一次运行时,我收到有关证书 sun.security.validator.ValidatorException
和 sun.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"
但没有成功 . 这是获得twitters的过程:
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
24 回答
转到firefox浏览器中的URL,单击HTTPS证书链(URL地址旁边) . 单击
"more info" > "security" > "show certificate" > "details" > "export.."
. 选择名称并选择文件类型example.cer . 现在你有了keystore的文件,你必须将它添加到你的JVM确定cacerts文件的位置,例如 .
C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.
接下来在命令行中将
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
经过几个小时尝试构建证书文件以使我的Java 6安装与新的twitter证书一起使用后,我终于偶然发现了一个非常简单的解决方案,其中包含一个留言板中的注释 . 只需从Java 7安装中复制cacerts文件并覆盖Java 6安装中的文件 . 可能最好先备份cacerts文件,但是你只需要复制新的文件和BOOM!它只是工作 .
请注意,我实际上将Windows cacerts文件复制到Linux安装上,它运行得很好 .
该文件位于新旧Java jdk安装的
jre/lib/security/cacerts
中 .希望这可以拯救别人几个小时的恶化 .
我偶然发现了这个需要花费数小时研究才能修复的问题,特别是使用自动生成的证书,这与官方证书不同,它们非常棘手,而Java并不那么喜欢它们 .
请检查以下链接:Solve Problem with certificates in Java
基本上,您必须将证书从服务器添加到Java Home证书 .
生成或获取证书并配置Tomcat以在Servers.xml中使用它
下载类
InstallCert
的Java源代码并在服务器运行时执行它,提供以下参数server[:port]
. 不需要密码,因为原始密码适用于Java证书("changeit") .本程序将连接到服务器,Java将抛出异常,它将分析服务器提供的证书,并允许您在执行程序的目录中创建
jssecerts
文件(如果从Eclipse执行,请确保配置_2795095中的工作目录 .手动将该文件复制到
$JAVA_HOME/jre/lib/security
执行这些步骤后,与证书的连接将不再在Java中生成异常 .
以下源代码很重要,它从(Sun)Oracle博客中消失了,我发现它唯一的页面是在提供的链接上,因此我将其附在答案中以供参考 .
我的UI方法:
下载http://www.keystore-explorer.org/
打开$ JAVA_HOME / jre / lib / security / cacerts
输入PW:changeit(可以在Mac上更改)
导入.crt文件
CMD线:
keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
输入PW:changeit(可以在Mac上更改)
当我的系统上存在JDK和JRE 1.8.0_112时,情况略有不同 .
我使用已知的命令将新CA证书导入
[JDK_FOLDER]\jre\lib\security\cacerts
:尽管如此,我仍然保持相同的PKIX路径构建失败错误 .
我使用
java -Djavax.net.debug=all ... > debug.log
将调试信息添加到java CLI . 在debug.log文件中,以trustStore开头的行是:实际指向[JRE_FOLDER]\lib\security\cacerts
中的cacerts存储 .在我的情况下,解决方案是将JDK(添加了新CA)使用的cacerts文件复制到JRE使用的文件上并修复了问题 .
1.检查证书
尝试在浏览器中加载目标URL并查看站点的证书(通常可以通过带有锁定符号的图标访问它 . 它位于浏览器地址栏的左侧或右侧)是否由于其他原因而过期或不受信任 .
2.安装最新版本的JRE和JDK
新版本通常附带更新的可信证书集 .
如果可能的话,卸载旧版本 . 这将使错误配置错误显而易见 .
3.检查你的组态:
检查JAVA_HOME环境变量指向的位置 .
检查用于运行程序的java版本 . 在IntelliJ检查中:
文件 - >项目结构... - >项目设置 - >项目 - >项目SDK:
文件 - >项目结构... - >平台设置 - > SDK
4.从新Java版本复制整个密钥库
如果您使用JDK以外的最新版本进行开发 - 尝试使用最新安装的JRE中的新文件替换
%JAVA_HOME%/jre/lib/security/cacerts
文件(首先制作备份副本),如@ jeremy-goodell在他的_2795108中建议的那样5.将证书添加到密钥库
如果以上没有解决您的问题,请使用
keytool
将证书保存到Java的密钥库:带有证书的文件可以从@MagGGG在他的answer中建议的浏览器中获得 .
注意1:您可能需要对链中的每个证书重复此操作,以获取您站点的证书 . 从根目录开始 .
注2:
<alias_name>
在商店的密钥中应该是唯一的,否则keytool
将显示错误 .要获取商店中所有证书的列表,您可以运行:
如果出现问题,这将有助于您从商店中删除证书:
我想为smtp.gmail.com导入证书
只有解决方案适用于我1.输入命令查看此证书
将“----- BEGIN CERTIFICATE -----”和“----- END CERTIFICATE -----”之间的行复制并保存到文件gmail.cer中
跑
输入密码chageit
单击是以导入证书
重启java
现在运行命令,你很高兴
Issue Background:
当我尝试在我的项目中运行mvn clean install并通过Netbeans IDE clean和build选项时,我遇到了以下错误 . 此问题是由于我们通过NET beans IDE /通过命令提示符下载时无法使用证书,但能够通过浏览器下载文件 .
Error :
Resolution:
1. Download the certificate of the Url in question:
"run as adminstrator"启动IE(否则,我们将无法下载证书)
在IE-> https://url/local-repo中输入网址(在我的情况下,此网址包含不受信任的证书
. )
单击证书错误 - >查看证书下载证书
选择详细信息选项卡 - >复制到文件 - >下一步 - >选择“DER编码二进制X.509(.CER)
将证书保存在某个位置,例如:c:/user/sheldon/desktop/product.cer
恭喜!您已成功下载该站点的证书
2. Now install the key store to fix the issue.
运行keytool命令将下载的密钥库附加到现有证书文件中 .
Command: Below command in the bin folder of jdk (JAVA_HOME) .
示例命令行命令/输出:
这不是Twitter特定的答案,但这是您搜索此错误时出现的问题 . 如果您的系统在连接到 appears to have a valid certificate when viewed in a web browser 的网站时收到此错误,则可能表示 that website has an incomplete certificate chain .
有关问题的简短摘要:证书颁发机构不使用其根证书仅签署任何旧证书 . 相反,它们(通常)签署也设置了证书颁发机构标志的中间证书(即允许签署证书) . 然后,当您从CA购买证书时,他们会使用其中一个中间证书对您的CSR进行签名 .
您的Java信任存储很可能只有根证书,而不是中间证书 .
配置错误的网站可能只返回其签名的证书 . 问题:它是使用's not in your trust store. Browsers will handle this problem by downloading or using a cached intermediate certificate; this maximizes website compatibility. Java and tools like OpenSSL, however, won' t的中间证书签署的 . 这将导致问题中的错误 .
您可以使用Qualys SSL Test来验证此怀疑 . 如果你针对网站运行它,它说
然后证实了这一点 . 您也可以通过查看来看到这一点认证路径和看到文本额外下载 .
如何解决:服务器管理员需要配置Web服务器以返回中间证书 . 例如,对于Comodo来说,这就是
.ca-bundle
文件派上用场的地方 . 例如,在使用mod_ssl的Apache配置中,您将使用SSLCertificateChainFile
配置设置 . 对于nginx,您需要连接中间证书和签名证书,并在SSL证书配置中使用它 . 您可以在线搜索"incomplete certificate chain"找到更多信息 .它用于跳转证书验证 .
添加
cacerts
对我不起作用 . 在启用带有标志-Djavax.net.debug=all
的日志之后,就开始了解来自jssecacerts
的java读取 .导入
jssecacerts
终于工作了 .我试图通过他们的更新站点在Eclipse中安装Cucumber-Eclipse插件时遇到了这个问题 . 我收到了相同的SunCertPathBuilderException错误:
虽然其他一些答案对于这个问题的具体情况是恰当和有用的,但它们对我的问题无益和误导 .
就我而言,问题是为其更新站点提供的URL是:
但是,当通过浏览器导航到它时,它会重定向到(注意添加的“ .github ”):
所以解决方案是在eclipse中添加更新站点时简单地使用重定向版本的更新站点URL .
我们得出以上错误的原因是JDK与许多可信证书颁发机构(CA)证书捆绑在一个名为'cacerts'的文件中,但是这个文件并不知道我们的自签名证书 . 换句话说,cacerts文件没有导入我们的自签名证书,因此不会将其视为可信实体,因此它会产生上述错误 .
How to fix the above error
要解决上述错误,我们只需将自签名证书导入cacerts文件即可 .
首先,找到cacerts文件 . 我们需要找出JDK的位置 . 如果您通过IDE之类的IDE或IntelliJ Idea运行应用程序,请转到项目设置并找出JDK位置 . 例如,在Mac OS上,cacerts文件的典型位置将位于Window的机器上的此位置/ Library / Java / JavaVirtualMachines / {} / Contents / Home / jre / lib / security中,它位于{下} / {} / JRE / LIB /安全
找到cacerts文件后,现在我们需要将自签名证书导入此cacerts文件 . 如果您不知道如何正确生成自签名证书,请查看上一篇文章 .
如果您没有证书文件(.crt)并且只有.jks文件,则可以使用以下命令生成.crt文件 . 如果您已经有.crt / .pem文件,则可以忽略以下命令
##从密钥库生成证书(.jks文件)####
上面的步骤将生成一个名为selfsigned.crt.Now的文件,将证书导入cacerts
现在将证书添加到JRE / lib / security / cacerts(trustore)
例如
这就是全部,重新启动您的应用程序,它应该工作正常 . 如果它仍然不起作用并获得SSL握手异常 . 这可能意味着您使用的是不同的域,然后在证书中注册 .
链接with detailed explanation and step by step resolution is over here.
通常,当可信证书的PATH不匹配时会发生这种异常 . 检查安全通信所需的此服务器证书的配置或路径 .
我在ubuntu 15.10上遇到了同样的问题 . 请尝试在本地下载插件,例如https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip并使用此命令安装:
路径可能因您的环境而异 .
问候 .
对我来说,证书错误突然出现,因为我在背景中运行小提琴手并且与证书混淆 . 它充当代理,如此接近并重启eclipse .
它是答案的补充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之间的空间而出错 .
I fixed this using below method-
复制网址有连接问题
转到Android Studio->设置 - > Http设置
在'Test Connection'中,粘贴该网址并按确定
在Ok上单击,Android Studio将要求导入该URL的证书,导入它
就是这样 . 没有别的事情要做,我的问题就没了 . 也不需要重启工作室 .
当您使用atlassian软件时遇到以上错误 . JIRA
您可以将证书添加到其可信密钥库(将missing_ca更改为正确的证书名称):
如果要求输入密码
changeit
并确认y
之后只需重启jira .
如果您的存储库URL也适用于HTTP并且安全性不是问题,那么您可以转到 settings.xml (通常但不总是位于
%USERPROFILE%/.m2
中)和 replace HTTPS with HTTP 来查找<repository>
和<pluginRepository>
URL .例如,这个:
应该替换为:
我遇到了同样的问题,并使用以下简单的步骤解决了这个问题:
1)从谷歌下载InstallCert.java
2)使用 javac InstallCert.java 编译它
3)使用 java InstallCert.java 运行InstallCert.java,使用主机名和https端口,并在请求输入时按“1” . 它将“localhost”添加为可信密钥库,并生成名为“jssecacerts”的文件,如下所示:
java InstallCert localhost:443
4)将jssecacerts复制到$ JAVA_HOME / jre / lib / security文件夹中
解决这个问题的主要来源是:
https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html
通过传递arg
-Djavax.net.ssl.trustStore=
我使用自己的信任存储而不是JRE无论信任库中的证书是什么,我都收到此错误 . 对我来说,问题是arg行传递的属性的排序 . 当我把
-Djavax.net.ssl.trustStore=
和-Djavax.net.ssl.trustStorePassword=
before-Dspring.config.location=
&-jar
args我能够通过https成功调用我的休息呼叫 .如果您正在使用CloudFoundry并遇到证书问题,那么您必须确保使用包含证书的密钥库服务再次推送jar . 简单地取消绑定,绑定和重启将无效 .
目标:
使用https连接
验证SSL链
不处理cacerts
在运行时添加证书
不会丢失cacerts的证书
怎么做:
定义自己的密钥库
将证书放入密钥库
使用我们的自定义类重新定义SSL默认上下文
???
利润
我的Keystore包装文件:
如有必要,此类将创建密钥库,并且可以管理其中的证书 . 现在是SSL上下文的类:
此类作为单例生成,因为只允许一个defaultSSL上下文 . 那么,现在用法:
可能,它不适用于此设置,因为我将证书文件保存在资源文件夹中,所以我的路径不是绝对的 . 但一般来说,它完美地运作 .