私钥密码中包含非 ASCII 字符的 Indy TLS 服务器

Posted

技术标签:

【中文标题】私钥密码中包含非 ASCII 字符的 Indy TLS 服务器【英文标题】:Indy TLS server with non-ASCII characters in private key password 【发布时间】:2017-12-23 02:23:15 【问题描述】:

我有一个用密码加密的私钥文件,该密码还包含非 US-ASCII 字符(例如 passwörd 或 s€cret)。 我没有找到从基于 indy 的服务器中使用此密钥文件的方法,因为 Indy 似乎使用 MBCS 将 unicodestring 密码转换为八位字节字符串。

根据https://www.rfc-editor.org/rfc/rfc8018(第 3 节结束),UTF-8 是密码八位字节字符串的常用编码规则。

根据我的调查,Indy(我使用的是 Delphi 10.2 Tokyo 附带的版本)在 PasswordCallback (IdSSLOpenSSL.pas) 中使用 IndyTextEncoding_OSDefault 将 (Unicode)String 转换为 PAnsiChar。

IndyTextEncoding_OSDefault()(在 IdGlobal.pas 中)将 GIdOSDefaultEncoding 设置为 TIdMBCSEncoding 并返回它。 GIdOSDefaultEncoding 不是全局可用的,我也没有找到设置它的方法。

是否有可能更改 PasswordCallback 使用的编码或已经将密码作为字节数组/PAnsiChar/RawByteSting 传递给 Indy?

【问题讨论】:

【参考方案1】:

没有选项可以更改 Indy 用于编码 Unicode 密码的字符集。您将不得不更改 Indy 的源代码并重新编译它。在未来的版本中,我会考虑将其更改为 UTF-8,或者使其成为用户可配置的。

请注意,IndyTextEncoding_OSDefault 仅在 Windows 上是 MBCS。在其他平台上是 UTF-8。

否则,您必须直接调用 OpenSSL 的 SSL_CTX_set_default_passwd_cb() 函数,将密码回调替换为您自己的函数,然后您就可以随心所欲了。

【讨论】:

谢谢!这应该可以做到(虽然我还没有时间测试它。)有没有更好的方法来获得该调用所需的PSSL_CTX,而不是为返回 fContext 的TIdSSLContext 编写类帮助程序? @Chris 不,没有

以上是关于私钥密码中包含非 ASCII 字符的 Indy TLS 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Python3'ascii'编解码器无法编码字符

SQL Server 2008 查询以查找列中包含非字母数字字符的行

HCL安装和使用模拟器中遇到的问题

华三云模拟器使用时遇到的问题

在框架模块中包含非模块化标头

在框架模块错误中包含非模块化标头