- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 Node.JS 中构建一个简单的、支持 STARTTLS 的 POP3 代理,但我遇到了很多困难。
代理充当许多后端服务器的前端,因此它必须根据客户端的连接动态加载它们的证书。
我正在尝试使用 SNICallback,它给我带来了客户端使用的服务器名称,但之后我无法设置正确的证书,因为在我创建安全上下文时,我需要一个证书才能进行此调用.
代码如下:
// Load libraries
var net = require('net');
var tls = require('tls');
var fs = require('fs');
// Load certificates (created with openssl)
var certs = [];
for (var i = 1; i <= 8; i++) {
var hostName = 'localhost' + i;
certs[hostName] = {
key : fs.readFileSync('./private-key.pem'),
cert : fs.readFileSync('./public-cert' + i + '.pem'),
}
}
var server = net.createServer(function(socket) {
socket.write('+OK localhost POP3 Proxy Ready\r\n');
socket.on('data', function(data) {
if (data == "STLS\r\n") {
socket.write("+OK begin TLS negotiation\r\n");
upgradeSocket(socket);
} else if (data == "QUIT\r\n") {
socket.write("+OK Logging out.\r\n");
socket.end();
} else {
socket.write("-ERR unknown command.\r\n");
}
});
}).listen(10110);
和upgradeSocket()如下:
function upgradeSocket(socket) {
// I need this 'details' or handshake will fail with a message:
// SSL routines:ssl3_get_client_hello:no shared cipher
var details = {
key : fs.readFileSync('./private-key.pem'),
cert : fs.readFileSync('./public-cert1.pem'),
}
var options = {
isServer : true,
server : server,
SNICallback : function(serverName) {
return tls.createSecureContext(certs[serverName]);
},
}
sslcontext = tls.createSecureContext(details);
pair = tls.createSecurePair(sslcontext, true, false, false, options);
pair.encrypted.pipe(socket);
socket.pipe(pair.encrypted);
pair.fd = socket.fd;
pair.on("secure", function() {
console.log("TLS connection secured");
});
}
握手正确,但我使用的证书是“详细信息”中的静态证书,而不是我在 SNICallback 中获得的证书。
为了测试它,我正在运行服务器并使用 gnutls-cli 作为客户端:
~$ gnutls-cli -V -s -p 10110 --crlf --insecure -d 5 localhost3
STLS
^D (Control+D)
上面的命令应该让我获得“localhost3”证书,但它却获得了“localhost1”,因为它是在“details”var 中定义的;
整个互联网上有太多使用 HTTPS 或 TLS 客户端的示例,这与我在这里看到的有很大不同,甚至对于服务器也是如此,但它们没有使用 SNI。任何帮助将不胜感激。
提前致谢。
最佳答案
使用 tls.TLSSocket 的答案非常简单,尽管听众有一个问题。
您必须从现有的常规 net.Socket 中删除所有监听器,使用您的 net.Socket 实例化一个新的 tls.TLSSocket 并将监听器放回 tls.TLSSocket 上。
要轻松实现此目的,请使用像 Haraka's tls_socket pluggableStream 这样的包装器通过常规 net.Socket 并替换“升级”功能类似于:
pluggableStream.prototype.upgrade = function(options) {
var self = this;
var socket = self;
var netSocket = self.targetsocket;
socket.clean();
var secureContext = tls.createSecureContext(options)
var tlsSocket = new tls.TLSSocket(netSocket, {
// ...
secureContext : secureContext,
SNICallback : options.SNICallback
// ...
});
self.attach(tlsSocket);
}
并且您的选项对象会将 SNICallback 定义为:
var options {
// ...
SNICallback : function(serverName, callback){
callback(null, tls.createSecureContext(getCertificateFor(serverName));
// ...
}
}
关于node.js - NodeJS STARTTLS 使用 SNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35586957/
我正在为驻留在同一台服务器上的不同域设置多个不同的 SSL 证书(因此共享相同的 IP 地址)。 与 Qualys SSL Test我发现有些客户端(即 BingBot as of december
我们想在连接到各种外部端点 (SOAP/REST) 的 PHP 客户端中启用 SNI(服务器名称指示)。其中一些端点支持 SNI 作为服务器,但有些不支持。在所有传出请求上启用 SNI 会导致不支持
浏览器是当前的 Chrome 或 FF。在服务器 apache 2.2ish 上。 我启用了许多 SNI 站点 - 虚拟主机 *.443 等。所有单独的配置文件。一切正常。 如果我在浏览器中导航到这些
AWS 网络负载均衡器 support TLS termination .这意味着可以在 AWS Certificate Manager 中创建证书并将其安装到 NLB,然后使用 TLS 加密的 TC
我正在尝试验证 TLS 客户端是否检查服务器名称指示 (SNI)。 我首先尝试使用 openssl 重现这些步骤。 我试图用这个 openssl 命令连接到谷歌 openssl version ope
我知道 Tomcat 提供 SNI 和相互身份验证,但是否可以只为选定的应用程序/路径启用 MA? IE。假设我的服务器上有以下应用程序/端点: /app1 /app2/human /app2/rob
如何使用 C 或 C++ 在 OpenSSL 上实现服务器名称指示 (SNI)? 是否有任何现实世界的例子可用? 最佳答案 在客户端,您使用 SSL_set_tlsext_host_name(ssl,
在我们的系统中,虚拟主机配置存储在redis中。在连接设置期间,当收到 SNI 时,我们想查询 redis 以获取用于 TLS 连接的正确证书和 key 对,并创建一个附加的新 Context 实例。
我在使用 Apache HttpClient (4.5.2) 的 Java 8 上遇到此错误: javax.net.ssl.SSLProtocolException:握手警报:unrecognized
我有一个 Web 服务 (asmx) API,它是由我管理的另一位开发人员用 .NET 3.5 编写的。我们最近从 Server 2008R2 迁移到 Server 2012R2,我决定使用 SNI
我们托管了数十万个域。我们希望在单个 I.P. 上为所有这些提供 SSL/TLS。显然,SNI允许我们这样做。但是,这表明我们的 SSL 终止服务器上实际上有成千上万个证书。 对于可以安装在 SNI
有没有办法在现代浏览器中暂时禁用 SNI? 例如测试老客户的网站可用性。 (自从 POODLE 以来,人们应该担心他们吗?) 最佳答案 可能测试老客户可用性的最佳方法是实际试用老客户。 Microso
我在这里拉扯我的头发。像 wix.com 这样的网站, squarespace.com ...ETC;可以即时生成网站,并且仍然在数百万自定义域中的每一个上使用 SSL。 我尝试做同样的事情,但我不知
我可以找到有关 SNI 的各种信息(请参阅 Wikipedia ),但我找不到有关浏览器实际支持的任何统计信息。 我能找到的最好的结果是它应该可以在带有 SP3 的 Windows XP 上运行。 有
Java 7 带来了 client support for SNI .是否有已知的 SNI 服务器角色的开源实现? Java 提供“透明支持”TLS 连接(包括握手),但我需要解耦握手过程,以便我可以
如何使用 C 或 C++ 在 OpenSSL 上实现服务器名称指示 (SNI)? 是否有任何现实世界的例子可用? 最佳答案 在客户端,您使用 SSL_set_tlsext_host_name(ssl,
我遇到了一个我不理解的 Java SNI SSL 行为。在 Java 中使用 SNI 时,我希望 Google 不会为无效的主机名提供任何证书,但它确实提供了。 KeyStore keystore =
我有一个站点,其中有由 letsencrypt 创建的 ssl,但是没有 sni ssl 存在问题。它配置好吗? https://www.ssllabs.com/ssltest/analyze.htm
Java 6 可以使用 TLS + SNI 吗? TLS 与 java 6 配合得很好,但似乎不支持 SNI。 Java 7 及更高版本可以正常工作。但我坚持使用 Java 6。 Java 6 adv
我已经使用 SNI 在我的网站上实现了 SSL。现在我知道旧浏览器不支持 SNI 功能。我要问的是,当用户尝试使用不支持 SNI 的浏览器访问我的网站时,是否可以将用户重定向到其他登录页面。 请建议我
我是一名优秀的程序员,十分优秀!