我正在尝试使用OpenSSL for C ++连接到我的网站,这就是我所拥有的:
#include "openssl/ssl.h"
#include "openssl/bio.h"
#include "openssl/err.h"
#include <string>
int main( )
{
BIO * bio;
int p;
char * request = (char*)"GET / HTTPS/1.1\x0D\x0AHost: (website)/auth.php\x0D\x0A\x43onnection: Close\x0D\x0A\x0D\x0A";
char r[ 1024 ];
ERR_load_BIO_strings( );
SSL_load_error_strings( );
OpenSSL_add_all_algorithms( );
bio = BIO_new_connect( "(website):80" );
if ( bio == NULL )
{
printf( "BIO is null\n" ); return 0;
}
if ( BIO_do_connect( bio ) <= 0 )
{
ERR_print_errors_fp( stderr );
BIO_free_all( bio );
return 0;
}
BIO_write( bio, request, strlen( request ) );
while(true)
{
p = BIO_read( bio, r, 1023 );
if ( p <= 0 ) break;
r[ p ] = 0;
printf( "%s", r );
}
BIO_free_all( bio );
system( "pause" );
return 0;
}
当我运行时,我收到此错误:
HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
Press any key to continue . . .
该网站有一个ssl证书,每当我尝试连接到主站点时,它表示它已被移动到同一个域,但前面有一个https://而不是http://。
我进入我的网站时,我在前面有www,当然还有tld之后。正如您所看到的,我正在尝试从PHP脚本中读取,所以如果有人知道如何解决这个问题我会很感激。
答案 0 :(得分:2)
char * request = (char*)"GET / HTTPS/1.1\x0D\x0AHost: (website)/auth.php\x0D\x0A\x43onnection: Close\x0D\x0A\x0D\x0A";
更改为:
const char request[] = "GET /auth.php HTTP/1.1\r\n"
"Host: www.example.com\r\n"
"Connection: Close\r\n\r\n";
(感谢Sam Varshavchik和Orness中的Lightness Races捕获 HTTPS/1.1
)。
bio = BIO_new_connect( "(website):80" );
更改为:
bio = BIO_new_connect( "www.example.com:443" );
您可能也对OpenSSL wiki上的SSL/TLS Client感兴趣。您似乎错过了我希望看到的内容,例如SSL_CTX_new
,BIO_set_conn_hostname
,SSL_set_tlsext_host_name
,BIO_do_handshake
以及其他几个。
将来,请停止编辑重要信息,例如(website)
。没有人可以用缺少的信息复制你的问题。
C ++可以更容易地使用OpenSSL。您可以使用EVP_CIPHER_CTX_free
来避免对unique_ptr
等函数的显式调用。对于某些C ++示例,请参阅OpenSSL wiki上的EVP Symmetric Encryption and Decryption | C++ Programs,unique_ptr and OpenSSL's STACK_OF(X509)*,How to get PKCS7_sign result into a char * or std::string等。