Я пытаюсь подключиться к серверу Linux с моего компьютера с Windows. у которых работает SSL сервер. В Linux Machine SSL клиент и сервер работает нормально. Но тот же клиент, который я использую в Windows 7 VS 2010 из-за ошибки SSL_ERROR_SSL , в то время как SSL_Connect .
Ошибка сервера: "1112340720: ошибка: 1408A0C1: подпрограммы SSL: SSL3_GET_CLIENT_HELLO: нет общего шифра: s3_srvr.c: 1358:"
Ошибка клиента: Ошибка SSL_ERROR_SSL
Тот же сертификат и шифр, если я использую клиента в Linux. но это же дает мне ошибку в Windows.
Я добавил этот пример кода клиента VS2010.
// SSL_Client.cpp : Defines the entry point for the console application.
//
#include <atlstr.h>
#include "stdafx.h"
#include "bio.h"
#include "err.h"
#include "rand.h"
#include "ssl.h"
#include "x509v3.h"
//#pragma comment(lib, "Ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
if(!SSL_library_init( ))
{
printf("Library Load\n");
return 0;
}
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
WSADATA wData;
WSAStartup(MAKEWORD(2,2),&wData);
int iFlag = 1;
struct sockaddr_in sServerAddr;
SSL_CTX * pSslCtx;
BIO * pBIOConn;
SSL * pSSLConn;
pSslCtx = SSL_CTX_new(SSLv23_method());
// TODO: Add your control notification handler code here
if(!pSslCtx)
{
printf("New CTX failed");
return 0;
}
char CertLoad[1024];
sprintf_s(CertLoad,1024,"C:\\VisualStudio\\SSL_sample\\ssl_auth_certificate.cer");
if (SSL_CTX_load_verify_locations(pSslCtx,CertLoad, NULL) != 1)
{
printf("SSL_CTX_load_verify_locations failed");
return 0;
}
if (SSL_CTX_set_default_verify_paths(pSslCtx) != 1)
{
printf("SSL_CTX_set_default_verify_paths failed");
return 0;
}
sprintf_s(CertLoad,1024,"C:\\VisualStudio\\SSL_sample\\ssl_client_certificate.cer");
if (SSL_CTX_use_certificate_chain_file(pSslCtx, CertLoad) != 1)
{
printf("SSL_CTX_use_certificate_chain_file failed");
return 0;
}
sprintf_s(CertLoad,1024,"C:\\VisualStudio\\SSL_sample\\ssl_client_private_key.key");
if (SSL_CTX_use_PrivateKey_file(pSslCtx, CertLoad, SSL_FILETYPE_PEM) != 1)
{
printf("SSL_CTX_use_PrivateKey_file failed");
return 0;
}
SSL_CTX_set_options(pSslCtx, SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
if (SSL_CTX_set_cipher_list(pSslCtx, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH") != 1)
{
printf("SSL_CTX_set_default_verify_paths failed");
return 0;
}
SSL_CTX_set_verify(pSslCtx, SSL_VERIFY_NONE, NULL);
memset(&sServerAddr, 0, sizeof(sServerAddr));
sServerAddr.sin_family = AF_INET;
unsigned long inaddr = inet_addr("192.168.1.24");
memcpy(&sServerAddr.sin_addr,&inaddr,sizeof(inaddr));
sServerAddr.sin_port = htons(54321);
SOCKET iSocket = 0;
iSocket = socket(AF_INET, SOCK_STREAM, 0);
int lasterr = WSAGetLastError();
if( iSocket == INVALID_SOCKET)
{
printf("Connection fialed");
return 0;
}
setsockopt(iSocket,
SOL_SOCKET,
SO_KEEPALIVE,
(char*)&iFlag,
(int)sizeof(iFlag));
u_long uMode = 0;
if(ioctlsocket(iSocket, FIONBIO, &uMode) != 0 )
{
int lasterr = WSAGetLastError();
printf("Connection fialed");
}
if(connect(iSocket,
(struct sockaddr *) &sServerAddr,
(int) sizeof(sServerAddr)) == -1)
{
int lasterr = WSAGetLastError();
printf("Connection fialed");
return 0;
}
pSSLConn = SSL_new(pSslCtx);
if(!pSSLConn)
{
printf("SSL_new failed");
return 0;
}
SSL_set_fd(pSSLConn, iSocket);
pBIOConn = BIO_new_socket(iSocket, BIO_NOCLOSE);
SSL_set_bio(pSSLConn, pBIOConn, pBIOConn);
SSL_set_connect_state(pSSLConn);
int retssl = SSL_connect(pSSLConn);
if (retssl <= 0)
{
switch(SSL_get_error(pSSLConn,retssl))
{
case SSL_ERROR_NONE:
printf("SSL_ERROR_NONE failed");
break;
case SSL_ERROR_ZERO_RETURN:
printf("SSL_ERROR_ZERO_RETURN failed");
break;
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
printf("SSL_ERROR_WANT_READ SSL_ERROR_WANT_WRITE failed");
break;
case SSL_ERROR_WANT_CONNECT:
case SSL_ERROR_WANT_ACCEPT:
printf("SSL_ERROR_WANT_CONNECT SSL_ERROR_WANT_ACCEPT failed");
break;
case SSL_ERROR_WANT_X509_LOOKUP:
printf("SSL_ERROR_WANT_X509_LOOKUP failed");
break;
case SSL_ERROR_SYSCALL:
printf("SSL_ERROR_SYSCALL failed");
break;
case SSL_ERROR_SSL:
printf("SSL_ERROR_SSL failed");
break;
}
return 0;
}
return 0;
}