我正在使用Visual Studio 6.0编写的win32文件服务器。它配置了SSL并在2000年开始工作,但从那时起就没有使用过。
现在,我们要使用SSL(Opensll),因此我更新了库等,并在服务器作为控制台应用程序运行时让服务器使用SSLv3和TLS。
只要我将服务器作为Windows服务运行,ssl初始化例程就会崩溃而不会出现任何错误消息。这是导致所有悲伤的代码。
int SwiftSSL::Initialize()
{
SSLeay_add_ssl_algorithms();
SSL_load_error_strings();
ctx_ = SSL_CTX_new( SSLv23_server_method() );
if(!ctx_) {
LogEvent( "SSL_CTX is bad.");
return false;
}
LogEvent( "Before using cert and private key file.");
if ( SSL_CTX_use_certificate_file( ctx_, CERT_FILE, SSL_FILETYPE_PEM ) == 1 ) {
LogEvent( "SUCCESS SSL_CTX_use_certificate_file." );
}
else {
LogEvent( "FAILED SSL_CTX_use_certificate_file." );
return false;
}
if ( SSL_CTX_use_PrivateKey_file( ctx_, KEY_FILE, SSL_FILETYPE_PEM ) == 0 ) {
LogEvent( "Failed SSL_CTX_use_PrivateKey_file." );
return false;
}
else {
LogEvent( "SUCCESSFUL SSL_CTX_use_PrivateKey_file." );
}
if ( SSL_CTX_check_private_key( ctx_ ) == 0 ) {
ERR_print_errors_fp( stderr );
LogEvent( "Failed SSL_CTX_check_private_key" );
return false;
}
LogEvent( "Successfully used cert and private key file.");
return true;
}
作为Windows服务运行时,记录的唯一消息是: "在使用证书和私钥文件之前。"
没有记录任何其他内容。对我来说,这意味着命令 SSL_CTX_use_certificate_file(ctx_,CERT_FILE,SSL_FILETYPE_PEM)崩溃。
但是,当同一个程序作为控制台运行时,为什么它没有问题呢?
这是我在事件查看器中找到的信息:
无法找到源(OPENSSL)中事件ID(0)的描述。该 本地计算机可能没有必要的注册表信息或消息DLL 用于显示来自远程计算机的消息的文件。以下信息是 事件的一部分:OPENSSL_Uplink(00341000,08):没有OPENSSL_Applink
任何帮助将不胜感激。
答案 0 :(得分:0)
确定。我今天早上醒来时解决了这种情况。事实证明,Windows服务不知道在哪里可以找到CERT_FILE或KEY_FILE。作为Windows服务运行的应用程序将在%WinDir%\ System32目录中查找文件。我有app目录中的文件,所以我只需要在调用SSL_CTX_use_certificate_file和SSL_CTX_use_PrivateKey_file时添加文件的实际路径。
现在工作正常。