- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建从 Java 到 Vala 服务器的 SSL TCP 连接。一切正常,直到我向服务器发送第二个包。 (也是第一个包裹发送罚款)。服务器只接收第二个包的第一个字节(在本例中为“1”),没有别的,但如果我在没有 SSL 的情况下连接到服务器,一切正常。我认为服务器不是问题所在,因为来自另一个 Vala 客户端的所有其他连接都运行良好。
我使用的是不受信任的证书,因此我创建了一个自定义的 TrustManager 并且我使用的是 OpenJDK 7(Elementary OS - Linux)。这是我的代码:
//Main:
SSLHandler handler = new SSLHandler();
handler.createSecureSocket("localhost", 7431);
byte[] data = {1,4,1,1,1,1};
handler.getOutputStream().write(data);
handler.getOutputStream().write(data);
// SSLHandler
public class SSLHandler {
// SSL Socket erstellen
SSLSocket sslSocket;
public void createSecureSocket(String ip, int port) throws UnknownHostException, IOException, KeyManagementException, NoSuchAlgorithmException {
SSLSocketFactory factory = (SSLSocketFactory) new DefaultTrustManager().createSSLFactory("TLS");
sslSocket = (SSLSocket) factory.createSocket(ip, port);
}
public OutputStream getOutputStream() throws IOException {
return sslSocket.getOutputStream();
}
public InputStream getInputStream() throws IOException {
return sslSocket.getInputStream();
}
}
//Custom Trust Manager
public class DefaultTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public SSLSocketFactory createSSLFactory(String protocol) throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance(protocol);
TrustManager[] byPassTrustManager = new TrustManager[] {this};
sslContext.init(null, byPassTrustManager, new SecureRandom());
return sslContext.getSocketFactory();
}
}
有人知道这个问题的解决方案吗?
最佳答案
TLDR:进行多次接收。
像 TCP 一样的 TLS/SSL 被定义为流服务,并且不保证保留记录边界,只是为了按顺序传送字节——或者如果这不可能,则指出错误。例如,在 TCP 或 TLS/SSL 中,如果一方执行 3 次发送操作,每次发送操作 1000 字节,并且接收方执行一系列接收操作,则这些操作可能会收到 500、700、1200 和 600 字节。通常,接收方必须如有必要进行多次接收 才能接收超过一个字节的数据结构。这可以使用定界符来完成,例如 SMTP:将 header 读取为行,直到得到一个空行,将正文(数据)读取直到得到仅由“点”(.) 组成的行。或者简单地用一个计数:继续阅读直到你得到 N 个字节。例如,HTTP 和 HTTPS 使用这两种方法(在某些情况下使用更多)。
在实践中,TCP 实现经常拆分大于 1000 字节的数据,这是由于它们为传输分割数据并重新组合数据的方式。因此,大约在 1982 年之后还没有被教导过这个问题的 TCP 程序员已经从经验中学会了“继续阅读直到完成”。
但从历史上看,SSL/TLS 实现大多确实保留了大约 16k 字节的记录边界,同样是由于协议(protocol)内部工作的方式。结果,许多没有阅读规范的程序员错误地认为 SSL/TLS 是一种记录服务。由于 the BEAST attack 而改变在 2011 年,在某些(相当有限的)情况下可以破解使用 SSLv3 或 TLSv1.0 和 CBC 模式密码发送的加密数据,因为这些协议(protocol)通过将 IV 从一个数据记录链接到下一个数据记录来实现 CBC 模式。由包括 Java JSSE 在内的许多堆栈实现的一种针对 BEAST 的防御措施是将每个数据记录分成两个(或更多)部分进行传输,以便提前不可见敏感部分的 IV;非正式共识是使用 1 个字节,然后(最多)使用剩余的 n-1 个字节。参见 https://security.stackexchange.com/questions/63215/why-does-firefox-split-https-request .
请注意,此防御仅在 SSL 连接中的第二次和后续写入时完成,因为第一个使用基于 KDF 的 IV,而不是链接的,并且仅适用于 CBC 模式密码套件,因为它们在此中仅链接 IV时尚。 TLSv1.1 及更高版本不需要它,但目前我无法验证 JSSE 是否真的在这种情况下省略了它。
关于java - TLS-Package 后的神秘字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33357924/
是否可以使用 OpenSSL 或其他工具通过 TLS 建立 TLS 连接? 如果可能,每个级别的证书是否需要不同? 最佳答案 这在理论上应该工作得很好,但我不能确定 OpenSSL 或其他东西是否会轻
在我的 java 代码中,我正在使用命令创建 SSL 上下文的一个实例 SSLContext ctx = SSLContext.getInstance("TLS"); 但是在我的 tomcat 服务器
在我的 java 代码中,我正在使用命令创建一个 SSL 上下文实例 SSLContext ctx = SSLContext.getInstance("TLS"); 但在我的 tomcat 服务器中,
范围:这是一个具有一个 channel 的网络,该 channel 由 3 个组织组成,每个组织 1 个 anchor 节点,每个组织 1 个 CA 和每个组织 1 个 MSP。 我在我的 Hyper
无法找到用于在 iis 上启用/禁用 tls 的特定设置。启用/禁用 ssl 是否与启用/禁用 tls 相同? 我浏览了一些博客,发现 SSL 是 TLS 的前身,旧版本的 SSL 已被弃用。但我无法
最近,我一直在为基于物联网的项目评估不同的 API 网关 (API GW) 选项。这样做的目的是找到一个足够好的解决方案来执行设备和 API GW 的相互 TLS (mTLS) 身份验证。 我尝试过的
几个月来,我的 Web 应用程序在不同版本的 IE/Firefox/Chrome 上运行良好。我的应用程序在 IIS 10.0 上运行。当我从 Windows 7 框 (IE 11.0.***) 中点
我有一个在 Java 7 上运行的 HTTPS 网络服务。我需要进行更改,以便此服务仅接受 TLS1.2 连接并拒绝 SSL3、TLS1.0 和 TLS1.1。 我添加了以下 Java 参数,使 TL
我在资源管理器不显示网站时遇到问题:“无法显示此页面。在高级设置中打开 TLS 1.0、TLS 1.1 和 TLS 1.2”。 我在 chrome 中调试了证书并说“连接是使用 aes_128_cbc
我正在与 5 个订购者、1 个组织和 2 个同行建立我的网络。还有 1 个 cli 和 1 个 ca。 我从 1 个排序者扩展到 5 个实现 Raft 的排序者。这就是为什么我想扩展我的网络并对多个对
当k8s集群开启了TLS认证后,每个节点的kubelet组件都要使用由kube-apiserver的CA签发的有效证书才能与kube-apiserver通信;当节点非常多的时候,为每个节点都单独签署证
我正在尝试使用 pjsip 安装中的 pjsua 程序在两个虚拟机之间进行安全调用。我通过以下方式在每个节点上启动程序: pjsua-x86_64-unknown-linux-gnu --use-tl
我开发的软件应用程序使用 gRPC 在客户端和服务器之间建立双向流。 我只在 java 中寻找类似于这张票的答案的东西:How to enable server side SSL for gRPC?
我正在尝试调试与 TLS 相关的问题。TLS 在两个应用程序客户端 A 和服务器 B 之间设置。A 和 B 都交换了证书,我已经验证证书具有正确的扩展名,并且还通过其根 CA 成功验证。叶证书的根 C
“Java 1.7 TLS 1.1 服务器”和“Java 1.8 客户端”之间的 SSL/TLS 握手在我的环境中失败,服务器端出现以下异常: java.security.NoSuchAlgorith
我正在尝试了解 Docker ,但我不断收到神秘的(对我而言)错误消息。 可能最简单的例子是尝试打印我安装的 Docker 版本: $ sudo docker version Client versi
这是我第一次使用 Amazon Lighsail、Wordpress Multisite、Bitnami甚至使用 Let's Encrypt;现在似乎一切正常,除了我的虚拟主机文件中的 SSL 指令。
我有一个 MariaDB "M"。在同一台机器上有一个应用程序“A”,它可以访问它。在不同的服务器上,另一个应用程序“B”也在访问它。 现在我想在 MariaDB 上启用 TLS 以保护连接 B ->
我正在寻找通过代理连接到一些 HTTPS/TLS 站点,其中到代理本身的连接也是通过 HTTPS/TLS 建立的,来自一个高度依赖请求的 python 应用程序。 urllib3(因此 request
现在我正在努力改变 EMQtt 和 Erlang MQTT 代理,以便我可以使用预共享 key 而不是非对称方法执行 TLS 握手。 到目前为止,我几乎遍历了源代码中的每个文件,但找不到任何加密函数。
我是一名优秀的程序员,十分优秀!