使用无证书的SSL
using SSL without certificate
我试图使用SSL没有任何证书。我读到这是可能的,所以我写代码没有调用设置它。根据文档,它应该是正确的步骤列表。你知道这是否真的可能吗?
我使用的是CENTOS 6.4.
当我运行时,我总是收到错误
14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
下面是我的服务器代码
int main() {
int res = -1;
SSL_library_init();
SSL_load_error_strings();
SSL_CTX *sslctx = SSL_CTX_new( SSLv23_server_method());
res = SSL_CTX_set_cipher_list(sslctx,"aNULL");
if(0 == res) {
cerr << "SSL_CTX_set_cipher_list" << endl;
std::exit(EXIT_FAILURE);
}
int res = -1;
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(kPort);
memset(&addr.sin_zero,0,8);
int sfd = socket(AF_INET,SOCK_STREAM, 0);
if(sfd == -1) {
cerr << "Socket Failed" << endl;
std::exit(EXIT_FAILURE);
}
res = bind(sfd, (const sockaddr*)&addr, sizeof(addr));
if(res == -1) {
cerr << "Bind Failed" << endl;
std::exit(EXIT_FAILURE);
}
res = listen(sfd,kBackLog);
if(res == -1) {
cerr << "Listen Failed" << endl;
std::exit(EXIT_FAILURE);
}
sockaddr_in client_addr;
socklen_t client_addr_len;
int cfd = accept(sfd, (sockaddr*)&client_addr, &client_addr_len);
if(cfd == -1) {
cerr << "Accept Failed" << endl;
std::exit(EXIT_FAILURE);
}
cout << "Client Connected" << endl;
// new SSL context.
SSL *cSSL = SSL_new(sslctx);
res = SSL_set_fd(cSSL, cfd);
cout << res << endl;
if(0 == res) {
cerr << "Error on SSL_set_fd" << endl;
close(sfd);
std::exit(EXIT_FAILURE);
}
res = SSL_set_cipher_list(cSSL, "aNULL");
if(0 == res) {
cout << "failure on SSL_set_cipher_list";
close(sfd);
std::exit(EXIT_FAILURE);
}
//Here is the SSL Accept portion. Now all reads and writes must use SSL
cout << "call to SSL_accept" << endl;
res = SSL_accept(cSSL);
switch(res)
{
case 0:
case -1: {
cout << "error on SSL_accept("<< res << ")" << endl;
std::exit(EXIT_FAILURE);
}
}
char buf[4];
res = SSL_read(cSSL, (char*)buf, 4);
switch(res) {
case 0:
case -1: {
cout << "error on SSL_read("<< res << ")" << endl;
std::exit(EXIT_FAILURE);
}
}
cout << buf << endl;
}
在客户端的下面
int main() {
int res = -1;
SSL_library_init();
SSL_load_error_strings();
//OpenSSL_add_all_algorithms(); I didn't find this in man pages.
SSL_CTX *sslctx = SSL_CTX_new( SSLv23_client_method());
res = SSL_CTX_set_cipher_list(sslctx,"aNULL");
if(0 == res) {
cerr << "SSL_CTX_set_cipher_list" << endl;
std::exit(EXIT_FAILURE);
}
int res = -1;
int sfd = socket(AF_INET, SOCK_STREAM, 0);
CHECK(sfd,"socket");
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(kPort);
addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // #include <arpa/inet.h>
res = connect(sfd, (const sockaddr*)&addr, sizeof(addr));
CHECK(res, "connect");
if(-1 == res) {
cerr << "Error on Connect" << endl;
close(sfd);
std::exit(EXIT_FAILURE);
}
SSL *cSSL = SSL_new(sslctx);
if(NULL == cSSL) {
cerr << "Error on SSL_new" << endl;
close(sfd);
std::exit(EXIT_FAILURE);
}
res = SSL_set_fd(cSSL, sfd);
if(0 == res) {
cerr << "Error on SSL_set_fd" << endl;
close(sfd);
std::exit(EXIT_FAILURE);
}
res = SSL_set_cipher_list(cSSL, "aNULL");
if(0 == res) {
cout << "failure on SSL_set_cipher_list";
close(sfd);
std::exit(EXIT_FAILURE);
}
cout << "calling SSL connect" << endl;
res = SSL_connect(cSSL);
switch(res) {
case 0:
case -1: {
cerr << "Error on SSL_connect("<< res << ")" << endl;
print_ssl_error(cSSL, res);
close(sfd);
std::exit(EXIT_FAILURE);
}
}
cout << "SSL write" << endl;
char buf[4] = {'a','b','c','n'};
SSL_write(cSSL, buf, 4);
sleep(10);
close(sfd);
}
我正在尝试使用SSL而没有任何证书。
您需要使用匿名Diffie-Hellman (ADH)或匿名椭圆曲线Diffie-Hellman (AECDH)。当使用匿名方案时,服务器不发送它的证书。
先呼SSL_set_cipher_list
,后呼SSL_connect
。根据ciphers(1)
,您需要的密码是aNULL
。aNULL
包括ADH
和AECDH
。
你知道这是否真的可能吗?
是的,有可能。但是使用匿名密码套件是一个坏主意,因为它们容易受到主动攻击。也就是说,他们可以是中间人。
此外,大多数客户端和服务器都配置为通过"!aNULL"
密码套件列表拒绝匿名密码套件。所以在实际操作中你可能会发现你无法连接到任何东西
相关文章:
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 我需要帮助来缩短检索 SSL 证书的执行时间
- 如何使用QWebEngineView忽略SSL证书错误
- 打开 SSL 查询客户端证书
- 用于 asio SSL 上下文的单个证书
- 为什么 gRPC C++ 客户端在没有显式服务器的 SSL 证书的情况下无法工作,就像在示例中一样?
- 在GRPC服务器端呼叫时检索SSL证书
- 使用C++提升SSL套接字进行必发API证书登录
- 如何在OpenSSL中获取SSL证书
- 如何从连接的 SSL 会话获取 base64 编码证书 (PEM)
- 获得谷歌搜索 ssl pem 证书
- SSL握手成功后如何获得对等方的QSsl证书
- 验证 Char[] 中加载的 SSL 证书或 C/C++ 中的内存
- 如何在 OpenSSL 中使用 SSL 证书与 gsoap,使用 C++ 客户端/服务器
- 使用 C++ 在窗口上获取 SSL 证书
- fcgi应用程序没有从SSL证书中看到环境变量
- 在 Win32 中验证 SSL 证书的正确方法是什么?
- 在QWebSockets客户端检查SSL证书有效性的最佳实践
- ssl证书验证上的多线程c++应用程序内存泄漏