1.创建证书
1.1步骤
1.首先我们需要将之前安装好的openssl文件中的openssl.cnf 拷贝到当前目录下,如图所示:
cp /usr/local/ssl/bin/openssl.cnf ./
2.接下来就是创建加密所需要的key和CSR文件,分别是:openssl genrsa -des3 -out server.key 1024
和openssl rsa -in server.key -out server.key
,然后再交给CA签名生成服务器的证书openssl req -new -key server.key -out server.csr -config openssl.cnf
。
客户端重复相同的步骤
3.在继续下面操作前,将openssl.conf文件打开,查看其dir路径(这里可以使用pwd查看当前路径)将其修改为dir = /openssl/client/demoCA,(跟后面创建的路径一致)否则下面的步骤会提示路径无法找到。mkdir demoCAmkdir demoCA/newcerts创建空文件(文件必须是空的)touch demoCA/index.txt创建一个任意数据的文件vi demoCA/serial 写入0011,保存退出。
4.生成的CA证书进行签名
服务器端
客户端
4.至此我们已经成功生成了所需要的文件
1.2可能碰到的问题
**1.**首先是我之前安装并没有出现的问题,在我生成key时,出现
原因是找不到相应的库文件。
假如你的libssl.so.1.1 文件在/usr/local/openssl/lib/下面,可以这样做建议软连接
ln -s /usr/local/lib/libssl.so.1.1 /usr//libssl.so.1.1
ln -s /usr/local/lib/libcrypto.so.1.1 /usr//libcrypto.so.1.1
如果不知道在哪里可以使用图中的find命令进行查找
2.第二个问题是在给服务器签名之后,继续给客户端进行签名遇到的问题,
这里是因为serial值造成的,我们可以去之前设置的0011,进行更改之后就可以正常签名使用。
2.客户端和服务器
1.客户端
在进行编程之前我们要了解openssl编程的顺序:
a,Openssl的头文件:
#include <openssl/ssl.h>
#include <openssl/err.h>
b,Openssl的初始化,在使用之前必须进行的步骤
int SSL_library_int(void);
c,选择会话的协议
目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。
需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。
d, 创建会话环境
申请SSL会话环境的OpenSSL函数是:
SSL_CTX SSL_CTX_new(SSL_METHOD method);
当SSL会话环境申请成功后,还要根据实际的需要设置CTX的属性,通常的设置是指定SSL握手阶段证书的验证方式和加载自己的证书。制定证书验证方式的函数是:
int SSL_CTX_set_verify(SSL_CTxctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));
为SSL会话环境加载CA证书的函数是:
SSL_CTX_load_verify_location(SSL_CTX *ctx,const char *Cafile,const char *Capath);
为SSL会话加载用户证书的函数是:
SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,int type);
为SSL会话加载用户私钥的函数是:
SSL_CTX_use_PrivateKey_file(SSL_CTX ctx,const char file,int type);
在将证书和私钥加载到SSL会话环境之后,就可以调用下面的函数来验证私钥和证书是否相符:
int SSL_CTX_check_private_key(SSL_CTX *ctx);
e,建立SSL的套子节
f,后面就是SSL的握手以及数据传输,最后结束SSL通信。
下面贴出我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <resolv.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <getopt.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/crypto.h>
int get_stop = 0;//结束标志
#define MAXSIZE 1024
#define CA_CERT_FILE "ca.crt"
#define CLIENT_CERT_FILE "client.crt"
#define CLIENT_KEY_FILE "client.key"
void print_usage(char *order)
{
printf("usages: %s\n",order);
printf("-I(IP):server IP\n");
printf("-p(port):server port\n");
printf("-h(help):help information\n");
exit(0);
}
/*证书信息*/
void ShowCerts (SSL* ssl)
{
X509 *cert;
char *line;
cert=SSL_get_peer_certificate(ssl);
if(cert !=NULL)
{
printf("数字证书信息:\n");
line=X509_NAME_oneline(X509_get_subject_name(cert),0,0);
printf("证书:%s\n",line);
free(line);
line=X509_NAME_oneline(X509_get_issuer_name(cert),0,0);
printf("颁发者:%s\n",line);
free(line);
X509_free(cert);
}
else
{
printf("无证书信息!\n");
}
}
int main(int argc,char **argv)
{
int opt = -1;
int on = 1;
int sockfd = -1;
int len;
int rv;
int port = 0;
char send_buffer[MAXSIZE];
char rec_buffer[MAXSIZE];
char *ip = NULL;
SSL_CTX *ctx;
SSL