文档库 最新最全的文档下载
当前位置:文档库 › OpenSSL编程实例

OpenSSL编程实例

OpenSSL编程实例
OpenSSL编程实例

客户端程序

// OpenSSLClient.cpp

#include

#include

using namespace std;

#pragma comment (lib, "Ws2_32.lib")

#include "openssl/ssl.h"

#pragma comment(lib, "ssleay32.lib")

#pragma comment(lib, "libeay32.lib")

#define SERVICE_PORT 10000

const int nBufSize = 512;

// 初始化2.2版本Winsock

int InitWinsock(){

WSADATA wsaData = {0};

WORD wVer = MAKEWORD(2,2);

int nRet = WSAStartup(wVer, &wsaData);

if(nRet != 0){

cout<<"Winsock初始化失败,错误代码是"<

}

return nRet;

}

// 创建一个套接字

SOCKET CreateSocket(){

SOCKET hSocket = INVALID_SOCKET;

hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(hSocket == INVALID_SOCKET){

int last_err = WSAGetLastError();

cout<<"创建套接字失败,错误代码是"<

}

return hSocket;

}

// 连接到服务器

int ConnectServer(SOCKET hSocket){

// 填充远程套接字地址

SOCKADDR_IN saServer = {0};

saServer.sin_family = AF_INET;

saServer.sin_port = htons(SERVICE_PORT);

saServer.sin_addr.s_addr = inet_addr("127.0.0.1");

// 使用远程套接字地址连接到服务器

int nRet = connect(hSocket, (SOCKADDR *)&saServer, sizeof(saServer));

if(nRet == SOCKET_ERROR){

int last_err = WSAGetLastError();

cout<<"连接失败,错误代码是"<

}

return nRet;

}

bool InitOpenSSL(){

if(!SSL_library_init())

return false;

SSL_load_error_strings();

return true;

}

int PasswordCB(char *buf, int size, int flag, void *userdata){

// 作者所创建的客户端程序私匙密码是12345678

const char* pass = "12345678";

if(size < strlen(pass) + 1)

return(0);

strcpy(buf, pass);

return(strlen(pass));

}

int VerifyCB(int ok, X509_STORE_CTX *store){

if(!ok){

int err = X509_STORE_CTX_get_error(store);

cout<

}

return ok;

}

SSL_CTX* InitSSLContext(){

const SSL_METHOD *meth = NULL;

SSL_CTX* ctx = NULL;

meth = SSLv23_method();

ctx = SSL_CTX_new(meth);

// 加载客户端程序证书链

if(!SSL_CTX_use_certificate_chain_file(ctx, "ClientAppChain.pem")){ cout<<"加载客户端程序证书链失败"<

return NULL;

}

SSL_CTX_set_default_passwd_cb(ctx, PasswordCB);

// 加载客户端程序私匙文件

if(!SSL_CTX_use_PrivateKey_file(ctx, "ClientApp_PrivateKey.pem",

SSL_FILETYPE_PEM)){

cout<<"加载客户端程序私匙文件失败"<

return NULL;

}

// 加载客户端程序所信任的CA

if(!SSL_CTX_load_verify_locations(ctx, "MyTestCA_Certificate.pem",

NULL)){

cout<<"加载客户端程序所信任的CA失败"<

return NULL;

}

// 加载OpenSSL缺省信任的CA

if(!SSL_CTX_set_default_verify_paths(ctx)){

cout<<" 加载OpenSSL缺省信任的CA失败"<

return NULL;

}

// 我们知道,服务器的证书链是serverApp-->ServerCA-->MyTestCA,

// 所以可以明确验证深度是2,即最多检查ServerCA和MyTestCA两个CA SSL_CTX_set_verify_depth(ctx, 2);

// SSL_VERIFY_PEER要求服务器提供证书,VerifyCB用于输出OpenSSL

// 握手过程中验证服务器证书链失败时的错误信息

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, VerifyCB);

SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);

return ctx;

}

// 简单的校验,仅检查common name

bool CheckCertificate(SSL* ssl){

X509* cert = SSL_get_peer_certificate(ssl);

if(cert == NULL)

return false;

X509_NAME* subjectName = X509_get_subject_name(cert);

if(subjectName == NULL)

return false;

char buf[256];

if(X509_NAME_get_text_by_NID(subjectName, NID_commonName, buf, 256) >0 ){

if(strcmp(buf, "serverApp") == 0)

return true;

}

return false;

}

void DoWork(SSL* ssl){

char buf[256];

while(true){

if(!fgets(buf, sizeof(buf)/sizeof(buf[0]), stdin)){

SSL_shutdown(ssl);

break;

}

int len = strlen(buf);

int nSent = 0;

while(nSent < len){

int nRet = SSL_write(ssl, buf+nSent, len-nSent);

if(nRet <= 0){

cout<<"SSL_write发生错误"<

SSL_clear(ssl);

break;

}

nSent += nRet;

}

}

}

int main(int argc, char* argv[]){

if(InitWinsock() != 0)

return -1;

SOCKET hSocket = INVALID_SOCKET;

SSL_CTX* ctx = NULL;

SSL* ssl = NULL;

BIO* sbio = NULL;

int nRet = 0;

try{

if(!InitOpenSSL())

throw -1;

ctx = InitSSLContext();

if(ctx == NULL)

throw -1;

ssl = SSL_new(ctx);

hSocket = CreateSocket();

if(hSocket == INVALID_SOCKET)

throw -1;

if(ConnectServer(hSocket) == SOCKET_ERROR)

throw -1;

sbio = BIO_new_socket(hSocket, BIO_NOCLOSE);

SSL_set_bio(ssl, sbio, sbio);

if(SSL_connect(ssl) <= 0){

cout<<"SSL握手发生错误"<

throw -1;

}

if(!CheckCertificate(ssl))

throw -1;

DoWork(ssl);

}

catch(int excpt_err){

nRet = excpt_err;

}

//if(sbio) BIO_free(sbio);

if(ssl) SSL_free(ssl);

if(ctx) SSL_CTX_free(ctx);

if(hSocket != INVALID_SOCKET)

closesocket(hSocket);

WSACleanup();

return 0;

}

