"); //-->
这段时间在做本地终端链接服务器的工作,在此记录下,以免将来忘了。
首先有一个已经搭建好的nginx服务器,并且能够实现单向认证。
然后现在服务器端生成证书请求文件。
1.用openssl创建私钥
openssl genrsa -out server.key
1
2.用私钥创建证书请求文件
openssl req -new -key server.key -out server.csr
1
CA签发证书:
CA是专门签发证书的权威机构,处于证书的最顶端。自签是用自己的私钥给证书签名,CA签发则是用CA的私钥给自己的证书签名来保证证书的可靠性。因为是要实现单向认证,所以就要有CA进行认证。因为CA认证机构是要花钱的,因此自己创建CA。
1.生成CA私钥和证书
openssl req -new -x509 -keyout ca.key -out ca.crt
1
2.生成CA签名证书
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
1
这里我用openssl.cnf来自定义生成ca.crt的路径。openssl.cnf默认的存放路径在/etc/pki/tls
在openssl.cnf中只修改了一行
#dir = /etc/pki/CA //默认地址
dir = /home/pki/ServerCert
certs = $dir/certs
1
2
3
创建完成后,本地需要的文件是ca.crt,nginx服务中需要的是server.crt。
在nginx中配置证书如下:
server {
listen 443 ssl;
server_name localhost;
ssl on;
ssl_certificate /etc/nginx/pki/server.crt;
ssl_certificate_key /etc/nginx/pki/server.key;
ssl_protocols TLSv1.2;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
...
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
下一步,在本地尝试用curl工具进行链接测试。
curl -v --cacert ca.crt https://198.168.1.145
1
得到服务器的登录页面的html。
注意,不要在curl后加 -k,-k是忽略了证书的正确与否,不能保证是否实现了认证。
最后用c代码实现这个链接过程。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lic.h"
#include <curl/curl.h>
#define FILENAME "sr.dat"
#define URL "https://192.168.1.145"
size_t write_data(void* buffer,size_t size,size_t nmemb,void *stream)
{
FILE *fptr = (FILE*)stream;
fwrite(buffer,size,nmemb,fptr);
return size*nmemb;
}
int download_license(char *UniqueID, char *OderNum)
{
CURL *curl;
CURLcode res;
FILE * fptr;
char post_parameter[4096]; //传入的参数
struct curl_slist *http_header = NULL; //定义参数头
struct curl_slist *headers = NULL;
char *pCaPath = "/home/pki/ca.crt";
//char *UniqueID = arg[1];
//char *OderNum = arg[2];
if (! UniqueID)
{
fprintf(stderr,"Please enter unquieID!\n"); //没有输入UnquieID
exit(0);
}
else
{
if (! OderNum)
{
fprintf(stderr,"Please enter oder num!\n"); //没有输入Oder num
exit(0);
}
else
{
strcpy(post_parameter,"licenseID=%22"); //拼接输入的参数
strcat(post_parameter, UniqueID);
strcat(post_parameter, "%22&OderNumber=%22");
strcat(post_parameter, OderNum);
strcat(post_parameter, "%22");
}
}
if ((fptr = fopen(FILENAME,"w")) == NULL)
{
fprintf(stderr,"fopen file error:%s\n",FILENAME); //文件打开错误
return -1;
}
headers = curl_slist_append(headers, "Host: 192.168.65.128");
headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0");
headers = curl_slist_append(headers, "Accept: application/json, text/javascript, */*; q=0.01");
headers = curl_slist_append(headers, "Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
headers = curl_slist_append(headers, "Accept-Encoding: gzip, deflate");
headers = curl_slist_append(headers, "X-Requested-With: XMLHttpRequest");
headers = curl_slist_append(headers, "Cookie: lastTimeLines=0; cipher_session=1; cipher_key=1; down=1");
curl = curl_easy_init();
if (!curl)
{
fprintf(stderr,"curl init failed\n");
return -1;
}
//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);//openssl编译时使用curl官网或者firefox导出的第三方根证书文件
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);
curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
curl_easy_setopt(curl, CURLOPT_URL, URL); //url地址
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,post_parameter); //post参数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,write_data); //对返回的数据进行操作的函数地址
curl_easy_setopt(curl, CURLOPT_WRITEDATA,fptr); //这是write_data的第四个参数值
res = curl_easy_perform(curl);
if (res != CURLE_OK)
{
switch(res)
{
case CURLE_UNSUPPORTED_PROTOCOL:
fprintf(stderr,"不支持的协议,由URL的头部指定\n");
case CURLE_COULDNT_CONNECT:
fprintf(stderr,"不能连接到remote主机或者代理\n");
case CURLE_HTTP_RETURNED_ERROR:
fprintf(stderr,"http返回错误\n");
case CURLE_READ_ERROR:
fprintf(stderr,"读本地文件错误\n");
default:
fprintf(stderr,"返回值:%d\n",res);
}
return -1;
}
close(fptr);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
————————————————
。
原文链接:https://blog.csdn.net/wang6562009/article/details/78403258
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
模拟芯片产业迎涨价潮,AI需求推动市场变革
Solidigm亮相中国闪存市场峰会,聚焦AI工作流挑战,展示高性能存储方
哪位朋友分析一下linux/arch/arm下的代码
在vxworks下有sniffer工具吗
Xilinx 开发套件和 TI 电源解决方案
Xilinx 功耗估计器(XPE)演示
满足 Xilinx Spartan-6 和 Virtex-6 系列的功耗要求
OPA603构成的10MHz低通滤波器
Virtex-5 功耗估计与测量演示
串口驱动疑问???
中国半导体设备厂商再获资本加码
8次低通滤波器(MAX291、TA7504P)
68HC908JB8单片机及其在USB外设系统中的应用
日本三大半导体厂商将整合,功率半导体领域迎变局
用相同参数构成的每倍频程24dB低通滤波器(μPC882)
51与ADC0809做单通道采集
73K222AL单片式调制解调器与单片机的接口电路
同时获得4种特性的滤波器(TL082)
泰克发布高效电源测试白皮书: 以95.5%回馈效率重塑AI数据中心测试标准
如何在恶劣环境中增强电子电缆性能
没办法!DSP工程师又快要落伍了!
ADS4149 – 超低功耗, 14位, 250-MSPS ADC
电源频率噪声滤波器(μPC822)
BOE(京东方)携手美高梅亮相国际顶级艺术盛会 以创新显示演绎科技与文化融合的新浪潮
BOE(京东方)AI+创新应用大会亮相中关村论坛 共筑AI创新与产业融合新生态
5x系列芯片的复位入口问题
有几个人读懂了linux/arch/arm下的代码?
马瑞利将在2026北京车展发布20余项创新成果 推进本土化、成本效率优势与快速交付
C54x DSP CPU和外设 中文版
通过平台固件弹性保障未来数据中心的安全