数字鉴别与身份认证实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "openssl/x509.h"
#include "openssl/pem.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
#include "openssl/rand.h"
/*所有需要的参数信息都在此处以#define的形式提供*/
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(-3); }
int main ()
{
int err;
int sd;
struct sockaddr_in sa;
SSL_CTX* ctx;
SSL* ssl;
X509* server_cert;
//free (str);
X509_free (server_cert); /*如不再需要,需将证书释放*/
/*数据交换开始,用SSL_write,SSL_read代替write,read */
ERR_print_errors_fp(stderr);
exit(-3);
}
if (!SSL_CTX_check_private_key(ctx)) {
printf("Private key does not match the certificate public key\n");
exit(-4);
if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
exit(-2);
}
if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) {
#define SERVER_ADDR "127.0.0.1" /*服务段的IP地址*/
#define CHK_NULL(x) if ((x)==NULL) exit (-1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(-2); }
5、ms\do_ms
6、nmake -f ms\ntdll.mak
将OPENSSL编译成功生成D:\openssl-0.9.8\openssl-0.9.8\out32dll文件夹
能够发布CA自签名证书;建立一个小型的CA中心;熟悉CA证书系统的密钥对的产生、提出证书申请、发布证书、撤销证书、发布CRL列表等流程;
}
/*构建随机数生成机制,WIN32平台必需*/
srand( (unsigned)time( NULL ) );
for( int i = 0; i < 100;i++ )
seed_int[i] = rand();
RAND_seed(seed_int, sizeof(seed_int));
/*以下是正常的TCP socket建立过程.............................. */
printf("Begin tcp socket...\n");
sd = socket (AF_INET, SOCK_STREAM, 0);
CHK_ERR(sd, "socket");
memset(&sa,'\0', sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr (SERVER_ADDR); /* Server IP */
CHK_NULL(str);
printf ("\t subject: %s\n", str);
//free (str);
str = X509_NAME_oneline (X509_get_issuer_name (server_cert),0,0);
CHK_NULL(str);
printf ("\t issuer: %s\n", str);
基于X509证书和SSL协议的身份认证编程实现
实验的目的和意义
通过实验了解X509证书的生成过程,理解和实践基于公钥基础设施PKI的基本原理。理解PKI中各个组成部分,如CA的工作原理。如何产生CA的自签名证书,以及CA中心如何颁布证书,如何签名认证证书,如何作废证书的基本过程。
学习和使用OPENSSL体系进行编程,学习使用OPENSSL指令,学习使用OPENSSL库。
实验过程
小型CA中心的发布:
文件夹中产生ca.key和ca.crt文件。
个人证书和服务器证书的生成:
ca签名证书:
文件夹中产生了以我名字为名字的用户证书,同理可以发布server服务端证书。
同时可以观察到c:\caroot目录下的index文件的更新
撤销证书:
撤销后在crl文件夹中创建了撤销文件列表
ctx = SSL_CTX_new (meth);
CHK_NULL(ctx);
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL); /*验证与否*/
SSL_CTX_load_verify_locations(ctx,CACERT,NULL); /*若验证,则放置CA证书*/
printf("Begin SSL negotiation \n");
ssl = SSL_new (ctx);
CHK_NULL(ssl);
SSL_set_fd (ssl, sd);
err = SSL_connect (ssl);
CHK_SSL(err);
/*打印所有加密算法的信息(可选)*/
printf ("SSL connection using %s\n", SSL_get_cipher (ssl));
5、接收最终用户数字证书的查询、撤销。
6、产生和发布证书废止列表(CRL)。
7、数字证书的归档。
8、密钥归档。
9、历史数据归档。
CA的密钥管理功能:
1、公私密钥对的产生
2、公钥的获取
3、密钥备份和恢复
4、证书撤消
5、自动更新密钥
6、密钥历史档案
Secure Sockets Layer(SSL):
作用:
SSL被设计用来使用TCP提供一个可靠的端到端安全服务,为两个通讯个体之间提供保密性和完整性(身份鉴别)
SSL提供四个基本功能:Authentication、Encryption、Integrity、Key Exchange
SSL采用两种加密技术:非对称加密用于认证和交换加密密钥,对称加密用于加密传输数据
3)CA将证书公布到证书库中;
4)署名用户对电子信件数字签名作为发送认证,确保信件完整性,不可否认性,并发送给依赖方。
5)依赖方接收信件,用署名用户的公钥验证数字签名,并到证书库查明署名用户证书的状态和有效性;
6)证书库返回证书检查结果;
密钥/证书生命周期管理分三个阶段:初始化阶段,颁发阶段,取消阶段(证书过期、证书撤销)。
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <winsock2.h>
#include "openssl/rsa.h"
#include "openssl/crypto.h"
char* str;
char buf [4096];
SSL_METHOD *meth;
int seed_int[100]; /*存放随机序列*/
WSADATA wsaData;
iBiblioteka Baidu(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){
printf("WSAStartup()fail:%d\n",GetLastError());
发布以自己姓名(汉语全拼)为名字的个人证书;
发布Server服务器端的证书;
熟悉基于socket的网络通信编程的相关知识,编写简单的Client程序和Server程序,实现Client程序与Server程序之间基于X509证书和SSL协议身份认证和通信加密;具体可参考Openssl目录下的
设计用户界面,能够由用户自己输入想要传输的message;比如“zhangsan is working”,服务器能够接收并且显示消息。
OPENSSL安装和环境配置
1、预先安装PERL组件ActivePerl-5.8.0.806-MSWin32-x86.rar和windows vc6开发工具;
2、openssl.0.9.8.tar.gz解压到d:
3、cd d:\D:\openssl-0.9.8\openssl-0.9.8
4、perl Configure VC-WIN32
CA系统的主要内容:
概括地说,认证中心(CA)的功能有:证书发放、证书更新、证书撤销和证书验证。CA的核心功能就是发放和管理数字证书,具体描述如下:
1、接收验证最终用户数字证书的申请。
2、确定是否接受最终用户数字证书的申请-证书的审批。
3、向申请者颁发、拒绝颁发数字证书-证书的发放。
4、接收、处理最终用户的数字证书更新请求-证书的更新。
程序测试
当有一方输入bye时通讯结束
实验的心得体会
附加程序的完成的源代码
Client代码:
// client.cpp : Defines the entry point for the console application.
//modify by zhangxuan
//2009-11-8
#include "stdafx.h"
return -1;
}
OpenSSL_add_ssl_algorithms(); /*初始化*/
SSL_load_error_strings(); /*为打印调试信息作准备*/
meth = TLSv1_client_method(); /*采用什么协议(SSLv2/SSLv3/TLSv1)在此指定*/
#define CERTF "client.crt" /*客户端的证书(需经CA签名)*/
#define KEYF "client.key" /*客户端的私钥(建议加密存储)*/
#define CACERT "ca.crt" /*CA的证书*/
#define PORT 4433 /*服务端的端口*/
SSL程序设计:SSL通讯模型为标准的C/S结构,除了在TCP层之上进行传输之外,与一般的通讯没有什么明显的区别
主要介绍如何使用OpenSSL进行安全通讯的程序设计。
过程主要包括:OpenSSL初始化、SSL环境申请、证书验证、证书加载、绑定到套接字、SSL握手、SSL通信、关闭SSL连接。
实验的操作过程
实验的原理
证书(certificate),有时候简称为cert,PKI适用于异构环境中,所以证书的格式在所使用的范围内必须统一。证书是一个机构颁发给一个安全个体的证明,所以证书的权威性取决于该机构的权威性。一个证书中,最重要的信息是个体名字、个体的公钥、机构的签名、算法和用途,签名证书和加密证书分开。最常用的证书格式为X.509 v3。
X.509证书格式:
版本:1、2、3
序列号:在CA内部唯一
签名算法标识符:指该证书中的签名算法
签发人名字:CA的名字
有效时间:起始和终止时间
个体名字
个体的公钥信息:算法、参数、密钥
签发人唯一标识符:主体唯一标识符
扩展域
签名
X509标准PKIX:
1)署名用户向证明机构(CA)提出数字证书申请;
2)CA验明署名用户身份,并签发数字证书;
sa.sin_port = htons (PORT); /* Server Port number */
err = connect(sd, (struct sockaddr*) &sa,
sizeof(sa));
CHK_ERR(err, "connect");
/* TCP链接已建立.开始SSL握手过程.......................... */
/*得到服务端的证书并打印些信息(可选) */
server_cert = SSL_get_peer_certificate (ssl);
CHK_NULL(server_cert);
printf ("Server certificate:\n");
str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
相关文档
最新文档