【问题标题】:A simple TIdTCPServer with OpenSSL (no certificates) has "HandShake Failure" and "No Shared Cipher"带有 OpenSSL(无证书)的简单 TIdTCPServer 具有“握手失败”和“无共享密码”
【发布时间】:2021-02-04 13:22:59
【问题描述】:

我有一个非常简单的TIdTCPServer 来测试没有证书的 OpenSSL。 libeay32.dllssleay32.dll OpenSSL 文件与项目位于同一文件夹中。我使用 Delphi 10.3 和 OpenSSL 1.0.2o。

然后我通过运行openssl s_client -connect localhost:443 来测试与它的连接。

这会在以下服务器端产生异常:

Project Project19.exe raised exception class EIdOSSLUnderlyingCryptoError with message 'Error accepting connection with SSL.
error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher'.

以及 s_client 端的错误:

openssl s_client -connect localhost:443

WARNING: can''t open config file: /usr/local/ssl/openssl.cnf
CONNECTED(00000180)
18424:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:.\ssl\s23_clnt.c:802:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 307 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1612443994
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

即使我创建简单的 TIdTCPClient 来测试它也会产生相同的握手失败。

unit Unit19;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdSocketHandle, IdContext, IdTCPConnection, IdTCPClient,
  IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, IdSSLOpenSSL,IdSSL,

  IdSSLOpenSSLHeaders, IdServerIOHandler, IdExplicitTLSClientServerBase, IdFTP;

type
  TForm18 = class(TForm)
    ButtonActivateServer: TButton;
    TCPServer: TIdTCPServer;
    procedure ButtonActivateServerClick(Sender: TObject);
    procedure TCPServerExecute(AContext: TIdContext);
    procedure TCPServerConnect(AContext: TIdContext);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form18: TForm18;

implementation

{$R *.dfm}

procedure TForm18.ButtonActivateServerClick(Sender: TObject);
var
  LSSLIOHandler : TIdServerIOHandlerSSLOpenSSL;
  Binding : TIdSocketHandle;
begin
  TCPServer.Bindings.Clear;
  TCPServer.DefaultPort := 443;
  Binding := TCPServer.Bindings.Add;
  Binding.IP := '0.0.0.0';

  LSSLIOHandler := TIdServerIOHandlerSSLOpenSSL.Create(TCPServer);
  LSSLIOHandler.SSLOptions.Mode := sslmServer;
  LSSLIOHandler.SSLOptions.VerifyMode := [];
  LSSLIOHandler.SSLOptions.VerifyDepth := 0;
  LSSLIOHandler.SSLOptions.SSLVersions := [sslvTLSv1..sslvTLSv1_2];

  TCPServer.IOHandler := LSSLIOHandler;
  TCPServer.Active := True;
end;

procedure TForm18.TCPServerConnect(AContext: TIdContext);
begin
  If AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase then
    TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
end;

procedure TForm18.TCPServerExecute(AContext: TIdContext);
var
  S : String;
begin
  S := AContext.Connection.IOHandler.AllData;
end;

end.

关于我做错了什么有什么想法吗?我是否需要指定一个 CipherList 或更具体的?证书是必须的吗?

【问题讨论】:

  • 您也可以尝试使用nmap --script ssl-enum-ciphers -p 443 localhost显示服务器上所有兼容的密码。

标签: delphi ssl openssl indy


【解决方案1】:

不,服务器端证书不是必需的,但推荐。已经很久了,但我记得我过去在TIdTCPClientTIdTCPServer之间建立了成功的SSL/TLS连接,没有使用任何证书。

由于错误消息提到“无共享密码”,请仔细检查连接两端的 SSLIOHandler 的 CipherList 属性。就在 Delphi 10.3 发布前几个月,如果 CipherList 为空(这是其默认值),TIdSSLIOHandlerSocketOpenSSL 中的逻辑已更改为停止使用 IdSSLOpenSSLHeaders.SSL_DEFAULT_CIPHER_LIST 常量(设置为 'AES:ALL:!aNULL:!eNULL:+RC4:@STRENGTH')。在新逻辑下,如果用户没有指定自己的列表,Indy 让 OpenSSL 使用自己的默认值。我不认为该更改会进入 10.3,因此您的 TIdTCPClientTIdTCPServer 可能使用了错误的 TLS 1.2 密码。

确保您的 Indy 使用来自 Indy 的 Gitub repo 的最新代码是最新的,或者至少确保根据 OpenSSL 1.0.2 的 CIPHER LIST FORMAT 文档为 CipherList 属性分配正确的密码。

【讨论】:

  • No Shared Cipher 意味着服务器没有证书并且匿名密码套件已被禁用,它们应该被禁用。在没有证书的情况下绕过它的唯一方法是启用匿名密码套件,这是不安全的。
  • @Remy - 我需要回到这个测试来确认你的建议,但被跟踪了。我会尽快返回并这样做
猜你喜欢
  • 1970-01-01
  • 2020-05-13
  • 2019-02-28
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多