私钥密码中包含非 ASCII 字符的 Indy TLS 服务器
Indy TLS server with non-ASCII characters in private key password
我有一个用密码加密的私钥文件,该文件还包含非美国 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 并且 returns 它。 GIdOSDefaultEncoding 不是全局可用的,我也没有找到设置它的方法。
是否可以更改 PasswordCallback 使用的编码或已经将密码作为字节 array/PAnsiChar/RawByteSting 传递给 Indy?
没有更改 Indy 用于编码 Unicode 密码的字符集的选项。您将不得不更改 Indy 的源代码并重新编译它。在未来的版本中,我会考虑将其更改为 UTF-8,或使其可由用户配置。
请注意 IndyTextEncoding_OSDefault
仅在 Windows 上是 MBCS。在其他平台上是UTF-8。
否则,你必须直接调用OpenSSL的SSL_CTX_set_default_passwd_cb()
函数,将密码回调替换成你自己的函数,然后你就可以用它做任何你想做的事了。
我有一个用密码加密的私钥文件,该文件还包含非美国 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 并且 returns 它。 GIdOSDefaultEncoding 不是全局可用的,我也没有找到设置它的方法。
是否可以更改 PasswordCallback 使用的编码或已经将密码作为字节 array/PAnsiChar/RawByteSting 传递给 Indy?
没有更改 Indy 用于编码 Unicode 密码的字符集的选项。您将不得不更改 Indy 的源代码并重新编译它。在未来的版本中,我会考虑将其更改为 UTF-8,或使其可由用户配置。
请注意 IndyTextEncoding_OSDefault
仅在 Windows 上是 MBCS。在其他平台上是UTF-8。
否则,你必须直接调用OpenSSL的SSL_CTX_set_default_passwd_cb()
函数,将密码回调替换成你自己的函数,然后你就可以用它做任何你想做的事了。