编辑: -尝试格式化问题并在我的博客中以更明显的方式接受答案
这是原始问题.
我收到此错误:
详细消息sun.security.validator.ValidatorException:PKIX路径构建失败:
sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径导致javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径
我使用Tomcat 6作为网络服务器.我有两个HTTPS Web应用程序安装在不同端口上但位于同一台机器上的不同Tomcats上.说App1(port 8443)和
App2(port 443).App1连接到App2.当App1所连接到App2我得到上述错误.我知道这是一个非常常见的错误,所以在不同的论坛和网站上遇到了很多解决方案.我有server.xml两个Tomcats 的以下条目:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Run Code Online (Sandbox Code Playgroud)
每个站点都说同样的原因,即app2提供的证书不在app1 jvm的可信存储中.当我试图在IE浏览器中访问相同的URL时,这似乎也是正确的,它可以工作(加热,这个网站的安全证书存在问题.在这里我说继续这个网站).但是当Java客户端(在我的情况下)遇到相同的URL时,我得到上述错误.所以把它放在信任库中我试过这三个选项:
选项1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Run Code Online (Sandbox Code Playgroud)
Option2 在环境变量中设置如下
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Run Code Online (Sandbox Code Playgroud)
选项3 在环境变量中设置如下
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Run Code Online (Sandbox Code Playgroud)
但没有任何效果.
最后工作的 是执行如何使用Apache HttpClient处理无效SSL证书中建议的Java方法?由Pascal Thivent执行,即执行程序InstallCert.
但这种方法适用于devbox设置,但我无法在生产环境中使用它.
我很奇怪,为什么上面提到的三种方法时,我已经中提到的相同值没有工作server.xml的app2服务器和相同的价值观信任设置
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); …
我正在添加到我们的大型Java应用程序的模块必须与另一家公司的SSL安全网站进行交谈.问题是该站点使用自签名证书.我有一份证书副本,以验证我没有遇到中间人攻击,我需要将此证书合并到我们的代码中,以便与服务器的连接成功.
这是基本代码:
void sendRequest(String dataPacket) {
String urlStr = "https://host.example.com/";
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setMethod("POST");
conn.setRequestProperty("Content-Length", data.length());
conn.setDoOutput(true);
OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());
o.write(data);
o.flush();
}
Run Code Online (Sandbox Code Playgroud)
在没有为自签名证书进行任何额外处理的情况下,这会在conn.getOutputStream()处死,但有以下异常:
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.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 …Run Code Online (Sandbox Code Playgroud) 我尝试获取https网址的页面内容,该网址内容在获取输入流时会引发异常.
String httpsURL = "https://careers.virtusa.com/";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
InputStream ins = con.getInputStream();
Run Code Online (Sandbox Code Playgroud)
例外情况如下,
Exception in thread "main" javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.sun.net.ssl.internal.ssl.InputRecord.handleUnknownRecord(InputRecord.java:523)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:355)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at url.JavaHttpsExample.main(JavaHttpsExample.java:18)
Run Code Online (Sandbox Code Playgroud)
无论HttpURLConnection和HttpsURLConnection失败.我试过org.apache.http.impl.client.CloseableHttpClient但得到了同样的例外.在浏览器中它工作正常.
我想在Jenkins的安全性下启用LDAPS,但我的LDAP服务器有一个自签名的CERT.有没有人这样做或有一些指示这样做?我必须使用keytool吗?
在我的Dockerfile中,我正在尝试以下操作,但这不起作用:
FROM jenkins
USER root
# Install CA certs
COPY ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
RUN chmod +r /etc/ssl/certs/ca-certificates.crt
# Install the Jenkins plugin
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
# Expose container port 33838 for Jenkins UDP-based auto-discovery
EXPOSE 33848/udp
ENV JAVA_OPTS -Xmx2048m
Run Code Online (Sandbox Code Playgroud) 我想访问一个SOAP webservice url,其中https托管在远程虚拟机中.我在使用HttpURLConnection访问它时遇到异常.
这是我的代码:
import javax.net.ssl.*;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* Created by prasantabiswas on 07/03/17.
*/
public class Main
{
public static void main(String [] args)
{
try
{
URL url = new URL("https://myhost:8913/myservice/service?wsdl");
HttpURLConnection http = null;
if (url.getProtocol().toLowerCase().equals("https")) {
trustAllHosts();
HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
https.setHostnameVerifier(DO_NOT_VERIFY);
http = https;
} else {
http = (HttpURLConnection) url.openConnection();
}
String SOAPAction="";
// http.setRequestProperty("Content-Length", String.valueOf(b.length));
http.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
http.setRequestProperty("SOAPAction", SOAPAction);
http.setRequestMethod("GET");
http.setDoOutput(true);
http.setDoInput(true); …Run Code Online (Sandbox Code Playgroud) 假设我想发布一个商业产品,它有两个用Java编写的组件,使用RESTful API在本地网络上相互通信.它可能是一个音乐管理器,一个联系人数据库,一本食谱---重要的是这是一个合理且非常可能的场景.
请注意,我说的是两个组件通过本地网络相互通信 - 而不是与我的服务器进行通信.
那么如何确保通信安全?
我知道如果我为这个世界建立一个HTTP服务器,我可以(甚至便宜地)购买SSL证书.我做到了 但我不能告诉用户去购买证书---他们不知道我在说什么,也永远无法弄清楚如何安装它.
那我该怎么办?向每个人发送我自己的自签名证书并做一些非常糟糕的事情,如在Java中禁用证书验证?可怕,我知道.但至少信息不会以纯文本形式出现.
谁有更好的解决方案?
我正在尝试使用Jetty(或任何其他库)连接到安全的websocket.
问题是我收到"找不到可信证书"错误.我正在使用使用keytool生成的自签名证书.可以做些什么?
import java.net.URI;
import java.util.concurrent.Future;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketAdapter;
import org.eclipse.jetty.websocket.client.WebSocketClient;
public class Socket extends WebSocketAdapter{
public static void main(String[] args) {
String url = "wss://qa.sockets.stackexchange.com/"; //or "wss://echo.websocket.org"
// making sure the the jvm find keystore
String JAVASEC="C:/Program Files/Java/jdk1.8.0_25/jre/lib/security/";
System.setProperty("javax.net.ssl.keyStore", JAVASEC+"keystore.jks");
System.setProperty("javax.net.ssl.trustStore", JAVASEC+"cacerts.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.out.println(System.getProperty("javax.net.ssl.trustStore"));
SslContextFactory sslContextFactory = new SslContextFactory();
Resource keyStoreResource = Resource.newResource(Socket.class.getResource("/keystore.jks"));//generated with keytool
sslContextFactory.setKeyStoreResource(keyStoreResource);
sslContextFactory.setKeyStorePassword("password");
sslContextFactory.setKeyManagerPassword("password");
WebSocketClient client = new WebSocketClient(sslContextFactory);
try{
client.start();
Socket socket = new Socket();
Future<Session> fut = …Run Code Online (Sandbox Code Playgroud) 我编写了Jersey RESTful客户端,它们使用Dumb X509TrustManager和HostnameVerifier来信任我们实验室系统上的所有SSL证书,以便更轻松地处理自签名的证书.
ClientConfig config = new DefaultClientConfig();
SSLContext context = null;
try
{
context = SSLContext.getInstance("SSL");
context.init(null,
new TrustManager[] { new DumbX509TrustManager() },
null);
config.getProperties()
.put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
new HTTPSProperties(this.getHostnameVerifier(),
context));
webClient = Client.create(config);
}
....
Run Code Online (Sandbox Code Playgroud)
有没有办法让我使用CXF做类似的事情?
我在服务器和客户端之间建立了一个https连接,其中客户端是一个java程序,服务器是一个servlet.我使用以下代码从服务器打印证书详细信息.
URL url = new URL("https://localhost:8443/cert");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sslsocketfactory);
connection.setDoOutput(true);
if(connection!=null){
Certificate[] certs = connection.getServerCertificates();// #1
System.out.println("Cert Type : " + certs[0].getType());
System.out.println("Cert Hash Code : " + certs[0].hashCode());
System.out.println("Cert Public Key Algorithm : " + certs[0].getPublicKey().getAlgorithm());
System.out.println("Cert Public Key Format : " + certs[0].getPublicKey().getFormat());
System.out.println("\n");
}
Run Code Online (Sandbox Code Playgroud)
但我得到以下例外.
java.lang.IllegalStateException: connection not yet open
Run Code Online (Sandbox Code Playgroud)
我认为握手应该在调用theurl.openconnection()方法时立即进行.这里有什么问题?
异常抛出行号'#1'(参见上面代码中的注释)
我正在使用PHPStorm 7来创建RESTful API.我想使用内置的REST客户端,但需要能够告诉它允许不受信任的SSL证书.我在我的测试服务器上使用自签名证书.
在我发送请求的那一刻,我得到了这个回复.
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
Run Code Online (Sandbox Code Playgroud)
我可以改变一个选项来忽略这个吗?