----------------------------------------------------

服务器程序

// OpenSSLServer.cpp

#include

#include

using namespace std;

#pragma comment (lib, "Ws2_32.lib")

#include "openssl/ssl.h"

#pragma comment(lib, "ssleay32.lib")

#pragma comment(lib, "libeay32.lib")

#define SERVICE_PORT 10000

const int nBufSize = 512;

// 初始化2.2版本Winsock

int InitWinsock(){

WSADATA wsaData = {0};

WORD wVer = MAKEWORD(2,2);

int nRet = WSAStartup(wVer, &wsaData);

if(nRet != 0){

cout<<"Winsock初始化失败,错误代码是"<

}

return nRet;

}

// 创建一个套接字

SOCKET CreateSocket(){

SOCKET hSocket = INVALID_SOCKET;

hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(hSocket == INVALID_SOCKET){

int last_err = WSAGetLastError();

cout<<"创建套接字失败,错误代码是"<

}

return hSocket;

}

// 绑定和监听

int BindListen(SOCKET hSocket){

// 填充本地套接字地址

sockaddr_in saListen = {0};

saListen.sin_family = AF_INET;

saListen.sin_port = htons(SERVICE_PORT);

saListen.sin_addr.s_addr = htonl(INADDR_ANY);

// 把本地套接字地址绑定到监听套接字

int nRet = bind(hSocket, (sockaddr*)&saListen, sizeof(sockaddr));

if(nRet == SOCKET_ERROR){

int last_err = WSAGetLastError();

cout<<"绑定套接字失败,错误代码是"<

}

else{

// 开始监听

nRet = listen(hSocket, 5);

if(nRet == SOCKET_ERROR){

int last_err = WSAGetLastError();

cout<<"监听失败,错误代码是"<

}

}

return nRet;

}

// 接收连接请求

SOCKET AcceptRequest(SOCKET hSocket){

sockaddr_in saClient = {0};

int nSALen = sizeof(sockaddr);

SOCKET hClientSocket = accept(hSocket, (sockaddr*)&saClient, &nSALen);

if(hClientSocket == INVALID_SOCKET){

int last_err = WSAGetLastError();

cout<<"接受连接请求失败,错误代码是"<

}

return hClientSocket;

}

bool InitOpenSSL(){

if(!SSL_library_init())

return false;

SSL_load_error_strings();

return true;

}

int PasswordCB(char *buf, int size, int flag, void *userdata){

// 作者所创建的服务器程序私匙密码是abcdefgh

const char* pass = "abcdefgh";

if(size < strlen(pass) + 1)

return(0);

strcpy(buf, pass);

return(strlen(pass));

}

int VerifyCB(int ok, X509_STORE_CTX *store){

if(!ok){

int err = X509_STORE_CTX_get_error(store);

cout<

}

return ok;

}

SSL_CTX* InitSSLContext(){

const SSL_METHOD *meth = NULL;

SSL_CTX* ctx = NULL;

meth = SSLv23_method();

ctx = SSL_CTX_new(meth);

// 加载服务器程序证书链

if(!SSL_CTX_use_certificate_chain_file(ctx, "serverAppChain.pem")){

cout<<"加载服务器程序证书链失败"<

return NULL;

}

SSL_CTX_set_default_passwd_cb(ctx, PasswordCB);

// 加载服务器程序私匙文件

if(!SSL_CTX_use_PrivateKey_file(ctx, "ServerApp_PrivateKey.pem",

SSL_FILETYPE_PEM)){

cout<<"加载服务器程序私匙文件失败"<

return NULL;

}

// 加载服务器程序所信任的CA

if(!SSL_CTX_load_verify_locations(ctx, "MyTestCA_Certificate.pem",

NULL)){

cout<<"加载服务器程序所信任的CA失败"<

return NULL;

}

// 加载OpenSSL缺省信任的CA

if(!SSL_CTX_set_default_verify_paths(ctx)){

cout<<" 加载OpenSSL缺省信任的CA失败"<

return NULL;

}

// 我们知道,客户端的证书链是ClientApp-->MyTestCA,

// 所以可以明确验证深度是1,即只检查MyTestCA

SSL_CTX_set_verify_depth(ctx, 1);

// SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT要求客户端提供证书,

// 如果不提供的话,则校验失败。VerifyCB用于输出OpenSSL

// 握手过程中验证客户端证书链失败时的错误信息

SSL_CTX_set_verify(ctx,

SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,

VerifyCB);

SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);

return ctx;

}

// 简单的校验,仅检查common name

bool CheckCertificate(SSL* ssl){

X509* cert = SSL_get_peer_certificate(ssl);

if(cert == NULL)

return false;

X509_NAME* subjectName = X509_get_subject_name(cert);

if(subjectName == NULL)

return false;

char buf[256];

if(X509_NAME_get_text_by_NID(subjectName, NID_commonName, buf, 256) >0 ){

if(strcmp(buf, "ClientApp") == 0)

return true;

}

return false;

}

void DoWork(SSL* ssl){

char buf[256];

while(true){

int nRead = SSL_read(ssl, buf, sizeof(buf)/sizeof(buf[0]) - 1);

if(nRead <= 0){

if(SSL_get_shutdown(ssl) & SSL_RECEIVED_SHUTDOWN){

SSL_shutdown(ssl);

}

else{

SSL_clear(ssl);

}

break;

}

buf[nRead] = 0;

cout<

}

}

