廢話不轉貼了,可以去原帖看(雖然也不是最原始的帖子)
1.客戶端程序的框架為:
/*生成一個SSL結構*/
meth = SSLv23_client_method();
ctx = SSL_CTX_new (meth);
/*下面是正常的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);
/*下面是正常的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_accept (ssl);
/*接下來用SSL_write(), SSL_read()代替原有的write(),read()即可*/
SSL_read (ssl, buf, sizeof(buf));
###########################################################
openssl編程,這篇講得算詳細,可惜流程有點問題,
以及生成證書的部分也不完全,(筆者會慢慢補上)
增加了不少閱讀量 ... ...,
無法只參考這篇就完成。
不過範例是能直接運行,
出錯能相互比對跟自己撰寫的code差在哪,
或直接改它的code使用也行。
Source: http://blog.csdn.net/hwz119/article/details/1534252
沒有留言:
張貼留言