Tag: jsse

得到此错误:“javax.net.ssl.SSLHandshakeException:没有共同的密码套件”

我有一个用C#编写的客户端和JAVA中的服务器。 因此,当我尝试连接时,我在服务器javax.net.ssl.SSLHandshakeException: no cipher suites in common出现错误javax.net.ssl.SSLHandshakeException: no cipher suites in common和C#“EOF或0字节”。 [C#]: TcpClient tc = new TcpClient(server, 1337); using (sslStream = new SslStream(tc.GetStream())){ } [JAVA]: SSLServerSocketFactory ssocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); SSLServerSocket server = (SSLServerSocket) ssocketFactory.createServerSocket(1337); server.setEnabledCipherSuites(server.getEnabledCipherSuites()); 和JAVA推出属性: -Djavax.net.ssl.trustStore=Certificatename -Djavax.net.ssl.trustStorePassword=thereisapw -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol -Djavax.net.debug=ssl TCPServer

将证书密钥库迁移到另一个JVM

我正在开发一个需要JRE的安装程序并创建证书。 我正在研究捆绑新JRE的下一版安装程序。 我需要将旧JRE的cacerts密钥库中导入的所有证书移动到新的JRE。 如果我将旧的jre / lib / security /目录下的“cacerts”文件复制到新的JRE,那么cacerts中的现有证书是否有效,我将进行安装。 我看了一下问题: “是否可以将cacerts的所有内容导入jssecacerts文件?” 将证书导入我的密钥库。 这是否意味着如果通过复制cacerts的密钥库迁移不起作用,我需要备份现有的jre / lib / security / cacerts并将其导入新的JRE?

java安全套接字没有认证?

我有一个简单的安全套接字服务器 – 客户端程序。 对于服务器证书,我使用keytool创建了一个密钥库。 当我尝试通过我的客户端连接到服务器时,我得到以下exception: 在服务器中: Exception in thread “main” javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 在客户端: 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 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) 如果我的理解是正确的,那么这些例外是由于我使用我创建的证书这一事实引起的。 我的问题如下: 如果我在服务器和客户端中设置启用的密码套件,所有* _anon *密码套件,这不应该解决问题吗? 我的意思是如果我启用*_anon_*密码套件,则不需要身份validation,因此没有例外。 它是否正确? 因为我仍然有例外。 我尝试在启用的密码套件中启用所有已启用的+ _anon密码套件。 没有成功。 我尝试只设置anon并获得一个新例外: Exception in thread “main” […]

如何编写在它们之间使用相互ssl身份validation的java客户端和服务器应用程序?

我正在构建两个必须使用SSL双向身份validation进行通信的java应用程序,我使用此处的指令来创建客户端和服务器证书。 然后我在服务器应用程序中构建了一个webService,如下所示: @RequestMapping(value=”/testssl”, method = RequestMethod.POST, produces=”application/json”, consumes=”application/json”) @ResponseBody public String testSSl(@RequestBody String name) { return = successfully tested; } 我编辑了tomcat server.xml文件以启用SSL,如下所示: 并将server.jks放在Tomcat / Jenkins-Tomcat / keystore / server.jks中 然后我使用spring RestTemplate构建客户端应用程序以通过SSL调用此Web服务,如下所示: Properties props = new Properties(); props.put(“javax.net.ssl.trustStore”, “D:\\test\\server.jks”); props.put(“javax.net.ssl.trustStoreType”, “jks”); props.put(“javax.net.ssl.trustStorePassword”, “server123”); props.put(“javax.net.ssl.keyStore”, “D:\\test\\client.jks”); props.put(“javax.net.ssl.keyStoreType”, “jks”); props.put(“javax.net.ssl.keyStorePassword”, “client123”); props.put(“java.protocol.handler.pkgs”, “com.sun.net.ssl.internal.www.protocol”); props.put(“ws.ssl.loose.disableHostnameVerification”, “true”); System.setProperties(props); SSLContext sslcontext […]

如何在Java中启用客户端TLS会话重用

