由于以下错误消息,我无法使用 WebRequest 连接到 HTTPS 服务器 (TLS 1.3):
请求被中止:无法创建 SSL/TLS 安全通道。
以前的 TLS 版本是 1.2,使用下面的代码我可以正确获取页面,但随着页面 ssl 升级到 TLS 1.3,我收到错误,而且我找不到任何解决方案:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)
其实我觉得应该是这样的:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
Run Code Online (Sandbox Code Playgroud)
但没有。
在 Java 12 中开发基于 SSL(非 HTTP)的服务器时,我遇到了让服务器和客户端一起通信的意外困难。连接总是因 handshake_failure 错误而中断。经过大量努力(最初我是在证明我的证书),由于套接字级别的 HelloWorld SSL 客户端/服务器对,我能够隔离问题:握手失败是由启用的协议中存在 TLSv1.3 引起的默认情况下在 JDK 中。
到目前为止,我避免握手错误的解决方案是完全禁用 TLSv1.3(服务器端),但我对这个解决方案并不满意。我想了解发生了什么(假设它不是 JDK 或系统中的错误,而是我的应用程序或我的环境中的错误)。
我在下面提供了一些代码。谁能检查并告诉我我做错了什么?谢谢和最好的问候。
这是我的配置:OSX 10.14 (Mojave) 我已经使用以下 Java 版本进行了测试:
编辑:我在我的测试中添加了 Java 11,这个版本也出现了问题
// HelloSSLServer.java
import java.net.*;
import javax.net.*;
import javax.net.ssl.*;
import java.io.*;
public class HelloSSLServer {
public static void main(String args[]) throws Exception {
int port = 1234;
boolean needClientAuth = false;
ServerSocketFactory factory …
Run Code Online (Sandbox Code Playgroud) 我正在查看最近的QUIC传输协议(传输和TLS)的Internet草案,并想知道如何在Java(或其他JVM语言)中实现,假设我不想同时重新实现TLS 1.3.
TLS通常基于TCP(或其他具有类似服务的协议),TLS本身有两层:
+--------------+--------------+--------------+
| Handshake | Alerts | Application |
| Layer | | Data |
| | | |
+--------------+--------------+--------------+
| |
| Record Layer |
| |
+--------------------------------------------+
| |
| TCP |
| |
+--------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
在Java中,我们可以使用javax.net.ssl中的类来实现这一点,或者使用SSLEngine仅用于没有I/O的TLS(应用程序或框架需要插入网络,例如使用NIO),或者使用SSLSocket(通过常用的InputStream/OutputStream阻塞I/O实现TCP上的TLS或SSLServerSocket.
QUIC仅使用TLS 1.3的握手部分来协商会话密钥,同时使用自己的数据包格式和加密("数据包保护")而不是TLS'记录层(整个过程基于UDP,而不是TCP):
+--------------+--------------+ +-------------+
| TLS | TLS | | QUIC |
| Handshake | Alerts | | Applications|
| | | | (h2q, etc.) | …
Run Code Online (Sandbox Code Playgroud) 有没有一种简单的方法可以在 Wireshark 中过滤 TLS 1.3 数据包?
tls.record.version
不起作用,因为它通常包含值0x0303
(TLS 1.2)。
我假设 Wireshark 通过查看 ServerHello 消息中的 SupportedVersions 扩展来识别 TLS 1.3,如果版本是0x0304
(TLS 1.3),它可能会将该协议应用于整个 TLS 流。
TLSv1.3
显示在“协议”列中,但我不确定应用哪个显示过滤器来过滤这些数据包。
curl 在 openssl 版本 1.1.1d 上失败,但在 OpenSSL/1.0.1t 上工作正常。我正在尝试调试原因,但无法找到原因。
请从卷曲日志中找到以下跟踪。
失败案例(curl 7.64.0 (x86_64-pc-linux-gnu) libcurl/7.64.0 OpenSSL/1.1.1d)
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS alert, handshake failure (552):
* error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
Run Code Online (Sandbox Code Playgroud)
成功案例。卸载curl并安装curl版本curl 7.38.0 (x86_64-pc-linux-gnu) libcurl/7.38.0 OpenSSL/1.0.1t
* Connected to kafkaconnect-0.kc.default.svc.cluster.local (10.244.4.107) port 443 (#0) …
Run Code Online (Sandbox Code Playgroud) 我将 apache 更新到最新版本 2.4.37 并将 openssl 更新到 1.1.1 现在,当客户端进行身份验证时,我只会在 Firefox 63 中收到此错误,但在 Chrome 中不会:
[ssl:error] AH: verify client post handshake, referer: https://******/login
[ssl:error] AH10158: cannot perform post-handshake authentication, referer: https://******/login
[ssl:error]SSL Library Error: error:14268117:SSL routines:SSL_verify_client_post_handshake:extension not received
Run Code Online (Sandbox Code Playgroud)
我使用wireshark尝试查找问题,我很欣赏Firefox使用TLS 1.3,而Chrome使用TLS 1.2。事实上,如果我将 FF 中的 TLS 最大版本设置为 TLS 1.2,它就可以正常工作。
我想获得 TLS 1.3 兼容性,或者,如果还不可能,强制在我的 Apache 配置中,客户端总是使用 TLS 1.2,但我不明白:(
这是我的 apache vhost 配置文件:
[...]
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SSLCertificateChainFile /etc/apache2/ssl/intermediate.crt
SSLCACertificateFile /etc/apache2/ssl/ca.pem
SSLVerifyDepth 3
SSLProtocol TLSv1.2
SSLHonorCipherOrder on
<Directory /var/www/html/>
Options -Indexes +FollowSymLinks …
Run Code Online (Sandbox Code Playgroud) 我正在通过代码(使用 OpenSSL API)为我的服务器应用程序生成 X509 证书。我刚刚通过在我的代码的支持列表中添加 TLSv1.3 密码来添加对 TLSv1.3 的支持。
证书生成和将 RSA pub + 私钥分配给证书没有任何变化。
我已在客户端升级 curl 和 OpenSSL 库以启用 TLSv1.3 连接。升级的 Curl 版本:7.63.0 & OpenSSL 版本:1.1.1
我看到以下错误:
* TCP_NODELAY set
* Connected to <domain> (<ip-address>) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: myCA.pem
CApath: none
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello …
Run Code Online (Sandbox Code Playgroud) 我正在使用deno
db 连接到 supabase postgres 服务器。
这是 deno 部署时出现的错误。
TLS 连接失败,并显示消息:无效的对等证书内容:无效的对等证书:UnsupportedCertVersion 默认为非加密连接
在这里建立连接:
import { Database, PostgresConnector } from "https://deno.land/x/denodb/mod.ts";
import "https://deno.land/x/dotenv/load.ts";
export const connection = (() => {
const DENODB_PGURL = Deno.env.get('DENODB_PGURL');
if (DENODB_PGURL) {
return new PostgresConnector({uri: DENODB_PGURL});
}
const DENODB_HOST = Deno.env.get('DENODB_HOST');
if (!DENODB_HOST) throw new Error('DENODB_HOST is not set');
const DENODB_USERNAME = Deno.env.get('DENODB_USERNAME');
if (!DENODB_USERNAME) throw new Error('DENODB_USERNAME is not set');
const DENODB_PASSWORD = Deno.env.get('DENODB_HOST');
if (!DENODB_PASSWORD) throw new Error('DENODB_PASSWORD is not set');
const DENODB_DATABASE …
Run Code Online (Sandbox Code Playgroud) 使用 OkHttp 和Google Security ProviderInstaller与支持 TLS1.2 和 TLS1.3 的域的任何连接都是使用 1.2 版本进行的。如果没有 ProviderInstaller,使用 1.3 一切都可以正常工作。
这是示例代码,在 Android 12 上使用最新版本的 okhttp 和 play-services-basement
GlobalScope.launch(Dispatchers.IO) {
var r1 = OkHttpClient().newCall(Request.Builder().url("https://www.google.com").build()).execute()
println(r1.handshake)
try {
ProviderInstaller.installIfNeeded(this@MainActivity)
println("ProviderInstaller DONE")
} catch (e: Exception) {
e.printStackTrace()
}
var r2 = OkHttpClient().newCall(Request.Builder().url("https://www.google.com").build()).execute()
println(r2.handshake)
}
Run Code Online (Sandbox Code Playgroud)
日志结果是
I/System.out: Handshake{tlsVersion=TLS_1_3 cipherSuite=TLS_AES_128_GCM_SHA256 peerCertificates=[CN=www.google.com, CN=GTS CA 1C3, O=Google Trust Services LLC, C=US, CN=GTS Root R1, O=Google Trust Services LLC, C=US] localCertificates=[]}
I/System.out: ProviderInstaller DONE
I/System.out: Handshake{tlsVersion=TLS_1_2 cipherSuite=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 peerCertificates=[CN=www.google.com, CN=GTS CA 1C3, …
Run Code Online (Sandbox Code Playgroud)