计算机学院数字鉴别与身份认证实验报告
基于X509证书和SSL协议的身份认证编程实现 实验的目的和意义
通过实验了解X509证书的生成过程,理解和实践基于公钥基础设施PKI的基本原理。
理解PKI中各个组成部分,如CA的工作原理。如何产生CA的自签名证书,以及CA中心如何颁布证书,如何签名认证证书,如何作废证书的基本过程。
学习和使用OPENSSL体系进行编程,学习使用OPENSSL指令,学习使用OPENSSL库。
实验的原理
证书(certificate),有时候简称为cert,PKI适用于异构环境中,所以证书的格式在所使用的范围内必须统一。证书是一个机构颁发给一个安全个体的证明,所以证书的权威性取决于该机构的权威性。一个证书中,最重要的信息是个体名字、个体的公钥、机构的签名、算法和用途,签名证书和加密证书分开。最常用的证书格式为X.509 v3。
X.509证书格式: 版本:1、2、3
序列号:在CA内部唯一
签名算法标识符:指该证书中的签名算法 签发人名字:CA的名字 有效时间:起始和终止时间 个体名字
个体的公钥信息:算法、参数、密钥 签发人唯一标识符:主体唯一标识符 扩展域 签名
X509标准PKIX:
1)署名用户向证明机构(CA)提出数字证书申请; 2)CA验明署名用户身份,并签发数字证书; 3)CA将证书公布到证书库中;
4)署名用户对电子信件数字签名作为发送认证,确保信件完整性,不可否认性,并发送给依赖方。
5)依赖方接收信件,用署名用户的公钥验证数字签名,并到证书库查明署名用户证书的状态和有效性;
6)证书库返回证书检查结果;
密钥/证书生命周期管理分三个阶段:初始化阶段,颁发阶段,取消阶段(证书过期、证书撤销)。
CA系统的主要内容:
概括地说,认证中心(CA)的功能有:证书发放、证书更新、证书撤销和
计算机学院数字鉴别与身份认证实验报告
证书验证。CA的核心功能就是发放和管理数字证书,具体描述如下:
1、接收验证最终用户数字证书的申请。
2、确定是否接受最终用户数字证书的申请-证书的审批。 3、向申请者颁发、拒绝颁发数字证书-证书的发放。
4、接收、处理最终用户的数字证书更新请求-证书的更新。 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采用两种加密技术:非对称加密用于认证和交换加密密钥,对称加密用于加密传输数据
SSL程序设计:SSL 通讯模型为标准的C/S 结构,除了在 TCP 层之上进行传输之外,与一般的通讯没有什么明显的区别
主要介绍如何使用OpenSSL进行安全通讯的程序设计。
过程主要包括:OpenSSL初始化、SSL环境申请、证书验证、证书加载、绑定到套接字、SSL握手、SSL通信、关闭SSL连接。
实验的操作过程
? 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 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列表等流程;
发布以自己姓名(汉语全拼)为名字的个人证书; 发布Server服务器端的证书;
? 熟悉基于socket的网络通信编程的相关知识,编写简单的Client程序和Server
程序,实现Client程序与Server程序之间基于X509证书和SSL协议身份认证和通信加密;具体可参考Openssl目录下的
? 设计用户界面,能够由用户自己输入想要传输的message;比如 “zhangsan
is working”,服务器能够接收并且显示消息。
实验过程
? 小型CA中心的发布:
文件夹中产生ca.key和ca.crt文件。 ? 个人证书和服务器证书的生成:
ca签名证书:
文件夹中产生了以我名字为名字的用户证书,同理可以发布server服务端证书。 同时可以观察到c:\\caroot目录下的index文件的更新
计算机学院数字鉴别与身份认证实验报告
撤销证书:
撤销后在crl文件夹中创建了撤销文件列表 ? 程序测试
当有一方输入bye时通讯结束
实验的心得体会
附加程序的完成的源代码
Client代码:
// client.cpp : Defines the entry point for the console application. //modify by zhangxuan //2009-11-8
#include \
#include
#include
#include \ #include \#include \#include \#include \#include \#include \
/*所有需要的参数信息都在此处以#define的形式提供*/
#define CERTF \客户端的证书(需经CA签名)*/
计算机学院数字鉴别与身份认证实验报告
#define KEYF \客户端的私钥(建议加密存储)*/ #define CACERT \的证书*/ #define PORT 4433 /*服务端的端口*/
#define SERVER_ADDR \服务段的IP地址*/
#define CHK_NULL(x) if ((x)==NULL) exit (-1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(-2); }
#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; char* str;
char buf [4096];
SSL_METHOD *meth;
int seed_int[100]; /*存放随机序列*/
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){ printf(\ return -1; }
OpenSSL_add_ssl_algorithms(); /*初始化*/
SSL_load_error_strings(); /*为打印调试信息作准备*/
meth = TLSv1_client_method(); /*采用什么协议(SSLv2/SSLv3/TLSv1)在此指定*/
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证书*/