int main(int argc, char* argv[]){

if(InitWinsock() != 0)

return -1;

SOCKET hListenSocket = INVALID_SOCKET;

SOCKET hClientSocket = INVALID_SOCKET;

SSL_CTX* ctx = NULL;

SSL* ssl = NULL;

BIO* sbio = NULL;

int nRet = 0;

try{

if(!InitOpenSSL())

throw -1;

ctx = InitSSLContext();

if(ctx == NULL)

throw -1;

ssl = SSL_new(ctx);

hListenSocket = CreateSocket();

if(hListenSocket == INVALID_SOCKET)

throw -1;

if(BindListen(hListenSocket) == SOCKET_ERROR)

throw -1;

hClientSocket = AcceptRequest(hListenSocket);

if(hClientSocket == INVALID_SOCKET)

throw -1;

sbio = BIO_new_socket(hClientSocket, BIO_NOCLOSE);

SSL_set_bio(ssl, sbio, sbio);

if(SSL_accept(ssl) <= 0){

cout<<"SSL握手发生错误"<

throw -1;

}

if(!CheckCertificate(ssl))

throw -1;

DoWork(ssl);

}

catch(int excpt_err){

nRet = excpt_err;

}

//if(sbio) BIO_free(sbio);

if(ssl) SSL_free(ssl);

if(ctx) SSL_CTX_free(ctx);

if(hClientSocket != INVALID_SOCKET) closesocket(hClientSocket);

if(hListenSocket != INVALID_SOCKET) closesocket(hListenSocket);

WSACleanup();

return 0;

}

使用OpenSSL建立根CA及自签名证书制作过程

使用OpenSSL建立根CA及自签名证书制作过程 2009-12-24 11:35:32| 分类:openssl |字号订阅 Openssl版本:0.9.8 版本,可从https://www.wendangku.net/doc/0b15793374.html,处下载。 1.先建立如下目录结构: $home/testca # testca 是待建CA的主目录 ├─newcerts/ # newcerts子目录将存放CA签发过的数组证书(备份目录) ├─private/ # private目录用来存放CA私钥 └─conf/ # conf目录用来存放简化openssl命令行参数用的配置文件 此外使用命令 echo "01" > serial touch index.txt 在ca根目录下创建文件serial (用来存放下一个证书的序列号) 和indext.txt (证书信息数据库文件)。 1.生成CA的私钥和自签名证书 (根证书) 创建配置文件:vi "$HOME/testca/conf/gentestca.conf" 文件内容如下: #################################### [ req ] default_keyfile = /home/cx/testCA/private/cakey.pem default_md = md5 prompt = no

distinguished_name = ca_distinguished_name x509_extensions = ca_extensions [ ca_distinguished_name ] organizationName = ss organizationalUnitName = sstc commonName = sstcCA emailAddress = GChen2@https://www.wendangku.net/doc/0b15793374.html, #自己的邮件地址 [ ca_extensions ] basicConstraints = CA:true ######################################## 然后执行命令如下: cd "$HOME/testca" openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 2190 -config "$HOME/testca/conf/gentestca.conf" 执行过程中需要输入CA私钥的保护密码,假设我们输入密码: 888888 可以用如下命令查看一下CA自己证书的内容 openssl x509 -in cacert.pem -text –noout 创建一个配置文件,以便后续CA日常操作中使用 vi "$HOME/testca/conf/testca.conf"

OpenSSL证书制作过程

比亚迪培训讲义 在J2EE中使用数字证书 深圳市金蝶中间件有限公司 2007年12月

Table of Contents 1 数字证书使用的场合 (3) 2 数字证书的颁发 (3) 2.1 概述 (3) 2.2 创建自签名CA (3) 2.2.1 生成ca私钥 (3) 2.2.2 生成ca待签名证书 (4) 2.2.3用CA私钥进行自签名,得到自签名的CA根证书 (4) 2.2.4 https://www.wendangku.net/doc/0b15793374.html,f配置文档 (5) 2.3 颁发服务器证书 (7) 2.3.1 生成服务器私钥对及自签名证书 (7) 2.3.2 生成服务器待签名证书 (7) 2.3.3 请求CA签名服务器待签名证书,得到经CA签名的服务器证书 (8) 2.3.4把CA根证书导入密钥库 mykeystore (8) 2.3.5把经过CA签名的服务器证书导入密钥库mykeystore (8) 2.4 颁发客户端证书 (9) 2.4.1 生成客户端私钥 (9) 2.4.2生成客户端待签名证书 (9) 2.4.3请求CA签名客户端待签名证书,得到经CA签名的客户端证书 (10) 生成客户端的个人证书client.p12 (10) 2.5 CA根证书导入客户端 (11) 2.6个人证书导入客户端 (11) 3 在J2EE中使用证书 (11) 3.1 配置SSL双向认证 (11) 3.1.1 服务器端密钥库和信任库 (12) 3.1.2修改Muxer服务 (12) 3.1.3修改SecurityService服务 (13) 3.2 在程序中获取证书信息 (13) 4 练习 (13) 5 附录 (14) 5.1 SSL v3的处理步骤 (14) 5.2 命令行调试SSL证书 (14)

openssl使用手册

