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

问题描述:

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

根据https://tools.ietf.org/html/rfc8018(第3节结束)UTF-8是密码字节串的常用编码规则。

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

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

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

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

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

否则,您将不得不直接调用OpenSSL的SSL_CTX_set_default_passwd_cb()函数以用您自己的函数替换密码回调函数,然后您可以随心所欲地执行任何操作。

+0

谢谢!这应该做到这一点(虽然我没有时间去测试它。)有没有更好的方式来获得该调用所需的'PSSL_CTX',而不是为'TIdSSLContext'返回fContext的类助手? – Chris

+0

@克里斯没有,没有 –