C调用OPENSSL做REST服务客户端的例子
//SSL-Client.c
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <malloc.h>
#include <string.h>
#include <sys/socket.h>
#include <resolv.h>
#include <netdb.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define FAIL -1
int
OpenConnection(
const
char
*hostname,
int
port)
{
int
sd;
struct
hostent *host;
struct
sockaddr_in addr;
if
( (host = gethostbyname(hostname)) == NULL )
{
perror
(hostname);
abort
();
}
sd = socket(PF_INET, SOCK_STREAM, 0);
bzero(&addr,
sizeof
(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = *(
long
*)(host->h_addr);
if
( connect(sd, (
struct
sockaddr*)&addr,
sizeof
(addr)) != 0 )
{
close(sd);
perror
(hostname);
abort
();
}
return
sd;
}
SSL_CTX* InitCTX(
void
)
{ SSL_METHOD *method;
SSL_CTX *ctx;
OpenSSL_add_all_algorithms();
/* Load cryptos, et.al. */
SSL_load_error_strings();
/* Bring in and register error messages */
method = SSLv3_client_method();
/* Create new client-method instance */
ctx = SSL_CTX_new(method);
/* Create new context */
if
( ctx == NULL )
{
ERR_print_errors_fp(stderr);
abort
();
}
return
ctx;
}
void
ShowCerts(SSL* ssl)
{ X509 *cert;
char
*line;
cert = SSL_get_peer_certificate(ssl);
/* get the server's certificate */
if
( cert != NULL )
{
printf
(
"Server certificates:\n"
);
line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
printf
(
"Subject: %s\n"
, line);
free
(line);
/* free the malloc'ed string */
line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
printf
(
"Issuer: %s\n"
, line);
free
(line);
/* free the malloc'ed string */
X509_free(cert);
/* free the malloc'ed certificate copy */
}
else
printf
(
"No certificates.\n"
);
}
int
main(
int
count,
char
*strings[])
{ SSL_CTX *ctx;
int
server;
SSL *ssl;
char
buf[1024];
int
bytes;
char
*hostname, *portnum;
if
( count != 3 )
{
printf
(
"usage: %s <hostname> <portnum>\n"
, strings[0]);
exit
(0);
}
SSL_library_init();
hostname=strings[1];
portnum=strings[2];
ctx = InitCTX();
server = OpenConnection(hostname,
atoi
(portnum));
ssl = SSL_new(ctx);
/* create new SSL connection state */
SSL_set_fd(ssl, server);
/* attach the socket descriptor */
if
( SSL_connect(ssl) == FAIL )
/* perform the connection */
ERR_print_errors_fp(stderr);
else
{
char
*msg =
"Hello???"
;
printf
(
"Connected with %s encryption\n"
, SSL_get_cipher(ssl));
ShowCerts(ssl);
/* get any certs */
SSL_write(ssl, msg,
strlen
(msg));
/* encrypt & send message */
bytes = SSL_read(ssl, buf,
sizeof
(buf));
/* get reply & decrypt */
buf[bytes] = 0;
printf
(
"Received: \"%s\"\n"
, buf);
SSL_free(ssl);
/* release connection state */
}
close(server);
/* close socket */
SSL_CTX_free(ctx);
/* release context */
return
0;
}
C调用OPENSSL做REST服务客户端的例子的更多相关文章
- 用PHP做服务器接口客户端用http协议POST访问安全性一般怎么做
我的问题是,如果不做安全相关处理的话,一些可能改变数据库的操作可能会遭遇垃圾数据提交什么的,毕竟要找到这些信息只要找个http包就可以了 系统无用户登录 新手问题(从来没做过服务端开发),如果可以,给 ...
- 用Nacos做微服务架构里的服务注册与发现中心
转自:https://www.jianshu.com/p/61608ff86344 Nacos 另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,在微服务盛行的今天,服 ...
- Spring Cloud(三):Web服务客户端之Feign
前文介绍了实现客户端负载均衡的Ribbon,但直接使用Ribbon的API来实现服务间的调用相对较为繁琐,服务间的调用能否像本地接口调用一样便捷.透明,更符合编程习惯呢?Feign就是用来干这事的. ...
- 微服务优化之使用gRPC做微服务的内部通信
使用gRPC做微服务的内部通信 gRPC是一个由Google开源的远程服务调用框架,具有多路复用和双向流式通信的特性. 大家好,在本文中将为大家介绍为什么我们应该使用gRPC代替RESTful或JSO ...
- jquery 直接调用 wcf,面向服务的SOA架构 ( 第二天)
在前面的基础上,我们来开始第二天编写 客户端 的东西,不过讲之前,我想告诉大家的是: 这个简单的SOA的架构,我们直接通过wcf 调用到 后台的方法, 而中间没有使用 C#代码,大大减少我们客户端的代 ...
- 跨语言调用Hangfire定时作业服务
跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...
- Ace教你一步一步做Android新闻客户端(一)
复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和 ...
- mutt+msmtp做linux邮件客户端
mutt+msmtp做linux邮件客户端 1. 安装配置msmtp l 安装 wget https://sourceforge.net/projects/msmtp/files/msmtp/1.4 ...
- android 不同进程间的调用 AIDL 实现通讯服务
android 不同进程间的调用 AIDL 实现通讯服务 近期对aidl android 不同进程间的调用,不同运用间的调用做了一些尝试: 过程例如以下: 1:首先在要被调用的程序里写好 ...
随机推荐
- C# 调试程序弹出 没有可用于当前位置的源代码 对话框
解决方案: 1.右键点击解决方案->属性->通用属性->调试源文件. 2.看看你的程序有没有被增加到“不查找这些源文件”这个框里. 3.如果有删除,然后重新编译即可调试,解决问题.
- zookeeper实现商品秒杀抢购
package com.test; import java.io.IOException; import java.util.List; import java.util.concurrent.Cyc ...
- 三分钟学会CSS3中的FLEXBOX布局
原文地址,保护版权,请勿转载:http://page.factj.com/blog/p/2574 这篇文章里我们将学习CSS里flexbox布局的几个最重要的概念,通过学习flexbox布局,你会发现 ...
- sublime text 使用
一.在sublime text中创建html.css.js文件 ctrl+shift+p(调出控制台) 然后输入 Set Syntax:html(也可以输入:ssh) Set Syntax:css ...
- android 登陆案例_最终版本 sharedpreference
xml 与之前的登陆案例相同 java代码: package com.itheima.login; import java.util.Map; import com.itheima.login.ut ...
- 17_JSP_入门
[JSP简述] JSP全称是Java Server Pages,它和Servlet技术一样,都是一种用于开发动态Web页面的技术. * html页面:用html写的页面 * JSP页面:用html写页 ...
- eclipse导入包的快捷键
在Eclipse里,写一个没有导入相应包的类名(这个类名已经完全写全,比如LayoutManager), 可以用ctrl+shift+M/Ctrl+Shift+o/Ctrl+1导入相应的包. 其中Ct ...
- C# 调用load事件
在一个函数或者事件中调用另外的事件,例如调用Load事件 private void EventForm_Load(object sender, EventArgs e) { //相关内容 } priv ...
- POJ 2559 Largest Rectangle in a Histogram -- 动态规划
题目地址:http://poj.org/problem?id=2559 Description A histogram is a polygon composed of a sequence of r ...
- 九度OJ 1163 素数
题目地址:http://ac.jobdu.com/problem.php?pid=1163 题目描述: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和 ...