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

时间:2017-07-18 09:41:59

标签: delphi openssl indy indy10

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

根据https://tools.ietf.org/html/rfc8018(第3节末尾),UTF-8是密码八位字符串的通用编码规则。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

否则,您必须直接调用OpenSSL的SSL_CTX_set_default_passwd_cb()函数来用您自己的函数替换密码回调,然后您可以随意执行任何操作。