私钥密码中包含非 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 服务器的主要内容,如果未能解决你的问题,请参考以下文章