2013年5月3日 星期五

Openssl VC++ 程式設計


廢話不轉貼了,可以去原帖看(雖然也不是最原始的帖子)

1.客戶端程序的框架為:

/*生成一個SSL結構*/
meth = SSLv23_client_method();
ctx = SSL_CTX_new (meth);
ssl = SSL_new(ctx); //移至驗證完,握手前。

/*下面是正常的socket過程*/
fd = socket();
connect();


/*接著進行客戶端驗證*/
SSL_CTX_set_cipher_list(ctx,"RC4-MD5"); //可做可不做,此操作只是增加優先度。試過mark仍然能進行握手


void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*callback)(int, X509_STORE_CTX *));
缺省mode是SSL_VERIFY_NONE,如果想要驗證對方的話,便要將此項變成SSL_VERIFY_PEER.SSL/TLS中不驗證server,如果沒有設置 SSL_VERIFY_PEER的話,客戶端連證書都不會發過來.

int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,const char *CApath);
要驗證對方的話,當然裝要有CA的證書了,此函數用來便是加載CA的證書文件的.

int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
加載自己的證書文件.

int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);
加載自己的私鑰,以用於簽名.

int SSL_CTX_check_private_key(SSL_CTX *ctx);

調用了以上兩個函數後,自己檢驗一下證書與私鑰是否配對.

/*把已經驗證過的ctx傳進去SSL_new()  重要!! 文中的code範例也是這樣做的,否則Server會出現No shared cipher  的ERROR ,Client 會出 sharkhand failure 的ERROR。*/
ssl = SSL_new(ctx);

/*把建立好的socket和SSL結構聯繫起來*/
SSL_set_fd(ssl,fd);

/*SSL的握手過程*/
SSL_connect(ssl);

/*接下來用SSL_write(), SSL_read()代替原有的write(),read()即可*/
SSL_write(ssl,"Hello world",strlen("Hello World!"));



2.服務端程序的框架為:
/*生成一個SSL結構*/
meth = SSLv23_server_method();
ctx = SSL_CTX_new (meth);
ssl = SSL_new(ctx); //移至驗證完,握手前。

/*下面是正常的socket過程*/
fd = socket();
bind();
listen();
accept();

/*接著進行服務端驗證*/
SSL_CTX_set_cipher_list(ctx,"RC4-MD5"); //可做可不做,此操作只是增加優先度。試過mark仍然能進行握手

void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*callback)(int, X509_STORE_CTX *));
缺省mode是SSL_VERIFY_NONE,如果想要驗證對方的話,便要將此項變成SSL_VERIFY_PEER.SSL/TLS中不驗證server,如果沒有設置 SSL_VERIFY_PEER的話,客戶端連證書都不會發過來.

int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,const char *CApath);
要驗證對方的話,當然裝要有CA的證書了,此函數用來便是加載CA的證書文件的.

int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
加載自己的證書文件.

int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);
加載自己的私鑰,以用於簽名.

int SSL_CTX_check_private_key(SSL_CTX *ctx);

調用了以上兩個函數後,自己檢驗一下證書與私鑰是否配對.

/*把已經驗證過的ctx傳進去SSL_new()  重要!! 文中的code範例也是這樣做的,否則Server會出現"No shared cipher"  的ERROR ,Client 會出 sharkhand failure 的ERROR。*/
ssl = SSL_new(ctx);



/*把建立好的socket和SSL結構聯繫起來*/
SSL_set_fd(ssl,fd);

/*SSL的握手過程*/
SSL_connect(ssl); //Server還想 connect誰啊 !!調用此函數直接出錯 "called a function you should not call" 請調用以下SSL_accept函數。
SSL_accept (ssl); 

/*接下來用SSL_write(), SSL_read()代替原有的write(),read()即可*/
SSL_read (ssl, buf, sizeof(buf));

###########################################################
openssl編程,這篇講得算詳細,可惜流程有點問題,
(想說code都能編譯,就自己照著流程寫code.
結果被打臉 ...)
以及生成證書的部分也不完全,(筆者會慢慢補上)
增加了不少閱讀量 ... ...,
無法只參考這篇就完成。
不過範例是能直接運行,
出錯能相互比對跟自己撰寫的code差在哪,
或直接改它的code使用也行。

Source: http://blog.csdn.net/hwz119/article/details/1534252


沒有留言:

張貼留言