Security 带unicode路径的OpenSSL

Security 带unicode路径的OpenSSL,security,unicode,openssl,ssl-certificate,Security,Unicode,Openssl,Ssl Certificate,通过使用以下功能,我从客户端实现了SSL握手: SSL\u CTX\u加载\u验证\u位置 SSL\u CTX\u使用\u证书\u链\u文件 SSL\u CTX\u使用\u私钥\u文件 所有函数都为filename参数获取char*类型。 如何更改它以同时支持unicode文件位置 谢谢 在哪个站台?Posix下的OpenSSL支持UTF-8路径,但在其他平台上不支持。很可能,您必须使用支持Unicode路径的标准操作系统文件I/O函数自己手动加载证书文件,然后解析原始数据并将其加载到OpenS

通过使用以下功能,我从客户端实现了SSL握手: SSL\u CTX\u加载\u验证\u位置 SSL\u CTX\u使用\u证书\u链\u文件 SSL\u CTX\u使用\u私钥\u文件

所有函数都为filename参数获取char*类型。 如何更改它以同时支持unicode文件位置


谢谢

在哪个站台?Posix下的OpenSSL支持UTF-8路径,但在其他平台上不支持。很可能,您必须使用支持Unicode路径的标准操作系统文件I/O函数自己手动加载证书文件,然后解析原始数据并将其加载到OpenSSL中,例如通过
PEM_read_bio_X509
with
sk_X509_NAME_push
PEM_read_bio_PrivateKey/d2i_PrivateKey_bio
with
SSL_CTX_use_PrivateKey
d2i_X509_bio/PEM_read_bio_X509
with
SSL_CTX_use_certificate
我想回复上述帖子,而不是创建一个新答案,但我无法回复,所以我创建了一个新答案。根据我对SSL\u CTX\u load\u verify\u位置的测试,并查看openssl代码,实际上openssl在Windows上也会使用utf-8作为文件路径。在函数BIO_new_file打开文件时,如果同时定义了_WIN32和CP_UTF8,它将选择utf-8作为文件路径。这些是在windows上定义的。但是,如果路径不是有效的utf-8字符,openssl也有返回ANSI路径的代码。因此,实际上openssl将在Windows上与utf-8和ANSI path一起工作。

感谢您的回复。我需要它在Windows上运行。。。SSL\u CTX\u加载\u验证\u位置的“映射”是什么?谢谢没有直接映射。你必须破解它。在内部,SSL_CTX_load_verify_locations()调用X509_STORE_load_locations(),后者依次调用X509_STORE_add_lookup()、X509_lookup_load_file()和X509_lookup_add_dir()。尝试定义一个自定义的X509_LOOKUP_方法结构,该结构可以按需要打开文件,然后在调用X509_LOOKUP_load_file()和X509_LOOKUP_add_dir()之前将该结构传递给X509_STORE_LOOKUP()。由于API使用char*,因此必须使用类型转换将wchar\u t*文件名传递给X509\u LOOKUP\u方法实现。请查看ssl\u lib.c、X509\u d2.c、X509\u lu.c和by\u file.c,以了解ssl\u CTX\u load\u verify\u locations()的当前实现是如何设置的。所使用的默认X509_LOOKUP_方法SSL_LOOKUP_file(),使用BIO API读取证书文件。您可能需要让您的实现也使用BIOs,但是您可以使用基于文件*的BIO,这样您就可以调用_wfopen()来打开Unicode文件名。那么SSL_CTX_use_certificate_chain_FILE呢?听起来您并不是在看OpenSSL源代码。我强烈建议你这样做。手动复制这些函数并不太复杂。我刚刚发现,在windows上,API SSL_CTX_use_certificate_chain_文件需要ANSI路径,因为它使用不同的函数读取文件,然后使用BIO_new_文件。该函数是静态长MS_回调文件\u ctrl(BIO*b,int cmd,long num,void*ptr),没有utf8到ANSI的回退。