- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一种情况,客户端 A 应该连接到服务器 B,服务器 B 应该连接到服务器 C。并且连接必须是安全套接字。
我尝试并成功地分别建立了 A 到 B 和 B 到 C 的连接。但是当我尝试同时建立到 A 到 B 和 B 到 C 的连接时,它会引发错误
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2011)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1113)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:916)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at VfSer.main(VfSer.java:51)
这是我尝试过的代码,我为 A 到 B 和 B 到 C 连接使用了两个不同的证书。
这是A代码
System.setProperty("javax.net.ssl.trustStore", "vaserkey");
System.setProperty("javax.net.ssl.trustStoreSSN", "123456");
try {
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));
//.....
}
这是B代码
System.setProperty("javax.net.ssl.keyStore", "vaserkey");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
//adding ssl layer to socket connection
SSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =(SSLServerSocket) sslserversocketfactory.createServerSocket(Integer.parseInt(args[0]));
//taking infinite connection one by one
while(true){
//accepting incoming connection
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();//....
}catch(Exception e){}
//after receiving data trying to establish connection with C
System.setProperty("javax.net.ssl.trustStore", "vfserkey");
System.setProperty("javax.net.ssl.trustStoreSSN", "123456");
SSLSocketFactory sslsocketfactory1 = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket1 = (SSLSocket) sslsocketfactory1.createSocket(ip, port);
//..向C发送数据这是 C 代码:
System.setProperty("javax.net.ssl.keyStore", "vfserkey");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
try {
//adding ssl layer to socket connection
SSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =(SSLServerSocket) sslserversocketfactory.createServerSocket(Integer.parseInt(args[0]));
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
//获取连接并接收来自C的数据}最后是我用来生成证书的工具。
keytool -genkey vaserkey -keyalg RSA
keytool -genkey vfserkey -keyalg RSA
抱歉,如果我说错了什么,我是 SSL 编程的新手,如果我错了,请纠正我..
最佳答案
首先设置所有 SSL 属性。 DefaultSSLContext
默认情况下由 SSLSocketFactory
和 SSLServerSocketFactory
使用,但它仅在第一次使用时构建。更改任何相关系统属性或它们指向的文件,在第一次使用后将被忽略并且没有任何效果。因此,您需要在调用任一 工厂之前设置所有 javax.net.ssl.*
属性。
还有:
无法正确复制这些 keytool 命令。您需要在每个文件名之前使用 -keystore
。他们生成私钥和(自签名)证书;你不能只生成一个证书,如果可以的话,它几乎不能用于包括 SSL/TLS 在内的任何东西。最后,现在首选的操作是-genkeypair
;拼写 -genkey
支持向后兼容,但最终可能会被删除。
将 keystore (条目)用作信任库是不明智的。虽然 TrustManager 逻辑确实在私钥条目中找到并使用证书(见上文),但复制 keystore (或只是私钥条目/ies) 到 relier(s)/client(s) 是不好的做法。 [edit] 任何获得您私钥的人通常都可以冒充您,其结果包括窃取您的敏感数据和其他资源,例如金钱。即使特定的客户端不是恶意的,他们也很少有动力像您一样小心您的 key ,如果有很多客户端,他们可能有多台机器、备份、替换、虚拟化、外包、测试、临时工、承包商等,这种风险成倍增加。
正确/更好的方法是仅从服务器 keystore 导出证书,仅将证书导入客户端信任库(以“Java KeyStore”格式,但实际上不是 key )类似于:
keytool -keystore vaserkey -exportcert -file vasercert
keytool -keystore vasertrust -importcert -file vasercert
# same again for vf...
# use vasertrust for A-trust and vfserTrust for B-trust in your example
关于java - 无法连接到 ssl 服务器收到致命警报 : certificate_unknown and ReadDataRecord(SSLSocketImpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30005257/
在为开发公关创建推送通知提供程序时,我们面临以下错误:我想知道证书有什么问题,因为我启用了推送通知然后创建了证书,但我收到了certificate_unknown 错误? main, RECV TLS
我有一个服务器和客户端,它们都使用 ssl 相互通信。先前的自签名 sslkeystore 在服务器上已过期,因此我生成了一个具有相同详细信息和扩展有效期的新 keystore 。但是现在当我尝试从客
我正在努力寻找错误所在,所以我需要一些错误跟踪灵感。 我尝试从在我的 dockerized Payara 4.1 上运行的 Java 网络应用程序调用远程服务器上的网络服务。 Docker 镜像使用带
我有一种情况,客户端 A 应该连接到服务器 B,服务器 B 应该连接到服务器 C。并且连接必须是安全套接字。 我尝试并成功地分别建立了 A 到 B 和 B 到 C 的连接。但是当我尝试同时建立到 A
我得到了 SSLhandshakeException in Jmeter:Recevied fatal alert:certificate_unknown 同时使用 jmeter 3.2 进行移动测试
我已经创建了 SSLClient 和 SSLServer,还为 SSLServer 创建了 keystore "server.jks",为 SSLClient 创建了 "client.jks"。首先我
当我尝试在 java 上使用“ApnsService”向 IOS 发送推送通知时,出现如下错误: com.notnoop.exceptions.NetworkIOException: javax.n
我正在以非管理员模式在 RedHat 上安装带有 Liberty 8.5.5.4 和 Java 1.7.0 的 v7.0.0 MobileFirst Server。我遵循的步骤: 成功安装 Liber
我在使用SSL套接字建立客户端服务器套接字连接时遇到问题。我仍在学习SSL加密以及处理证书和 keystore 的过程。我有一个客户端和服务器应用程序,它们应该按如下方式相互连接: 服务器-SSLRe
这是我第一次使用 SSL,我正在尝试在本地机器上创建和使用自签名证书(目前)。 我使用以下批处理文件来创建我的证书: @ECHO off rem keytool docs: https://docs.
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我尝试通过 MQTT 客户端使用 TLS 1.2 身份验证在我的设备和 AWS IoT 服务之间建立连接。根据 AWS IoT 文档,我将 RootCA 证书存储在 keystore 中的 JAVA_
我是一名优秀的程序员,十分优秀!