您必须将 SSLServer 的 start_immediately 字段设置为 false 才能以纯文本模式启动 SSL 服务器。在任何时候(即当您从客户端收到 STARTTLS 命令时),您都可以调用 SSLSocket 的 accept 方法来启动 SSL/TLS 握手。客户当然必须同意协议:)
这是我为测试而编写的示例服务器:
#!/usr/bin/ruby
require 'socket';
require 'openssl';
certfile = 'mycert.pem';
port = 9002;
server = TCPServer.new( port );
# Establish an SSL context
sslContext = OpenSSL::SSL::SSLContext.new
sslContext.cert = OpenSSL::X509::Certificate.new( File.open( certfile ) );
sslContext.key = OpenSSL::PKey::RSA.new( File.open( certfile ) );
# Create SSL server
sslServer = OpenSSL::SSL::SSLServer.new( server, sslContext );
# Don't expect an immidate SSL handshake upon connection.
sslServer.start_immediately = false;
sslSocket = sslServer.accept;
sslSocket.puts( "Toast.." );
# Server loop
while line = sslSocket.gets
line.chomp!;
if "STARTTLS" == line
# Starting TLS
sslSocket.accept;
end
sslSocket.puts( "Got '#{line}'" );
end
sslSocket.close;
我确定原始发帖人知道如何测试 STARTTLS,但我们其他人可能需要这个提醒。实际上,我通常使用 GNUTLS 包(debian/ubuntu 中的 gnutls-bin)中的 utils 来测试 starttls,因为它允许我随时开始握手:
$ gnutls-cli --starttls --port 9002 --insecure localhost
这以纯文本 TCP 套接字模式连接。键入一些行并让它们回显。此流量未加密。如果您发送STARTTLS
,sslSocket.accept
则调用 ,并且服务器等待 SSL 握手。按 ctrl-d (EOF) 从 gnutls 客户端开始握手,并观察它建立加密的 SSL 连接。随后的行也将被回显,但流量现在已加密。