如何使用Synapse建立安全连接?

9
我正在测试Synapse,并想知道如何建立安全连接。我注意到它支持SSL,但我不确定它是否适合我的需求。我没有来自CA的证书。我只想加密服务器程序和客户端程序之间的所有数据。当然,我可以在发送数据之前自己加密数据。但如果SSL可以加密数据,也许我可以直接使用它。据我所知,SSL用于“加密”和“认证”。我需要的只是“加密”。在Synapse中是否可能实现?
更新:
感谢daemon_x和Synapse的作者Lukas Gebauer的帮助,我想我终于成功了。以下是我所做的:
服务器端:
1)在您的单元中使用ssl_openssl,并将'libeay32.dll'和'ssleay32.dll'放在exe文件的同一目录中
2)在接受连接后,为新创建的套接字添加以下代码行。
fclient.SSLAcceptConnection;

客户端:

1) 在您的单元中使用ssl_openssl,将'libeay32.dll'和'ssleay32.dll'放置在exe文件所在的同一目录中

2) 连接到服务器后,添加以下行。

fclient.SSLDoConnect;

如果没有出现错误,连接现在是安全的。但是当您运行代码时,如Synapse文档中所述,您可能会注意到SSLAcceptConnection需要一些时间才能返回。因此,如果您想加快速度,最好提前创建证书文件和私钥文件。并在SSLAcceptConnection之前添加以下代码。
  fclient.SSL.CertificateFile := 'bs-cert';
  fclient.SSL.PrivateKeyFile := 'bs-privatekey';

如果您没有证书和私钥,请参考ssl_openssl中的"CreateSelfSignedCert"来获取自签名证书和私钥。例如,您可以通过WriteStrToStream将FCertificate和FPrivatekey保存到文件中以便后续使用。
1个回答

6
是的,你可以使用Synapse附带的插件之一。正如那里也提到的,最好使用ssl_openssl.pas。如果您决定使用它,除了Sysapse之外,还需要OpenSSL库。作者推荐OpenSSL 0.9.7,但他在我们当地的论坛上说,它似乎也可以与OpenSSL 1.0.0d一起使用。
请注意,如果您使用D2009及以上版本,则需要Unicode支持,该版本不完全支持。请下载最新版本
以下示例代码使用SSL加密,通过HTTP GET方法接收安全网站的前1024个字节响应。我使用了OpenSSL 0.9.8hSynapse的最新版本。请注意,您需要将来自OpenSSL软件包的libssl32.dlllibeay32.dll放入输出目录中,以使其正常工作。让我们创建一个带有按钮和备忘录的表单来接收结果。
uses blcksock, synautil, synsock, ssl_openssl, ssl_openssl_lib;

procedure TForm1.Button1Click(Sender: TObject);
var Socket: TTCPBlockSocket;

begin
  Socket := TTCPBlockSocket.Create;

  try
    Socket.Connect('www.yousendit.com', '443'); // connect to the host
    Socket.SSLDoConnect; // start SSL connection; only server has a certificate

    if Socket.LastError = 0 then
      begin
        Socket.SendString('GET' + CRLF); // request GET method
        Memo1.Text := Socket.RecvBufferStr(1024, 1000); // receive 1024 bytes
      end;

  finally
    Socket.Free;
  end;
end;

我很感激你的帮助。对我来说最困惑的是,当我没有证书时,我不知道如何使用加密通道。我尝试在服务器端接受连接后调用“SSLAcceptConnection”,并在客户端连接到服务器后调用“SSLDoConnect”。它们“似乎”有效。但是我在哪里可以设置密码?我尝试了“SSL.Password”,但似乎它是用于解密证书的。即使密码不同,连接仍然建立。 - trudger
@trudger 你可以创建自签名证书。 - Harriv
有没有什么组件/代码可以集成到我的程序中以生成证书?我认为让用户自己生成证书有点复杂。 - trudger
@trudger - SSLAcceptConnection 是用于服务器端使用的。关于证书;当 Synapse 为您创建临时证书时,也有一种方法。原则上,只需使用 Connect 建立与主机的连接,指定 SSL.UsernameSSL.Password 并调用 SSLDoConnect 即可。还要检查您的 SSL 库是否正常工作;如果它没有抛出任何错误,它将无法工作。您可以通过 SSL.LibName 进行检查;这应该返回不同于 ssl_none 的其他内容。 - user532231
@daemon_x - 很抱歉,手动操作不起作用。如果用户启用了安全选项,我需要在我的程序中生成证书。 - trudger
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接