OpenSSL有两种运行模式:交互模式和批处理模式。 直接输入openssl回车进入交互模式,输入带命令选项的openssl进入批处理模式。 (1) 配置文件 OpenSSL的默认配置文件位置不是很固定,可以用openssl ca命令得知。 你也可以指定自己的配置文件。 当前只有三个OpenSSL命令会使用这个配置文件:ca, req, x509。有望未来版本会有更多命令使用配置文件。 (2)消息摘要算法 支持的算法包括:MD2, MD4, MD5, MDC2, SHA1(有时候叫做DSS1), RIPEMD-160。SHA1和RIPEMD-160产生160位哈西值,其他的产生128位。除非出于兼容性考虑,否则推荐使用SHA1或者RIPEMD-160。 除了RIPEMD-160需要用rmd160命令外,其他的算法都可用dgst命令来执行。 OpenSSL对于SHA1的处理有点奇怪,有时候必须把它称作DSS1来引用。 消息摘要算法除了可计算哈西值,还可用于签名和验证签名。签名的时候,对于DSA生成的私匙必须要和DSS1(即SHA1)搭配。而对于RSA生成的私匙,任何消息摘要算法都可使用。 ############################################################# # 消息摘要算法应用例子 # 用SHA1算法计算文件file.txt的哈西值,输出到stdout $ openssl dgst -sha1 file.txt # 用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt $ openssl sha1 -out digest.txt file.txt # 用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin # 签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中 $ openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt # 用dss1算法验证file.txt的数字签名dsasign.bin, # 验证的private key为DSA算法产生的文件dsakey.pem $ openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt # 用sha1算法为文件file.txt签名,输出到文件rsasign.bin # 签名的private key为RSA算法产生的文件rsaprivate.pem $ openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt # 用sha1算法验证file.txt的数字签名rsasign.bin, # 验证的public key为RSA算法生成的rsapublic.pem $ openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt (3) 对称密码 OpenSSL支持的对称密码包括Blowfish, CAST5, DES, 3DES(Triple DES), IDEA, RC2, RC4以及RC5。OpenSSL 0.9.7还新增了AES的支持。很多对称密码支持不同的模式,包括CBC, CFB, ECB以及OFB。对于每一种密码,默认的模式总是CBC。需要特别指出的是,尽量避免使用ECB模式,要想安全地使用它难以置信地困难。 enc命令用来访问对称密码,此外还可以用密码的名字作为命令来访问。除了加解密,base64可作为命令或者enc命令选项对数据进行base64编码/解码。 当你指定口令后,命令行工具会把口令和一个8字节的salt(随机生成的)进行组合,然后计算MD5 hash值。这个hash值被切分成两部分:加密钥匙(key)和初始化向量(initialization

OpenSSL 命令常用证书操作

在OpenSSL开发包中,包含一个实用工具:openssl,比如我用MinGW GCC 编译OpenSSL 0.9.8k 后,openssl 就保存在out目录下。openssl 工具是完成密钥、证书操作和其它SSL 事务的入口环境,直接运行不带参数的openssl 命令后,可以得到一个shell 环境,在其中可以以交互的方式完成SSL 相关的安全事务。 不过有时,如果用一个带参数选项的openssl 命令完成操作,会更方便。下面是我使用openssl 做证书操作时,记录的常用命令用法。 1.生成密钥 生成RSA密钥,保存在file.key中,命令如下: 上面命令的含义是:产生RSA密钥,包括:私钥和公钥两部分,然后使用DES3算法,用用户输入的密码(passphrase)加密该密钥数据,保存在file.key中。 file.key默认以BASE64方式编码密钥数据,file.key的格式称为:PEM (Privacy Enhanced Mail)格式,在RFC 1421到RFC 1424中定义,PEM是早期用来进行安全电子邮件传输的标准,但现在广泛用在证书、证书请求、PKCS#7对象的存储上,所以证书文件也经常以.pem为扩展名。 2.不加密的密钥 如果在生成密钥时,使用了-des3等加密选项,则会生成被用户密码保护的加密密钥,以增强密钥数据的保密性(因为密钥文件中包含私钥部分)。但有时为了方便,需要不加密的明文密钥(这样安全性会降低),比如:使用

Apache的HTTPS服务,每次启动Apache服务时,都需要用户输入保护密钥的密码,感觉麻烦的话,可以使用明文密钥。 明文密钥可以使用不带-des3等加密选项的openssl命令生成,还可以使用以下命令将加密保护的密钥转换成明文密钥,当然转换过程需要用户输入原来的加密保护密码: 3.查看密钥 查看保存在file.key中的RSA密钥的细节,如果此文件是加密保护的,会提示用户输入加密此文件的密码,命令如下: 输出的内容均是RSA密钥数据的数学信息(模数、指数、质数等),从输出的结果中也可知file.key保存的RSA密钥数据包括:私钥和公钥两部分。 该命令也能查看其它工具生成的密钥,比如SSH,只要密钥文件符合openssl支持的格式。 4.生成证书请求 由file.key产生一个证书请求(Certificate Request),保证在file.csr 中,命令如下: 指定时,默认会访问Unix格式的默认路径:/usr/local/ssl/https://www.wendangku.net/doc/0b15793374.html,f。 创建证书请求时,会要求用户输入一些身份信息,示例如下:

openssl安装及使用

Openssl安装及使用 一软件 Windows下需要用到的软件 1.ActivePerl 一个perl脚本解释器。其包含了包括有Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套开发工具程序,可以让你编写出适用于unix,windows,linux系统的CGI程序来。安装的只是perl的一个解释程序啦,外观上也不会发生什么变化,你在windows的cmd界面里输入perl -v可查看你所安装的版本。 在你编译perl程序时会用到它。 2.C++编译器 编译器就是将“高级语言”翻译为“机器语言(低级语言)” 的程序。一个现代编译器的主要工作流程:源代码(source code) →预处理器(preprocessor) →编译器(compiler) →汇编程序(assembler) →目标代码(object code) →链接器(Linker) →可执行程序(executables)。c++编译器是一个与标准化C++高度兼容的编译环境。这点对于编译可移植的代码十分重要。编译器对不同的CPU会进行不同的优化。 3.OpenSSL OpenSSL是一个强大的安全套接字层密码库,Apache使用

