首页 > 编程知识 正文

国密ssl握手报文分析(软件密码模块)

时间:2023-05-03 14:43:20 阅读:66473 作者:1315

后台qkdwx/p OpenSSL支持标准SSL协议,但不支持国家秘密SSL协议。 本文介绍了c语言使用保密版OpenSSL开发简单的客户端程序、连接到保密网站、发送HTTP请求和接收HTTP响应。

Centos7 X64。

国密OpenSSL。 3https://www.GM SSL.cn/GM SSL/index.JSP下载? go=gmsdk

国密OpenSSL展rydxss/usr/local/gmssl_10

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#包含

#define贤惠之铃4096

(intmain(intargc,char *argv包容的鸵鸟) ) ) ) ) ) ) ) ) )。

{

struct sockaddr_in serveraddr;

结构主机*主机;

int sockfd,len;

愤怒的奇果ssl=NULL;

int bi=0;

if(argc4) {

printf ('./% saddrporturisig.PEM SIG.key enc.PE menc.keyn ',argv[0] );

printf (可选: SIG.PEM SIG.key enc.PE menc.key (n ) );

退出(1;

}

if(argc==8) ) )

{

bi=1;

}

char *addr=argv[1];

导入=atoi (argv [2];

char *uri=argv[3];

char *sigCrt=argv[4];

char *sigKey=argv[5];

char *encCrt=argv[6];

char *encKey=argv[7];

//国密SSL首次jxdds

GM_load_library (;

//国密SSL生成SSL_CTX

const SSL _ method * method=GM v1 _1_ client _ method (;

if (! ctx )

{

printf (创建xisfailed. n );

退出(1;

}

//load gm sign keypair

是if(bi )

{

if (SSL _ CTX _ use _ certificate _ chain _ file (CTX,sigCrt )=0) ) )

{

printf (unabletogetcertificatefrom ' % s 'n ',sigCrt );

//err_print_errors(bio_err;

退出(1;

}

if (SSL _ CTX _ use _ private key _ file (CTX,sigKey,SSL_FILETYPE_PEM )=0)

{

printf (unabletogetprivatekeyfrom ' % s 'n ',sigKey );

//err_print_errors(bio_err;

退出(1;

}

}

//load gm enc keypair

是if(bi )

{

if (SSL _ CTX _ use _ encrypt _ cert _ file (CTX,encCrt )=0) ) ) ) ) ) ) )。

{

打印机(unabletogetcertificate (enc ) from '%s'n ',encCrt );

//err_print_errors(bio_err;

退出(1;

}

if (SSL _ CTX _ use _ encrypt _ private key _ file (CTX,encKey,SSL_FILETYPE_PEM )=0) )

{

非启用私有密钥(enc ) from '%s'n ',enc密钥);

//err_print_errors(bio_err;

退出(1;

}

}

if () host=gethostbyname(addr ) )==0) ) ) ) ) ) )。

{

错误解析主机(printf ),addr );

退出(1;

}

char * IP=inet _ ntoa (* (struct in _ addr * ) host-h_addr_list[0];

sockfd=socket(af_inet,SOCKjddqq,0 );

bzero (服务器addr,sizeof ) (服务器addr );

serveraddr.sin_family=AF_INET;

inet_Pton(af_inet,ip,serveraddr.sin_addr.s_addr );

服务器addr.sin _ port=htons (port;

intok=connect(sockfd,) struct sockaddr * (serveraddr,sizeof ) server addr );

if(ok!=0)

{

printf (连接失败(n ) );

退出(0;

}

SSL=SSL_new(CTX;

if(SSL==null ) {

printf(SSL_newerror.n );

退出(0;

}

if(SSL_connect(SSL )==-1 ) {

打印(SSL _ connect fail. n );

ERR_print_errors_FP(stderr );

退出(1;

}

else

{

连接的宽度% sencryption (n ),SSL_get_cipher ) SSL (printf );

}

//send http请求

{

char request[1024]={ 0 };

sprintf (请求,' get % shttp/1.1rnaccept 3360 */*rnuser-agent 3360 Mozilla/5.0rn主机3365365306;

是if(len0)

{

打印故障(n );

}

else

{

printf(sendok,%d bytes:n%sn )、strlen(request )和request );

}

}

//read http响应

{

char buffer[rxdbg 1];

memset (缓冲器,0,rxdbg 1);

if(len0) {

printf (读取确定,%d bytes: n%sn ),len,buffer );

}

else

{

打印故障(n );

goto finish;

}

}

finish:

关闭(sockfd;

返回0;

}

gcc-o test-LDL-lm test.c/usr/local/GM SSL _ 10/lib/libssl.a/usr/local/GM SSL _ 10/lib/libcrypto .

单向国密SSL网站

./test demo.gmssl.cn 443 /

双向国密SSL网站

./test demo.GM SSL.cn 444/cert.jspsig.crtsig.key enc.CRT enc.key

1 )要构建单向/双向保密web服务器,请访问https://www.gmssl.cn以提供对nginx/apache/tomcat的支持。

2 )申请国密双重证书。 请访问https://www.GM SSL.cn/GM SSL/index.JSP。 go=ca

3 ) https://demo.gmssl.cn是单向国密网站

4 ) https://demo.gmssl.cn:444是一个双向国密网站

通过使用国密OpenSSL,c语言可以轻松编程为使用国密SSL连接到国密网站。 www.gmssl.cn提供了所有免费的测试组件,并支持双向保密SSL,使您可以进行学习和测试。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。