openssl 自定義生成證書和私鑰並使用

2021-07-03 09:28:17 字數 3044 閱讀 7237

這裡以生成客戶端證書和金鑰檔案為例,目的是建立乙個加密的安全的tcp連線

1 生成金鑰檔案

命令:openssl genrsa -des3 -out pk.pem 2048 

會提示輸入金鑰短語,輸入後還會讓輸入確認

2 生成證書檔案

openssl req -new -x509 -key pk.pem -out ca.pem -days 365

驗證**片段:

// logout

#include #include "openssl/ossl_typ.h"

#include "openssl/bio.h"

#include "openssl/ssl.h"

#include "openssl/err.h"

#include "kksock.h"

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

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

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

class csslclient

;

// **裡的ckksock為乙個封裝的select模型的類,也可以使用原生的socket,執行阻塞或非阻塞操作

#include "sslclient.h"

#include #include using namespace std;

csslclient::csslclient()

csslclient::~csslclient()

void csslclient::reset()

if(m_pctx)

m_tcpsocket.close();

} void csslclient::initssl()

bool csslclient::doconnect()

; if (getmodulefilename(null, szpath, max_path) == 0)

for (int i = strlen(szpath); i > 0; i--)

}char szcapath[max_path + 1] = ;

char szpkpath[max_path + 1] = ;

strcpy(szcapath, szpath);

strcpy(szpkpath, szpath);

strcat(szcapath, "\\ca.pem");

strcat(szpkpath, "\\pk.pem");

if (!ssl_ctx_use_certificate_file(m_pctx, szcapath, ssl_filetype_pem))

break;

// 驗證密碼檔案

bio* pkeybuff = bio_new_file(szpkpath, "r");

if(null == pkeybuff)

//ssl_ctx_set_default_passwd_cb_userdata

char szpwd[16] = "111111";

evp_pkey *pkey = pem_read_bio_privatekey(pkeybuff, null, null, szpwd);

if(pkey==null)

int nrettmp = ssl_ctx_use_privatekey(m_pctx, pkey);

if (nrettmp <= 0)

bool bconnect = m_tcpsocket.connectex("10.1.8.26", 10156, 3000);

if (!bconnect)

break;

/* an ssl structure is created */

m_pssl = ssl_new(m_pctx);

if(!m_pssl)

if(ssl_get_verify_result(m_pssl) != x509_v_ok)

/* assign the socket into the ssl structure (ssl and socket without bio) */

ssl_set_fd(m_pssl, m_tcpsocket.m_sock);

ssl_set_mode(m_pssl, ssl_mode_auto_retry);

/* perform ssl handshake on the ssl client */

dword dwnow = gettickcount();

while ((nrettmp = ssl_connect(m_pssl)) <= 0)

; err_error_string(err_get_error(), szerrmsg);

printf("err msg: %s\n", szerrmsg);

printf("lasterr: %d \n", nlasterr);

break;

}sleep(10);

} printf("nrettmp = %d\n", nrettmp); //if nrettmp > 0 means connect success

bret = true;

char szreadbuffer[2048] = ;

while (true)

; err_error_string(err_get_error(), szerrmsg);

printf("err msg: %s\n", szerrmsg);

int nlasterr = ssl_get_error(m_pssl, nrettmp);

if (nlasterr != ssl_error_want_read && nlasterr != ssl_error_want_write)

}else

sleep(100);

} } while (false);

return bret;

}

Python 自定義生成器

在python中,一邊迴圈一邊計算的機制,稱為生成器 generator 通過yeild 表示式定義生成器 yield一次返回乙個結果,並且會凍結當前函式的狀態 def my gen yield 1 yield 2 yield 3next函式可以迭代生成器的返回值 生成器其實也是迭代器也是可迭代物件...

vs工程 生成事件 自定義生成步驟

cocos2dx 的 win32 工程,會自動把 resources 目錄下的內容拷貝到 debug.win32 目錄下 這樣一來在除錯 尤其是除錯指令碼時就不太方便。想取消這一步驟的話,可以在工程右鍵 自定義生成步驟 命令列 裡面做修改。原本的內容是 if not exist outdir mkd...

自定義生產省略號

overflow hidden text overflow ellipsis display webkit box webkit line clamp 2 webkit box orient vertical 解析 webkit line clamp 限制在乙個塊元素顯示的文字的行數。為了實現該效果...