它加密HTTPS,OpenSSH使用它加密SSH,它还是一个多用途的、跨平台的密码工具。 OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。 4.MASM 8.0 MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开发人员必须在windows下进行开发。8.0版本在编译OpenSSL的时候不容易出错。 用winrar解压缩MASMSetup.exe得到:setup.exe继续用winrar解压缩setup.exe 得到:vc_masm1.cab继续用winrar解压缩vc_masm1.cab得到:FL_ml_exe__..... (很长的文件名,省略),将这个文件重命名为ml.exe测试得到的ml.exe , 应该显示:Microsoft (R) Macro Assembler Version 8.00.50727.104将ml.exe 拷贝到工作目录,即可正常使用。 5.mspdb60.dll

linux下利用openssl来实现证书的颁发(详细步骤)

linux下利用openssl来实现证书的颁发(详细步骤) 1、首先需要安装openssl,一个开源的实现加解密和证书的专业系统。在centos下可以利用yum安装。 2、openssl的配置文件是https://www.wendangku.net/doc/0b15793374.html,f,我们一般就是用默认配置就可以。如果证书有特殊要求的话,可以修改配置适应需求。这样必须把相关的文件放到配置文件指定的目录下面。 3、首先需要利用openssl生成根证书,以后的服务器端证书或者客户端证书都用他来签发,可以建立多个根证书,就像对应不同的公司一样 #生成根证书的私钥 openssl genrsa -out /home/lengshan/ca.key #利用私钥生成一个根证书的申请,一般证书的申请格式都是csr。所以私钥和csr一般需要保存好openssl req -new -key /home/lengshan/ca.key -out /home/lengshan/ca.csr #自签名的方式签发我们之前的申请的证书,生成的证书为ca.crt openssl x509 -req -days 3650 -in /home/lengshan/ca.csr -signkey /home/lengshan/ca.key -out /home/lengshan/ca.crt #为我们的证书建立第一个序列号,一般都是用4个字符,这个不影响之后的证书颁发等操作 echo FACE > /home/lengshan/serial #建立ca的证书库,不影响后面的操作,默认配置文件里也有存储的地方 touch /home/lengshan/index.txt #建立证书回收列表保存失效的证书

Linux怎么使用OpenSSL命令行

Linux怎么使用OpenSSL命令行 OpenSSL是一款命令行工具可以用来做检测,加密解密等等,尤其在Linux中很实用。那么Linux要如何使用OpenSSL命令行呢?下面小编将针对OpenSSL命令行的使用给大家做个详细介绍。 Linux如何使用OpenSSL命令行 1. base64编码/解码 谈到命令行下如何发送邮件附件,很多人想起了uuencode。也可以使用base64编码。以下是openssl base64编码/解码的使用: $ openssl base64 《filename.bin 》filename.txt $ openssl base64 -d 《filename.txt 》filename.bin 2. 校验文件的一致性

