当客户端(不是我的)安全地连接到我的服务器时,我遇到了问题。 似乎连接因不匹配的密码而被拒绝,但我已经validation服务器确实与客户端共享一些密码。 这可能是未知密码的问题(未知0x0:0x60)? 如果是这样,我该怎么做才能解决它? Java SSL日志如下所示: Listener-https, setSoTimeout(30000) called Worker-30, READ: SSLv3 Handshake, length = 63 *** ClientHello, SSLv3 RandomCookie: GMT: 1267050437 bytes = { 23, 244, 228, 68, 161, 225, 218, 222, 207, 128, 228, 138, 127, 141, 159, 63, 232, 48, 242, 240, 26, 76, 58, 158, 179, 0, 192, 140 } Session […]
我正在尝试使用Android应用程序连接到SQL Server使用JDBC。 我将sqljdbc4.jar导入到我的应用程序中,但是当我到达时 conn = DriverManager.getConnection(connString); 我得到以下错误:连接字符串是 JDBC:SQLSERVER://xxx.xxx.xxx.xxx:1433;加密= FASLE;用户=用户名,密码=密码; 谁能告诉我出了什么问题? 如果我将相同的代码放入常规的Java应用程序中,它运行正常。 基础Java public class Test { public void dbConnect(String db_connect_string, String db_userid, String db_password) { try { Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”); Connection conn = DriverManager.getConnection(db_connect_string, db_userid, db_password); System.out.println(“connected”); Statement statement = conn.createStatement(); String queryString = “select * from sysobjects where type=’u'”; ResultSet rs = statement.executeQuery(queryString); while (rs.next()) { […]
我在端口443上创建了一个套接字,如下所示: socket = (SSLSocket) factory.createSocket(hostName, port); 然后,我想在这个插槽中看到启用的密码套件,我用过: String[] enCiphersuite=socket.getEnabledCipherSuites(); System.out.println(“Enabled ciphersuites are: “+Arrays.toString(enCiphersuite)); 然后,我想只选择一个我希望我的应用程序在与远程服务器创建握手时使用的密码套件。 我做了以下事情: String pickedCipher[] ={“TLS_RSA_WITH_AES_128_CBC_SHA”}; socket.setEnabledCipherSuites(pickedCipher); System.out.println(“ciphersuite set to: “+Arrays.toString(pickedCipher)); 然后我做了握手,并检查了会话密码套件: socket.startHandshake(); System.out.println(“Session ciphersuite is”+socket.getSession().getCipherSuite() ); 但我发现握手后打印输出语句中打印的密码名称(据我所知,这是会话中实际使用的密码)不是我之前使用setEnabledCipherSuites() 为什么我仍然没有看到我选择的密码套件是用过的密码套件? 而且,我还尝试了getEnabledCipherSuites()并在setEnabledCipherSuites之后将其打印出来,发现列表没有更改为我设置的内容。 我不确定何时打印启用的密码套件,这个密码套件列表是否依赖于Java并始终是相同的列表,还是取决于客户端或服务器? 有人可以解释一下吗? 编辑:在握手之前我只有以下几行: SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory(); SSLSocket socket=null; try { socket = (SSLSocket) factory.createSocket(hostName, port); socket.setSoTimeout(15000); socket.startHandshake(); //handshake . .
对于我的xmpp堆栈的集成测试,我在localhost上设置了一个vysper服务器(0.7)。 现在我想在版本4.0.2中使用smack-core和smack-tcp连接到服务器。 问题: 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 由于smack 4 api已经发生了很大的变化,到目前为止发现的例子已经不能再使用了。 以前有人试过吗?
我正在使用HttpURLConnection连接到SSL站点。 有时这些使用自签名证书/其他表现不佳的SSL,所以我有一个访问这些证书的模式。 我正在使用在线推荐的许多地方的典型代码: // Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {} public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {} } }; // Install the all-trusting trust manager SSLContext sc = SSLContext.getInstance(“SSL”); […]
我正在寻找类似于这个答案的解决方案,但更安全。 我想禁用证书validation,但仅针对单个请求(这是我所需要的)。 所以它应该做以下一个或多个 一个请求完成后返回安全状态 仅禁用给定URL的validation (也许)仅针对一个线程使用不安全的设置 附录 当我要求更安全的解决方案时,我真的想知道这个问题(得分-2)与原始问题(得分+46)相比有什么问题。 有人能解释一下吗 解释为什么我需要这个:有一个有效的服务器证书,通常,它被使用。 但我需要向localhost发送一个请求,它也必须在开发人员机器上工作。 它必须是https因为没有http支持。
我的环境是Maven Project和Wildfly(8.2.1)作为Application Server。 我需要的是使用SOAP将传入的REST调用连接到第三方服务器。 我需要SSL客户端身份validation; 因此,我有自己的KeyStore和TrustStore。 因此,我创建了自己的SSLContext,并且需要让WebService使用此SSLContext。 所有看起来像这样: // Build SSL context with own KeyManager / TrustManager SSLContext sc = SSLContext.getInstance(“TLS”); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); KeyStore ks = KeyStore.getInstance(“JKS”); String password = “changeit”; ks.load(getClass().getResourceAsStream(“/keystore”), password.toCharArray()); kmf.init(ks, password.toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); // Now build webservice client MyWS_Service service = new MyWS_Service(null, […]
我在java密钥库中有两个证书/密钥对。 这些关键词的别名是“foo”和“bar”。 我的TLS客户端(java程序)使用密钥库。 在连接打开期间完成TLS客户端身份validation。 当TLS服务器从客户端请求证书时,客户端程序应使用“foo”键入。 现在,客户端在连接握手期间向服务器发送错误的证书(“bar”)。 如何在连接之前告诉SSLSocket所需的密钥条目的别名? 目前代码如下: final SSLSocket ss = (SSLSocket)SSLSocketFactory.getDefault().createSocket(); ss.setEnabledProtocols( new String[] {“TLSv1”}); ss.connect( targetAddress );
我正在使用旧的IBM iSeries(IBM-i,i5OS,AS / 400等),在O / S版本V5R3M0上使用Java 5 JVM(Classic,而不是ITJ J9)。 简而言之,这是一个场景: 我使用Portecle 1.7创建了一个JKS类型的密钥存储区(注意:我确实尝试将我的密钥存储区转换为JCEKS但是作为不支持的格式被拒绝,所以看起来JKS是iSeries机器的唯一选择(至少我正在上面的版本)。 然后,我创建了一个密钥对和CSR,并将CSR发送给Thawte进行签名。 我使用PKCS#7格式从Thawte成功导入了签名证书,以导入整个证书链,其中包括我的证书,Thawte中介和Thawte服务器根。 这一切都按预期工作。 但是,当我运行JVM时,正确配置为指向商店并提供密码(我过去使用在Portecle中创建的自签名证书进行测试),并尝试在443上启动我的Web服务器,我得到以下安全性exception: java.security.KeyStoreException: Cannot store non-PrivateKeys 谁能告诉我哪里出错了,或者我接下来要检查什么?
这是来自HttpClient-4.x文档的自定义SSL上下文的示例: http : //hc.apache.org/httpcomponents-client-ga/examples.html 注意:为简洁起见,删除注释。 package org.apache.http.examples.client; import java.io.File; import java.io.FileInputStream; import java.security.KeyStore; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; /** * This example demonstrates how to create secure connections with a custom SSL * context. */ public class ClientCustomSSL { public final static void main(String[] args) throws […]