我有一个Java客户端,可以创建到同一服务器的许多会话。 TLS协议具有缓存会话密钥的function,从而避免了对每个连接进行昂贵的PKI处理。 但我无法让它真正起作用。 openssl s_client -reconnect -state -prexit -connect localhost:1234报告服务器具有“已重用,TLSv1 / SSLv3,密码为ECDHE-RSA-AES256-SHA384”以及相同的主密钥。 数据流是二进制的,而不是HTTP封装的。 我使用的代码是(约),如下所示。 它可以工作,但没有会话重用。 initSSLContext(keyStore, “password”, trustStore, “PKIX”, “TLSv1”); While (true) { connect(); byte[] encode1 = { 0x42, 0, 0, 0, 0, 0, 0, 0, 0, }; outs.write(encode1); byte[] ttlbuf = new byte[10000]; int len = ins.read(ttlbuf, 0, ttlbuf.length); StringBuilder sb = new StringBuilder(); […]

使用STARTTLS将套接字升级到SSLSocket:recv失败

我正在尝试使用STARTTLS将套接字升级到SSLSocket。 在InspIRCd的维基上,这是它应该如何工作的 >> STARTTLS << :test2.chatspike.net 670 nickname :STARTTLS successful, go ahead with TLS handshake (SSL Handshake) 所以在我的代码中我写了(稍微简化) else if (code.equals(“670”)) { SSLSocketFactory sslSocketFactory = ((SSLSocketFactory) SSLSocketFactory.getDefault()); SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket( socket, socket.getInetAddress().getHostAddress(), socket.getPort(), true); sslSocket.startHandshake(); bufferedReader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream(), getEncoding())); bufferedWriter = new BufferedWriter(new OutputStreamWriter(sslSocket.getOutputStream(), getEncoding())); socket = sslSocket; } 然而,有了和没有startHandshake()我总是得到一个recv失败(没有我只是当我尝试从新的bufferedReader读取时得到它 java.io.IOException: […]

JDK / JRE源代码与匹配的JSSE(SSL)源代码和匹配的可运行JDK / JRE?

我在哪里可以找到Java 6 JSSE / JCE源代码? 并问自己如何获得匹配源的JRE / JDK? 但我不知道其中任何一个都没有具体到足以得到我真正追求的答案,所以我将尝试更具体的问题版本。 基本上我想解决的问题是我希望能够在Windows上使用我的Eclipse调试器并进入Java SSL类(JSSE)来帮助我调试SSL问题以及更好地理解SSL过程。 BTW我熟悉(并使用)javax.net.debug = ssl | all系统属性来获取SSL跟踪,虽然这非常有用,但我仍然希望能够逐步完成那些讨厌的代码。 所以我认为我特别需要的是: 可执行的JRE / JDK实现(不想构建一个)… 这在我的Windows平台(XP)上运行…… 这包括来源…… 该源包括SSL“位”(JSSE等)…… 理想情况下,SSL实现是Sun或OpenJDK版本。 我认为最接近的事情(如PW的答案StackOverflow:87106中所述 )是在OpenJDK 6 Source Release中找到的OpenJDK源openjdk-6-src-b12-28_aug_2008.tar.gz,但我不确定是否有匹配的可执行JDK / JRE用于在Windows上运行。

使用Dropbox Java SDK for API v2时获取SSLHandshakeException

在XPages应用程序中,我想利用用于API v2的Dropbox Java SDK(2.1.2)来获取有关我的Dropbox帐户的信息。 以下代码用于检索相应的帐户对象: String atoken = “****”; DbxRequestConfig rc = new DbxRequestConfig(“****”); DbxClientV2 client = new DbxClientV2(rc,atoken); DbxUserUsersRequests users = client.users(); FullAccount acc = users.getCurrentAccount(); // Exception raised here 最后一行引发以下exception: com.dropbox.core.NetworkIOException: No appropriate protocol at com.dropbox.core.DbxRequestUtil.startPostRaw(DbxRequestUtil.java:240) … Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol at com.ibm.jsse2.kb.c(kb.java:347) … 从堆栈跟踪中我得出结论, IBMJSSE2是用于处理SSL握手的安全提供程序。 所以我在非Domino JVM(JRE7)中运行了上面的代码,它使用了SunJSSE安全提供程序,并且没有任何问题。 因此问题必须与IBM的Domino JVM有关,但我无法弄清楚如何修复它。 任何人都可以帮我解决这个问题或提供解决方案吗? […]

SSLEngine unwrap()javax.crypto.BadPaddingException:坏记录MAC

这让我疯狂了好几天了。 我使用带有ssl加密的java nio创建了一个使用SSLEngine的客户端。 握手工作正常,我写了一个网站的GET请求,它工作正常(我得到200代码的标题)。 问题是当网站发回数据包时,在第二个数据包上我得到一个BadPaddingException。 这是我的阅读方法: public void read(SelectionKey key,ByteBuffer readBuffer) throws IOException, BadPaddingException { SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer clientSSLData = ByteBuffer.allocate(getPacketBufferSize()); System.out.println(“Reading data. PacketBufferSize: “+(getPacketBufferSize())); int length = socketChannel.read(clientSSLData); System.out.println(“read “+length+” bytes”); if (length == -1){ System.out.println(“Length is -1 which means nothing was read from the channel “); socketChannel.close(); return; } clientSSLData.flip(); […]

使用SSLEngine(JSSE)与旧客户端进行SSL握手

这是“ 使用自签名证书和SSLEngine(JSSE)进行SSL握手 ”的后续问题。 我已经实现了一个NIO Web服务器,可以在同一个端口上处理SSL和非SSL消息。 为了区分SSL和非SSL消息,我检查入站请求的第一个字节以查看它是否是SSL / TLS消息。 例: byte a = read(buf); if (totalBytesRead==1 && (a>19 && a<25)){ parseTLS(buf); } 在parseTLS()方法中,我实例化SSLEngine,启动握手,包装/解包消息等。对于大多数现代Web浏览器(Firefox 10,IE 9,Safari 5等),一切似乎都能正常工作。 问题是像IE 6这样的老式Web浏览器和Java的URLConnection类之类的库似乎以不同的方式启动SSL / TLS握手。 例如,IE 6的前几个字节看起来像这样(hex值): 80 4F 01 03 00 … 如果我将消息传递给SSLEngine,它似乎无法识别该消息并抛出exception。 javax.net.ssl.SSLException: Unsupported record version Unknown-0.0 那么IE 6和Java的URLConnection类究竟发送了什么呢? 这是JSSE SSLEngine可以支持的有效SSL / TLS消息吗? 我是否必须进行一些预处理或与客户协商以发送不同的消息? 提前致谢! UPDATE 感谢Bruno和EJP以及一些进一步的调试,我对正在发生的事情有了更好的理解。 正如Bruno正确指出的那样,IE6和Java 6客户端通过SSLv2 […]