UNIX下校验文件一致性的方法很多,比如sum、cksum、md5sum、sha1sum等。sum和cksum适用于简单校验的场合,生成的校验码容易重复。md5sum有安全漏洞,当前比较推荐的是sha1sum。不过sha1sum在不同的平台用法有些不同。考虑到跨平台性,建议用openssl。 $ openssl sha1 filename SHA1(filename)= e83a42b9bc8431a6645099be50b6341a35d3dceb $ openssl md5 filename MD5(filename)= 26e9855f8ad6a5906fea121283c729c4 3. 文件加密/解密 OpenSSL支持很多加密算法,不过一些算法只是为了保持向后兼容性,现在已不推荐使用,比如DES和RC4-40。推荐使用的加密算法是bf(Blowfish)和-aes-128-cbc(运行在CBC模式的128

openssl工具使用简介

openssl工具使用简介 1.私有密钥生成方法 生成私有密钥,可以使用不同的数字签名算法.下面分别介绍; #采用DSA算法 $ openssl dsaparam -noout -out dsakey0.pem -genkey 1024 #采用RSA算法 $ openssl genrsa -out rsakey0.pem 1024 #采用RSA算法,并使用密码保护.在生成私钥时,需要输入一个密码,用于保护私钥. #在使用这个私钥进行加/解密操作时,也需要输入这个密码. $ openssl genrsa -des3 -out rsakey1.pem 1024 2.公用密钥的生成方法 根据私钥来生成公钥 #生成dsa算法的公钥 $ openssl dsa -in dsakey0.pem -pubout -out dsakey0-pub.pem #生成rsa算法的公钥 $ openssl rsa -in rsakey0.pem -pubout -out rsakey0-pub.pem 3.自签名证书的生成方法 #产生DSA算法的证书 $ openssl req -x509 -key dsakey0.pem -days 365 -out mycert-dsa.pem -new #产生RSA算法的证书 $ openssl req -x509 -key rsakey0.pem -days 365 -out mycert-rsa.pem -new 4.使用证书进行邮件加密 我们的明文信件内容: $ cat test.txt 111111 222222 333333 444444 aaaaaa 使用证书对明文信件进行加密,输出到etest.txt文件: $ openssl smime -encrypt -in test.txt -out etest.txt mycert-rsa.pem 查看加密后的密文内容: $ cat etest.txt MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; smime-type=enveloped-data; name="smime.p7m" Content-Transfer-Encoding: base64 MIIBYAYJKoZIhvcNAQcDoIIBUTCCAU0CAQAxgewwgekCAQAwUjBFMQswCQYDVQQG EwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lk

openssl,CA证书生成命令集合

多级证书 平时我们自己签发CA证书再签发服务器证书的场景其实都非常简单。浏览器把自签CA导入后,就可以信任由这个CA直接签发的服务器证书。 但是实际上网站使用的证书肯定都不是由根CA直接签发的,比如 淘宝登陆服务器使用的证书。 我之前是自己写了脚本由自签CA直接签发服务器证书,为了真清楚的理解一下证书链的作用就直接使用openssl先签发2层的子CA,再由子CA去签发服务器证书。 手动签发证书的脚本如下: 生成自签CA # cat makerootca.sh #!/bin/bash DIR=/root/ssl.test2 mkdir -p $DIR/demoCA/{private,newcerts} touch $DIR/demoCA/index.txt echo 01 > $DIR/demoCA/serial opensslgenrsa -des3 -out $DIR/demoCA/private/cakey.pem 2048

opensslreq -new -x509 -days 3650 -key $DIR/demoCA/private/cakey.pem -out $DIR/demoCA/careq.pem 签发二级CA的脚本 https://www.wendangku.net/doc/0b15793374.html,f/root/ssl.test2 # cat no2domain.sh #!/bin/bash [ $# -ne 1 ] && echo "$0 NAME" && exit NAME=$1 DIR=/root/ssl.test2/autoget mkdir -p $DIR opensslgenrsa -des3 -out $DIR/$NAME.key 2048 openssl x509 -in $DIR/../demoCA/careq.pem -noout -text opensslrsa -in $DIR/$NAME.key -out $DIR/$NAME.key opensslreq -new -days 3650 -key $DIR/$NAME.key -out $DIR/$NAME.csr opensslca -extensions v3_ca -in $DIR/$NAME.csr -config $DIR/../https://www.wendangku.net/doc/0b15793374.html,f -days 3000 -out $DIR/$NAME.crt -cert $DIR/../demoCA/careq.pem -keyfile $DIR/../demoCA/private/cakey.pem 签发三级CA的脚本 # cat no3domain.sh #!/bin/bash #[ $# -ne 1 ] && echo "$0 NAME" && exit NAME=calv3 DIR=/root/ssl.test2/autoget opensslgenrsa -des3 -out $DIR/$NAME.key 2048

使用OPENSSL编写服务器和客户端代码实例

使用OPENSSL编写服务器和客户端代码实例使用相同的ca生成两个证书,一个是server.cer,一个是client.cer,注意生成server.cer的时候必须指明证书可以用于服务端的。 服务器代码: 1.#include "openssl/bio.h" 2.#include "openssl/ssl.h" 3.#include "openssl/err.h" 4. 5.#include 6. 7.#define EXIT_IF_TRUE(x) if (x) \ 8. do { \ 9. fprintf(stderr, "Check '%s' is true\n", #x); \ 10. ERR_print_errors_fp(stderr); \ 11. exit(2); \ 12. }while(0) 13. 14.int main(int argc, char **argv) 15.{ 16. SSL_CTX *ctx; 17. SSL *ssl; 18. X509 *client_cert; 19. 20. char szBuffer[1024]; 21. int nLen; 22. 23. struct sockaddr_in addr; 24. int len; 25. int nListenFd, nAcceptFd; 26. 27.// 初始化 28. cutil_init(); 29. cutil_log_set_level(LOG_ALL); 30. cutil_log_set_stderr(1);

31. SSLeay_add_ssl_algorithms(); 32. OpenSSL_add_all_algorithms(); 33. SSL_load_error_strings(); 34. ERR_load_BIO_strings(); 35. 36.// 我们使用SSL V3,V2 37. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL); 38. 39.// 要求校验对方证书 40. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 41. 42.// 加载CA的证书 43. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL)); 44. 45.// 加载自己的证书 46. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM ) <= 0) ; 47. 48.// 加载自己的私钥 49. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0) ; 50. 51.// 判定私钥是否正确 52. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx)); 53. 54.// 创建并等待连接 55. nListenFd = cutil_socket_new(SOCK_STREAM); 56. cutil_socket_bind(nListenFd, NULL, 8812, 1); 57. 58. memset(&addr, 0, sizeof(addr)); 59. len = sizeof(addr); 60. nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (size_t *)&len); 61. cutil_log_debug("Accept a connect from [%s:%d]\n", 62. inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); 63. 64.// 将连接付给SSL 65. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL); 66. SSL_set_fd (ssl, nAcceptFd); 67. EXIT_IF_TRUE( SSL_accept (ssl) != 1); 68. 69.// 进行操作 70. memset(szBuffer, 0, sizeof(szBuffer)); 71. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer)); 72. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);

OpenSSL介绍

标题:【翻译】(Ubuntu文档)OpenSSL 本文档用于介绍SSL应用层协议,特别是OpenSSL对SSL的实现。举例详细介绍了在Client-Server环境下OpenSSL的使用。最后,通过例子展示了如何在Apache上使用OpenSSL以提供Https服务。 读者应熟练使用命令行,bash,修改配置文件。 OpenSSL简介: SSL也即Secure Socket Layer,是由网景公司为了传输敏感数据而提出的协议。SSL使用私钥加密传输的数据,防止被窃听。SSL最普遍的使用适合和浏览器结合使用,但是其他很多的应用也可以使用SSL。一般而言,使用了SSL的URL以https开头。 OpenSSL是广泛使用的商业级SSL工具,由Eric A. Young和Tim J.Hudson开发的库SSLeay。 X.509是ITU-T发布的数字证书规范。它规定了确定个人或计算机系统身份确认所需的信息和属性,用于安全管理和发布英特网的数字签名证书。OpenSSL广泛应用X.509。 OpenSSL使用 安装:首先使用如下命令确定Ubuntu可用的SSL版本: apt-cache search libssl | grep SSL 应该看到如下结果: libssl0.9.6 - SSL shared libraries (old version) libssl-dev - SSL development libraries, header files and documentation libssl0.9.7 - SSL shared libraries 可能还需要安装ca-certificate. 若需要OpenSSL的通用库,还需安装libssl-dev. 基本OpenSSL命令 确定OpenSSL的版本: openssl verion OpenSSL的可用命令: openssl help 为查找某一命令的帮助,在命令后加-h,如 openssl enc -h 列出所有可用的加密算法: openssl ciphers -v 使用openssl speed可以查看本机的openssl速度,查看每个算法美妙的加密字节数,以及sign/verify的时间 SSL证书 该部分介绍SSL证书的产生,包括用于支持SSL的服务应用的自签名和公认签名,以及用于客户程序的X.509签名。 服务器SSL证书 生成X.509证书后,有三种方式进行签名:自签名,生成CA以及由公认的CA机构签名。证书签名后,便可用于OpenSSL、连接LDAP的SSL通道以及HTTP服务器。该部分用于介绍证书的生成和签名。 生成并自签名证书

openssl 编程入门(含完整示例)

openssl编程入门(含完整示例) 易剑 1.编写目的 第一次跑起openssl示例并不太简单,本文的目的是为了让这个过程变得非常简单。在开始之前,要非常感谢周立发同学,正是通过他共享的示例,较轻松的入了门。本文档对他共享的示例中的一个小错误进行了修正,并提供了傻瓜式的“编译-生成-KEY运行”一条龙脚本(方法请参见压缩包中的readme文件),让跑第一个openssl程序变得轻轻松松。 2.示例包 ssl_test.tar.gz openssl-0.9.8h-Su SE10.tar.gz ssl_test.tar.gz为示例源代码包,openssl-0.9.8h-SuSE10.tar.gz为openssl二进制包,测试时是安装在/usr/local/ssl。 ssl_test.tar.gz中的示例在SuSE10中测试通过,使用的是openssl-0.9.8h,它包括如下文件: -rw-r--r--1root root1346Dec518:11cacert.pem -rwxr-xr-x1root root114Dec518:11make_key.sh -rwxr-xr-x1root root172Dec518:37mk_client.sh -rwxr-xr-x1root root172Dec518:37mk_server.sh -rw-r--r--1root root1679Dec518:11privkey.pem -rw-r--r--1root root167Dec518:39readme -rwxr-xr-x1root root38Dec518:38run_client.sh -rwxr-xr-x1root root64Dec518:38run_server.sh -rwxr-xr-x1root root1140142Dec518:38ssl_client -rw-r--r--1root root3928Dec517:31ssl_client.cpp -rwxr-xr-x1root root1139667Dec518:38ssl_server -rw-r--r--1root root4882Dec517:31ssl_server.cpp readme为包内容说明,run_server.sh用来运行服务端,run_client.sh用来运行客户端,mk_server.sh用来编译服务端,mk_client.sh用来编译客户端,make_key.sh用来生成钥匙KEY。

使用OpenSSLAPI进行安全编程

使用OpenSSL API 进行安全编程 创建基本的安全连接和非安全连接 Kenneth Ballard (kenneth.ballard@https://www.wendangku.net/doc/0b15793374.html,), 自由程序员 简介:学习如何使用 OpenSSL ——用于安全通信的最著名的开放库——的API 有些强人所难,因为其文档并不完全。您可以通过本文中的提示补充这方面的知识,并驾驭该 API。在建立基本的连接之后,就可以查看如何使用 OpenSSL 的 BIO 库来建立安全连接和非安全连接。与此同时,您还会学到一些关于错误检测的知识。 OpenSSL API 的文档有些含糊不清。因为还没有多少关于 OpenSSL 使用的教程,所以对初学者来说,在应用程序中使用它可能会有一些困难。那么怎样才能使用 OpenSSL 实现一个基本的安全连接呢?本教程将帮助您解决这个问题。 学习如何实现 OpenSSL 的困难部分在于其文档的不完全。不完全的 API 文档通常会妨碍开发人员使用该 API,而这通常意味着它注定要失败。但 OpenSSL 仍然很活跃,而且正逐渐变得强大。这是为什么? OpenSSL 是用于安全通信的最著名的开放库。在 google 中搜索“SSL library”得到的返回结果中,列表最上方就是 OpenSSL。它诞生于 1998 年,源自 Eric Young 和 Tim Hudson 开发的 SSLeay 库。其他 SSL 工具包包括遵循 GNU General Public License 发行的 GNU TLS,以及 Mozilla Network Security Services(NSS)(请参阅本文后面的参考资料,以获得其他信息)。 那么,是什么使得 OpenSSL 比 GNU TLS、Mozilla NSS 或其他所有的库都优越呢?许可是一方面因素(请参阅参考资料)。此外,GNS TLS(迄今为止)只支持 TLS v1.0 和 SSL v3.0 协议,仅此而已。 Mozilla NSS 的发行既遵循 Mozilla Public License 又遵循 GNU GPL,它允许开发人员进行选择。不过,Mozilla NSS 比 OpenSSL 大,并且需要其他外部库来对库进行编译,而 OpenSSL 是完全自包含的。与 OpenSSL 相同,大部分 NSS API 也没有文档资料。Mozilla NSS 获得了 PKCS #11 支持,该支持可以用于诸如智能卡这样的加密标志。OpenSSL 就不具备这一支持。 先决条件 要充分理解并利用本文,您应该: ?精通 C 编程。 ?熟悉 Internet 通信和支持 Internet 的应用程序的编写。

Linux下OpenSSL客户端中使用req命令来生成证书的教程

Linux下OpenSSL客户端中使用req命令来生成证书的教程作者:Gordon0918 字体:[增加减小] 来源:开源中文社区时间:04-22 11:56:58?我要评论这篇文章主要介绍了Linux下OpenSSL客户端中使用req命令来生成证书的教程,详细讲解了自动生成密钥和生成自签名证书的方法,需要的朋友可以参考下 openssl req 用于生成证书请求,以让第三方权威机构CA来签发,生成我们需要的证书。req 命令也可以调用x509命令,以进行格式转换及显示证书文件中的text,modulus等信息。如果你还没有密钥对,req命令可以一统帮你生成密钥对和证书请求,也可以指定是否对私钥文件进行加密。 1、密钥、证书请求、证书概要说明 在证书申请签发过程中,客户端涉及到密钥、证书请求、证书这几个概念,初学者可能会搞不清楚三者的关系,网上有的根据后缀名来区分三者,更让人一头雾水。我们以申请证书的流程说明三者的关系。客户端(相对于CA)在申请证书的时候,大体上有三个步骤: 第一步:生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有。 第二步:以客户端的密钥和客户端自身的信息(国家、机构、域名、邮箱等)为输入,生成证书请求文件。其中客户端的公钥和客户端信息是明文保存在证书请求文件中的,而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给CA机构。 第三步:CA机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后CA机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。此证书就是客户端的身份证,来表明用户的身份。 至此客户端申请证书流程结束,其中涉及到证书签发机构CA,CA是被绝对信任的机构。如果把客户端证书比作用户身份证,那么CA就是颁发身份证的机构,我们以https为例说明证书的用处。 为了数据传输安全,越来越多的网站启用https。在https握手阶段,服务器首先把自己的证书发送给用户(浏览器),浏览器查看证书中的发证机构,然后在机器内置的证书中(在PC或者手机上,内置了世界上著名的CA机构的证书)查找对应CA证书,然后使用内置的证书公钥校验服

Openssl各目录说明

Openssl 目录名功能描述 Crypto 存放OpenSSL 所有加密算法源码文件 和相关标注如X.509 源码文件,是 OpenSSL 中最重要的目录,包含了 OpenSSL 密码算法库的所有内容。SSL 存放OpenSSL 中SSL 协议各个版本和 TLS 1.0 协议源码文件,包含了 OpenSSL 协议库的所有内容。 Apps 存放OpenSSL 中所有应用程序源码文 件,如CA、X509 等应用程序的源文 件就存放在这里。 Doc 存放了OpenSSL 中所有的使用说明文 档,包含三个部分:应用程序说明文档、 加密算法库API说明文档以及SSL 协 议API 说明文档。 Demos 存放了一些基于OpenSSL 的应用程序 例子,这些例子一般都很简单,演示怎 么使用OpenSSL其中的一个功能。Include 存放了使用OpenSSL 的库时需要的头 文件。 Test 存放了OpenSSL 自身功能测试程序的 源码文件 OpenSSL算法目录 openSSL 的算法目录Crypto 目录包含了OpenSSL 密码算法库的所有源代码文件,是OpenSSL 中最重要的目录之一。OpenSSL 的密码算法库包含了

OpenSSL 中所有密码算法、密钥管理和证书管理相关标准的实现,在Windows 下编译后的库文件名为libeay32.lib,在Linux 下编译后生产的库文件名为libcrypto.a。Crypto 目录下包含了众多的子目录,这些目录大多数以相关的算法或标准名称的简写命名。当然,并非所有这些目录存放的源文件都是密码算法和标准,有些是OpenSSL 本身的一些相关功能文件,如BIO、DSO 和EVP 等。 Crypto子目录列表 Aes 对称算法,美国新的对称加密算法标准 AES 算法源码。 Bf 对称算法,Blowfish 对称加密算法源 码。 Cast 对称算法,CAST 对称加密算法源码。Des 对称算法,包括了DES 和3DES 对称 加密算法源码。 Idea 对称算法,IDEA 对称加密算法源码。Rc2 对称算法,RC2 对称加密算法源码。Rc4 对称算法,RC4 对称加密算法源码 Rc5 对称算法,RC5 对称加密算法源码。Dh 非对称算法,DH 非对称密钥交换算法 源码。 Dsa 非对称算法,DSA 非对称算法源码, 用于数字签名。 Ec 非对称算法,EC 椭圆曲线算法源码。Rsa 非对称算法,RSA 非对称加密算法源 码,既可以用于密钥交换,也可以用于 数字签名。 Md2 信息摘要算法,MD2 信息摘要算法源 码。 Md5 信息摘要算法,MD5 信息摘要算法源 码。 Mdc2 信息摘要算法,MDC2 信息摘要算法源

OpenSSL程序编写步骤

OpenSSL程序编写步骤 OpenSSL是一个开放源代码的SSL协议的产品实现,它采用C语言作为开发语言,具备了跨系统的性能。调用OpenSSL 的函数就可以实现一个SSL加密的安全数据传输通道,从而保护客户端和服务器之间数据的安全。 头文件: #include #include 基于OpenSSL的程序都要遵循以下几个步骤: (1 ) OpenSSL初始化 在使用OpenSSL之前,必须进行相应的协议初始化工作,这可以通过下面的函数实现: int SSL_library_int(void); (2 ) 选择会话协议 在利用OpenSSL开始SSL会话之前,需要为客户端和服务器制定本次会话采用的协议,目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。 需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。 (3 ) 创建会话环境 在OpenSSL中创建的SSL会话环境称为CTX,使用不同的协议会话,其环境也不一样的。 申请SSL会话环境的OpenSSL函数是: SSL_CTX *SSL_CTX_new(SSL_METHOD * method); 当SSL会话环境申请成功后,还要根据实际的需要设置CTX的属性,通常的设置是指定SSL 握手阶段证书的验证方式和加载自己的证书。 制定证书验证方式的函数是: int SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));

相关文档