我的问题:
我想连接到可能使用Java默认情况下不信任的证书的服务器(不限于HTTPS协议-可以是LDAP-over-
SSL,可以是SMTPS,可以是IMAPS等)。自签名)。
所需的工作流程是尝试连接,检索证书信息,将其提供给用户,如果他接受了,则将其添加到信任库中,以便将来继续受信任。
我被困于获取证书。我有从这里以及关于Java
SSL问题的答案所指向的站点编写的代码(请参阅文章末尾)。该代码仅创建一个SSLSocket
,开始SSL握手,然后向SSL会话询问Certificate[]
。当我使用已经可以信任的证书连接到服务器时,代码可以正常工作。但是,当我使用自签名证书连接到服务器时,会得到通常的结果:
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)
[etc]
如果我与一起运行,-Djavax.net.debug=all
我会看到JVM确实检索了自签名证书,但在返回证书之前将破坏使用不可信证书的连接。
好像是鸡和鸡蛋的问题。它不会让我看到证书,因为它们不受信任。但是我需要查看证书才能将其添加到信任库中,以便它们将被信任。你如何打破这个?
例如,如果我以以下方式运行程序:
java SSLTest www.google.com 443
我得到了Google正在使用的证书的打印输出。但是如果我以
java SSLTest my.imap.server 993
我得到上面引用的异常。
代码:
import java.io.InputStream;
import java.io.OutputStream;
import java.security.cert.*;
import javax.net.SocketFactory;
import javax.net.ssl.*;
public class SSLTest
{
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: SSLTest host port");
return;
}
String host = args[0];
int port = Integer.parseInt(args[1]);
SocketFactory factory = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.startHandshake();
Certificate[] certs = socket.getSession().getPeerCertificates();
System.out.println("Certs retrieved: " + certs.length);
for (Certificate cert : certs) {
System.out.println("Certificate is: " + cert);
if(cert instanceof X509Certificate) {
try {
( (X509Certificate) cert).checkValidity();
System.out.println("Certificate is active for current date");
} catch(CertificateExpiredException cee) {
System.out.println("Certificate is expired");
}
}
}
}
}
请参阅Andreas
Sterbenz的InstallCert实用程序的副本
。
我刚刚在Google Cloud上的VM上设置了我的Neo4j服务器,我使用的是企业版4.1.1,并且我已经完成了David Allen关于如何使用LetsEncrypt获得证书的精彩帖子(在这里)。 这一切都工作得很好,我现在有了一个完全安全的Neo4j服务器,我可以通过浏览器()使用我的主机名访问它。但是,我现在在让我的应用程序使用javascript驱动程序连接到服务器时遇到了问题。 我不断
局域网IP地址怎么生成受信任的SSL证书?比如启明星辰的设备ip地址证书就是受信任的。
似乎HttpClient/HttpClientHandler没有提供忽略不信任证书的选项,比如WebRequest使您能够忽略不信任证书(尽管使用)。 任何帮助都将不胜感激!
问题内容: 我一直在研究从动态Web应用程序中提取信息的程序,该程序运行良好,直到我将tomcat服务器设置为使用具有自签名(因此,不受信任)证书的SSL。错误的堆栈跟踪为: 在Web浏览器中,当用户使用不受信任的证书访问HTTPS站点时,系统会提示用户警告,并要求他设置是否愿意继续进行操作;我想为我的命令行应用程序实现类似的功能…我承认我是套接字编程和网络领域的新手。解决这个问题的任何建议都会很
问题内容: 我正在使用JavaFX开发一个简单的嵌入式浏览器: 当我用来加载任何http网站时,它可以正常工作: 尽管如此,如果我尝试使用不受信任的证书(我自己的ssl证书)加载网站,则无法正常工作,并且在浏览器中出现白屏。 有什么方法可以(自动)信任我的ssl证书? 问题答案: 最后,我解决了我的问题。您应该在加载网站之前添加以下代码: 注意: 此代码片段只是禁用证书验证,而不是信任它。
我正在创建一个简单的网站。前端存储在S3中,由CloudFront托管。我使用AWS证书管理器向前端域(www.xyz.com)添加了一个受信任的SSL证书。 后端运行在EC2实例上。我向它添加了一个自签名证书。我可以使用Postman访问API,但由于自签名证书,来自前端的请求失败了。 我再次检查了AWS证书管理器是否可以为我的后端服务器提供证书,但它需要一个域。我的服务器运行在IP和端口上,我