{"id":1193,"date":"2014-09-05T16:02:00","date_gmt":"2014-09-05T08:02:00","guid":{"rendered":"http:\/\/wx.wosign.com\/?p=1193"},"modified":"2014-09-05T16:06:23","modified_gmt":"2014-09-05T08:06:23","slug":"ssl%e8%bf%9e%e6%8e%a5%e5%bb%ba%e7%ab%8b%e8%bf%87%e7%a8%8b%e5%88%86%e6%9e%901-mengfanrong","status":"publish","type":"post","link":"https:\/\/wx.wosign.com\/?p=1193","title":{"rendered":"SSL\u8fde\u63a5\u5efa\u7acb\u8fc7\u7a0b\u5206\u6790(1) &#8211; mengfanrong"},"content":{"rendered":"<p><b><strong><a href=\"https:\/\/hack0nair.me\/2014-08-14-nginx-with-ssl-of-wosign\/\" target=\"_blank\">Https\u534f\u8bae<\/a>:SSL\u5efa\u7acb\u8fc7\u7a0b\u5206\u6790<\/strong><\/b><\/p>\n<p><b><strong>web\u8a2a\u95ee\u7684\u4e24\u79cd\u65b9\u5f0f<\/strong><\/b>\u00a0:<\/p>\n<p><b><strong>http\u534f\u8bae<\/strong><\/b>\u00a0,\u6211\u4eec\u666e\u901a\u60c5\u51b5\u4e0b\u662f\u901a\u8fc7\u5b83\u8a2a\u95eeweb,\u7531\u4e8e\u5b83\u4e0d\u8981\u6c42\u592a\u591a\u7684\u5b89\u5168\u673a\u5236,\u4f7f\u7528\u8d77\u6765\u4e5f\u7b80\u5355,\u975e\u5e38\u591aweb\u7f51\u7ad9\u4e5f\u4ec5\u4ec5\u652f\u6301\u8fd9\u6837\u7684\u65b9\u5f0f\u4e0b\u7684\u8a2a\u95ee.<\/p>\n<p><b><strong>https\u534f\u8bae<\/strong><\/b>\u00a0(Hypertext Transfer Protocol over Secure Socket Layer),\u5bf9\u4e8e\u5b89\u5168\u6027\u8981\u6c42\u6bd4\u8f03\u9ad8\u7684\u60c5\u51b5,\u80fd\u591f\u901a\u8fc7\u5b83\u8a2a\u95eeweb,\u6bd4\u65b9\u5de5\u5546\u94f6\u884c\u00a0<b><i><a href=\"https:\/\/www.icbc.com.cn\/icbc\/\">https:\/\/www.icbc.com.cn\/icbc\/\u00a0<\/a><\/i><\/b>(\u5f53\u7136\u4e5f\u80fd\u591f\u901a\u8fc7http\u534f\u8bae\u8a2a\u95ee,\u4ec5\u4ec5\u662f\u6ca1\u90a3\u4e48\u5b89\u5168\u4e86).\u5176\u5b89\u5168\u57fa\u7840\u662fSSL\u534f\u8bae.<\/p>\n<p><a href=\"https:\/\/www.wosign.com\/products\/ssl.htm\" target=\"_blank\"><b><strong>SSL\u534f\u8bae<\/strong><\/b><\/a>\u00a0,\u5f53\u524d\u7248\u672c\u53f7\u4e3a3.1(SSL3.1\u5c31\u662fTLS1.0)\u3002\u5b83\u5df2\u88ab\u5e7f\u6cdb\u5730\u7528\u4e8eWeb\u6d4f\u89c8\u5668\u4e0eserver\u4e4b\u95f4\u7684\u8eab\u4efd\u8ba4\u8bc1\u548c\u52a0\u5bc6\u4f20\u8f93\u6570\u636e.\u5b83\u4f4d\u4e8eTCP\/IP\u534f\u8bae\u4e0e\u5404\u79cd\u5e94\u7528\u5c42\u534f\u8bae\u4e4b\u95f4\uff0c\u4e3a\u6570\u636e\u901a\u8baf\u63d0\u4f9b\u5b89\u5168\u652f\u6301\u3002SSL\u534f\u8bae\u53ef\u5206\u4e3a\u4e24\u5c42\uff1a SSL\u8bb0\u5f55\u534f\u8bae\uff08SSL Record Protocol\uff09\uff1a\u5b83\u5efa\u7acb\u5728\u53ef\u9760\u7684\u4f20\u8f93\u534f\u8bae\uff08\u5982TCP\uff09\u4e4b\u4e0a\uff0c\u4e3a\u9ad8\u5c42\u534f\u8bae\u63d0\u4f9b\u6570\u636e\u5c01\u88c5\u3001\u538b\u7f29\u3001\u52a0\u5bc6\u7b49\u57fa\u672c\u529f\u80fd\u7684\u652f\u6301\u3002 SSL\u63e1\u624b\u534f\u8bae\uff08SSL Handshake Protocol\uff09\uff1a\u5b83\u5efa\u7acb\u5728SSL\u8bb0\u5f55\u534f\u8bae\u4e4b\u4e0a\uff0c\u7528\u4e8e\u5728\u5b9e\u9645\u7684\u4f20\u8f93\u6570\u636e\u958b\u59cb\u524d\uff0c\u901a\u8baf\u4e24\u65b9\u8fdb\u884c\u8eab\u4efd\u8ba4\u8bc1\u3001\u534f\u5546\u52a0\u5bc6\u7b97\u6cd5\u3001\u4ea4\u6362\u52a0\u5bc6\u5bc6\u94a5\u7b49\u3002<\/p>\n<p>\u4e3a\u4e86\u4e86\u89e3\u5177\u4f53\u8fc7\u7a0b,\u80fd\u591f\u901a\u8fc7\u7f51\u7edc\u6293\u5305\u5de5\u5177(Commview,Iris)\u5206\u6790https\u534f\u8bae,SSL\u8fde\u63a5\u5efa\u7acb\u8fc7\u7a0b\u4e2d,\u6570\u636e\u5305\u4ea4\u6362\u60c5\u51b5.<\/p>\n<p><b><strong>\u6570\u636e\u5305\u5206\u6790\u8fc7\u7a0b\u7528\u5230\u7684\u51e0\u4e2a\u56fe.<\/strong><\/b><\/p>\n<p>\u56fe,SSL Protocol Stack<\/p>\n<p><a href=\"http:\/\/wx.wosign.com\/wp-content\/uploads\/2014\/09\/bA7Ffy.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1198 aligncenter\" src=\"http:\/\/wx.wosign.com\/wp-content\/uploads\/2014\/09\/bA7Ffy.gif\" alt=\"bA7Ffy\" width=\"400\" height=\"256\" \/><\/a><\/p>\n<p>\u56fe.SSL Record Format<\/p>\n<p><a href=\"http:\/\/wx.wosign.com\/wp-content\/uploads\/2014\/09\/2ABBzi.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1196 aligncenter\" src=\"http:\/\/wx.wosign.com\/wp-content\/uploads\/2014\/09\/2ABBzi.gif\" alt=\"2ABBzi\" width=\"400\" height=\"334\" \/><\/a><\/p>\n<p>\u56fe.SSL Record Protocol Payload<\/p>\n<p><a href=\"http:\/\/wx.wosign.com\/wp-content\/uploads\/2014\/09\/7ZzYra1.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1201 aligncenter\" src=\"http:\/\/wx.wosign.com\/wp-content\/uploads\/2014\/09\/7ZzYra1.gif\" alt=\"7ZzYra\" width=\"500\" height=\"138\" \/><\/a><\/p>\n<p><b><strong>\u56fe.Handshake Protocol Action<\/strong><\/b><\/p>\n<p><a href=\"http:\/\/wx.wosign.com\/wp-content\/uploads\/2014\/09\/uMv22a.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1199 aligncenter\" src=\"http:\/\/wx.wosign.com\/wp-content\/uploads\/2014\/09\/uMv22a.gif\" alt=\"uMv22a\" width=\"500\" height=\"623\" \/><\/a><\/p>\n<p>\u5b83\u4eec\u6765\u4e4b.\u00a0Cryptography and Network Security Principles and Practices, Fourth Edition-Chapter 17. Web Security-17.2. Secure Socket Layer and Transport Layer Security(password\u5b66\u4e0e\u7f51\u7edc\u5b89\u5168 \u539f\u7406\u4e0e\u5b9e\u8df5\u7b2c\u56db\u7248,17\u7ae0web\u5b89\u5168,17.2\u8282,SSL\u4e0eTLS)\u8be6\u7ec6\u7ec6\u8282\u53c3\u8003\u672c\u4e66.<\/p>\n<p>\u4ee5\u4e0b\u8ddf\u8e2a\u63e1\u624b\u8fc7\u7a0b(\u56fe\u00a0<b><strong>Handshake Protocol Action<\/strong><\/b>\u00a0)\u4e2d,\u6570\u636e\u5305\u7684\u4ea4\u6362.<\/p>\n<p>\u4ee5\u4e3ahttps\u65b9\u5f0f\u8a2a\u95ee\u00a0<b><i><a href=\"http:\/\/www.sun.com\/\">www.sun.com\u00a0<\/a><\/i><\/b>\u4e3a\u6837\u4f8b,\u4e00\u822c\u5927\u578b\u516c\u53f8,\u94f6\u884c\u7684web\u90fd\u652f\u6301https\u8a2a\u95ee,\u5982\u5de5\u5546\u94f6\u884c,sun,\u5fae\u8f6f,IBM.<\/p>\n<p>\u5728IE\u4e2d\u8f93\u5165:https:\/\/wwww.sun.com,\u7531\u4e8e\u8fd9\u662fhttps\u534f\u8bae,\u6240\u4ee5\u5728\u5b9e\u9645\u8a2a\u95eeweb\u524d,\u4f1a\u5efa\u7acbSSL\u8fde\u63a5.<\/p>\n<p>\u901a\u8fc7Commview\u6293\u5305\u5de5\u5177,\u8fc7\u6ee4443port(\u666e\u901a\u60c5\u51b5\u4e0b,HTTPS\u4f7f\u7528\u00a0<b><i><a href=\"http:\/\/baike.baidu.com\/view\/1075.htm\">port\u00a0<\/a><\/i><\/b>443\uff0cHTTP\u4f7f\u7528port80)\u80fd\u591f\u5f97\u5230\u6570\u636e\u5305.<\/p>\n<p>\u6570\u636e\u5305\u5927\u81f4\u60c5\u51b5\u548c(\u56fe\u00a0<b><strong>Handshake Protocol Action)<\/strong><\/b>\u00a0\u76f8\u5e94\u00a0<b><strong>.<\/strong><\/b><\/p>\n<p>SSL\u8fde\u63a5\u5efa\u7acb\u8fc7\u7a0b\u5206\u6790(1)<\/p>\n<p>1. \u5e94\u7528\u7a0b\u5e8f\u63a5\u53e3<\/p>\n<p>1.1 SSL\u521d\u59cb\u5316<\/p>\n<p>SSL_CTX* InitSSL(int server, char *cert, char *key, char *pw)<\/p>\n<p>{<\/p>\n<p>SSL_CTX* ctx;<\/p>\n<p>SSL_METHOD *meth;<\/p>\n<p>int status;<\/p>\n<p>\/\/ \u7b97\u6cd5\u521d\u59cb\u5316<\/p>\n<p>\/\/ \u8f7d\u5165SSL\u9519\u8bef\u4fe1\u606f<\/p>\n<p>SSL_load_error_strings();<\/p>\n<p>\/\/ \u52a0\u5165SSL\u7684\u52a0\u5bc6\/HASH\u7b97\u6cd5<\/p>\n<p>SSLeay_add_ssl_algorithms();<\/p>\n<p>\/\/ \u670d\u52a1\u5668\u8fd8\u662f\u5ba2\u6237\u7aef<\/p>\n<p>If(server)<\/p>\n<p>meth = SSLv23_server_method();<\/p>\n<p>else<\/p>\n<p>meth = SSLv23_client_method();<\/p>\n<p>\/\/ \u5efa\u7acb\u65b0\u7684SSL\u4e0a\u4e0b\u6587<\/p>\n<p>ctx = SSL_CTX_new (meth);<\/p>\n<p>if(!ctx) return NULL;<\/p>\n<p>\/\/ \u8bbe\u7f6e\u8bc1\u4e66\u6587\u4ef6\u7684\u53e3\u4ee4<\/p>\n<p>SSL_CTX_set_default_passwd_cb_userdata(ctx, pw);<\/p>\n<p>\/\/\u8f7d\u5165\u672c\u5730\u8bc1\u4e66\u6587\u4ef6<\/p>\n<p>status=SSL_CTX_use_certificate_file(ctx, cert, SSL_FILETYPE_ASN1);<\/p>\n<p>if (status &lt;= 0) {<\/p>\n<p>frintf(stderr, &#8220;Use cert fail, status=%d\/n&#8221;, status);<\/p>\n<p>goto bad;<\/p>\n<p>}<\/p>\n<p>\/\/ \u8f7d\u5165\u79c1\u94a5\u6587\u4ef6<\/p>\n<p>if (SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM) &lt;= 0) {<\/p>\n<p>fprintf(stderr, &#8220;Use private key fail\/n&#8221;);<\/p>\n<p>goto bad;<\/p>\n<p>}<\/p>\n<p>\/\/ \u68c0\u67e5\u8bc1\u4e66\u548c\u79c1\u94a5\u662f\u5426\u5339\u914d<\/p>\n<p>if (!SSL_CTX_check_private_key(ctx)) {<\/p>\n<p>fprintf(&#8220;Private key does not match the certificate public key\/n&#8221;);<\/p>\n<p>goto bad;<\/p>\n<p>}<\/p>\n<p>fprintf(&#8220;Cert and key OK\/n&#8221;);<\/p>\n<p>return ctx;<\/p>\n<p>bad:<\/p>\n<p>SSL_CTX_free (ctx);<\/p>\n<p>return NULL;<\/p>\n<p>}<\/p>\n<p>1.2 \u5efa\u7acbSSL\u65b0\u8fde\u63a5<\/p>\n<p>server\uff1a<\/p>\n<p>\/\/ \u5efa\u7acbSSL<\/p>\n<p>ssl = SSL_new (ctx);<\/p>\n<p>\/\/ \u5c06SSL\u4e0eTCP socket\u8fde\u63a5<\/p>\n<p>SSL_set_fd (ssl, sd);<\/p>\n<p>\/\/\u63a5\u53d7\u65b0SSL\u8fde\u63a5<\/p>\n<p>err = SSL_accept (ssl);<\/p>\n<p>client\uff1a<\/p>\n<p>\/\/ \u5efa\u7acbSSL<\/p>\n<p>ssl = SSL_new (ctx);<\/p>\n<p>\/\/ \u5c06SSL\u4e0eTCP socket\u8fde\u63a5<\/p>\n<p>SSL_set_fd (ssl, sd);<\/p>\n<p>\/\/ SSL\u8fde\u63a5<\/p>\n<p>err = SSL_connect (ssl);<\/p>\n<p>server\u7684SSL_accept()\u548cclient\u7684SSL_connect()\u51fd\u6570\u5171\u540c\u5b8c\u6bd5SSL\u7684\u63e1\u624b\u534f\u5546\u8fc7\u7a0b\u3002<\/p>\n<p>1.3 SSL\u901a\u4fe1<\/p>\n<p>\u548c\u666e\u901a\u7684read()\/write()\u8c03\u7528\u4e00\u6837\uff0c\u7528\u4ee5\u4e0b\u7684\u51fd\u6570\u5b8c\u6bd5\u6570\u636e\u7684SSL\u53d1\u9001\u548c\u63a5\u6536\uff0c\u51fd\u6570\u8f93\u5165\u6570\u636e\u662f\u660e\u6587\uff0cSSL\u81ea\u5df1\u4e3b\u52a8\u5c06\u6570\u636e\u5c01\u88c5\u8fdbSSL\u4e2d\uff1a<\/p>\n<p>\u8bfb\/\u63a5\u6536\uff1aSSL_read() \u5199\/\u53d1\u9001\uff1aSSL_write()<\/p>\n<p>1.4 SSL\u91ca\u653e<\/p>\n<p>SSL\u91ca\u653e\u975e\u5e38easy\uff1a<\/p>\n<p>SSL_free (ssl);<\/p>\n<p>2. SSL\u5b9e\u73b0\u5206\u6790<\/p>\n<p>\u4e0b\u9762SSL\u6e90\u7801\u53d6\u81eaopenssl-0.9.7b\u3002<\/p>\n<p>2.1 SSL_load_error_strings<\/p>\n<p>\u8be5\u51fd\u6570\u8f7d\u5165\u9519\u8bef\u5b57\u7b26\u4e32\u4fe1\u606f\uff1a<\/p>\n<p>void SSL_load_error_strings(void)<\/p>\n<p>{<\/p>\n<p>#ifndef OPENSSL_NO_ERR<\/p>\n<p>ERR_load_crypto_strings();<\/p>\n<p>ERR_load_SSL_strings();<\/p>\n<p>#endif<\/p>\n<p>}<\/p>\n<p>\u6700\u540e\u5c06\u4f1a\u8fdb\u5165\u51fd\u6570\uff1a<\/p>\n<p>static void err_load_strings(int lib, ERR_STRING_DATA *str)<\/p>\n<p>{<\/p>\n<p>while (str-&gt;error)<\/p>\n<p>{<\/p>\n<p>str-&gt;error|=ERR_PACK(lib,0,0);<\/p>\n<p>ERRFN(err_set_item)(str);<\/p>\n<p>str++;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>\u5f53\u4e2d\uff1a<\/p>\n<p>#define ERR_PACK(l,f,r)\u00a0\u00a0(((((unsigned long)l)&amp;0xffL)*0x1000000)| \/<\/p>\n<p>((((unsigned long)f)&amp;0xfffL)*0x1000)| \/<\/p>\n<p>((((unsigned long)r)&amp;0xfffL)))<\/p>\n<p>#define ERRFN(a) err_fns-&gt;cb_##a<\/p>\n<p>ERRFN(err_set_item)(str)\u7684\u5b9e\u9645\u51fd\u6570\u5b9e\u73b0\u4e3a\uff1a<\/p>\n<p>static ERR_STRING_DATA *int_err_set_item(ERR_STRING_DATA *d)<\/p>\n<p>{<\/p>\n<p>ERR_STRING_DATA *p;<\/p>\n<p>LHASH *hash;<\/p>\n<p>err_fns_check();<\/p>\n<p>hash = ERRFN(err_get)(1);<\/p>\n<p>if (!hash)<\/p>\n<p>return NULL;<\/p>\n<p>CRYPTO_w_lock(CRYPTO_LOCK_ERR);<\/p>\n<p>p = (ERR_STRING_DATA *)lh_insert(hash, d);<\/p>\n<p>CRYPTO_w_unlock(CRYPTO_LOCK_ERR);<\/p>\n<p>return p; }<\/p>\n<p>Lh_insert()\u5c06\u9519\u8bef\u4fe1\u606f\u63d2\u5165\u5230\u4e00\u4e2a\u94fe\u8868\u4e2d<\/p>\n<p>\u5982\u5173\u4e8e\u52a0\u5bc6\u7b97\u6cd5\u7684\u9519\u8bef\u4fe1\u606f\uff1a<\/p>\n<p>\/* crypto\/err\/err.c *\/<\/p>\n<p>static ERR_STRING_DATA ERR_str_functs[]=<\/p>\n<p>\u2026\u2026<\/p>\n<p>static ERR_STRING_DATA ERR_str_libraries[]=<\/p>\n<p>\u2026\u2026<\/p>\n<p>static ERR_STRING_DATA ERR_str_reasons[]=<\/p>\n<p>\u2026\u2026<\/p>\n<p>2.2 SSLeay_add_ssl_algorithms()<\/p>\n<p>\u8fd9\u5b9e\u9645\u662f\u4e2a\u5b8f\uff1a<\/p>\n<p>#define OpenSSL_add_ssl_algorithms()\u00a0\u00a0\u00a0 SSL_library_init()<\/p>\n<p>#define SSLeay_add_ssl_algorithms() SSL_library_init()<\/p>\n<p>\u5b9e\u9645\u51fd\u6570\u4e3aSSL_library_init()\uff0c\u51fd\u6570\u6bd4\u8f03\u7b80\u5355\uff0c\u5c31\u662f\u8f7d\u5165\u5404\u79cd\u52a0\u5bc6\u548cHASH\u7b97\u6cd5\uff1a<\/p>\n<p>\/* ssl\/ssl_algs.c *\/<\/p>\n<p>int SSL_library_init(void)<\/p>\n<p>{<\/p>\n<p>#ifndef OPENSSL_NO_DES<\/p>\n<p>EVP_add_cipher(EVP_des_cbc());<\/p>\n<p>EVP_add_cipher(EVP_des_ede3_cbc());<\/p>\n<p>#endif<\/p>\n<p>#ifndef OPENSSL_NO_IDEA<\/p>\n<p>EVP_add_cipher(EVP_idea_cbc());<\/p>\n<p>#endif<\/p>\n<p>#ifndef OPENSSL_NO_RC4<\/p>\n<p>EVP_add_cipher(EVP_rc4());<\/p>\n<p>#endif<\/p>\n<p>#ifndef OPENSSL_NO_RC2<\/p>\n<p>EVP_add_cipher(EVP_rc2_cbc());<\/p>\n<p>#endif<\/p>\n<p>#ifndef OPENSSL_NO_AES<\/p>\n<p>EVP_add_cipher(EVP_aes_128_cbc());<\/p>\n<p>EVP_add_cipher(EVP_aes_192_cbc());<\/p>\n<p>EVP_add_cipher(EVP_aes_256_cbc());<\/p>\n<p>#endif<\/p>\n<p>#ifndef OPENSSL_NO_MD2<\/p>\n<p>EVP_add_digest(EVP_md2());<\/p>\n<p>#endif<\/p>\n<p>#ifndef OPENSSL_NO_MD5<\/p>\n<p>EVP_add_digest(EVP_md5());<\/p>\n<p>EVP_add_digest_alias(SN_md5,&#8221;ssl2-md5&#8243;);<\/p>\n<p>EVP_add_digest_alias(SN_md5,&#8221;ssl3-md5&#8243;);<\/p>\n<p>#endif<\/p>\n<p>#ifndef OPENSSL_NO_SHA<\/p>\n<p>EVP_add_digest(EVP_sha1()); \/* RSA with sha1 *\/<\/p>\n<p>EVP_add_digest_alias(SN_sha1,&#8221;ssl3-sha1&#8243;);<\/p>\n<p>EVP_add_digest_alias(SN_sha1WithRSAEncryption,SN_sha1WithRSA);<\/p>\n<p>#endif<\/p>\n<p>#if !defined(OPENSSL_NO_SHA) &amp;&amp; !defined(OPENSSL_NO_DSA)<\/p>\n<p>EVP_add_digest(EVP_dss1()); \/* DSA with sha1 *\/<\/p>\n<p>EVP_add_digest_alias(SN_dsaWithSHA1,SN_dsaWithSHA1_2);<\/p>\n<p>EVP_add_digest_alias(SN_dsaWithSHA1,&#8221;DSS1&#8243;);<\/p>\n<p>EVP_add_digest_alias(SN_dsaWithSHA1,&#8221;dss1&#8243;);<\/p>\n<p>#endif<\/p>\n<p>\/* If you want support for phased out ciphers, add the following *\/<\/p>\n<p>#if 0<\/p>\n<p>EVP_add_digest(EVP_sha());<\/p>\n<p>EVP_add_digest(EVP_dss());<\/p>\n<p>#endif<\/p>\n<p>return(1);<\/p>\n<p>}<\/p>\n<p>2.3 SSL23_server_method()<\/p>\n<p>\u5efa\u7acb\u670d\u52a1\u5668\u7aef\u7684\u65b9\u6cd5\u5e93\uff0c\u8fd9\u662f\u4e2a\u901a\u7528\u51fd\u6570\uff0c\u53ef\u52a8\u6001\u9009\u62e9SSL\u534f\u8bae\u3002\u5047\u8bbe\u60f3\u56fa\u5b9a\u534f\u8bae\uff0c\u80fd\u591f\u4ec5\u4ec5\u7528SSLv2_server_method(), SSLv3_server_method() \u7b49\u51fd\u6570\u6765\u521d\u59cb\u5316\uff0c\u8be5\u51fd\u6570\u8fd4\u56de\u4e00\u4e2aSSL_METHOD\u7ed3\u6784\uff1a<\/p>\n<p>\/* ssl\/ssl.h *\/<\/p>\n<p>\/* Used to hold functions for SSLv2 or SSLv3\/TLSv1 functions *\/<\/p>\n<p>typedef struct ssl_method_st<\/p>\n<p>{<\/p>\n<p>int version; \/\/ \u7248\u672c\u53f7\u53f7<\/p>\n<p>int (*ssl_new)(SSL *s); \/\/ \u5efa\u7acb\u65b0SSL<\/p>\n<p>void (*ssl_clear)(SSL *s); \/\/ \u6e05\u9664SSL<\/p>\n<p>void (*ssl_free)(SSL *s);\u00a0 \/\/ \u91ca\u653eSSL<\/p>\n<p>int (*ssl_accept)(SSL *s); \/\/ server\u63a5\u53d7SSL\u8fde\u63a5<\/p>\n<p>int (*ssl_connect)(SSL *s); \/\/ client\u7684SSL\u8fde\u63a5<\/p>\n<p>int (*ssl_read)(SSL *s,void *buf,int len); \/\/ SSL\u8bfb<\/p>\n<p>int (*ssl_peek)(SSL *s,void *buf,int len); \/\/ SSL\u67e5\u770b\u6570\u636e<\/p>\n<p>int (*ssl_write)(SSL *s,const void *buf,int len); \/\/ SSL\u5199<\/p>\n<p>int (*ssl_shutdown)(SSL *s); \/\/ SSL\u534a\u5173\u95ed<\/p>\n<p>int (*ssl_renegotiate)(SSL *s); \/\/ SSL\u91cd\u534f\u5546<\/p>\n<p>int (*ssl_renegotiate_check)(SSL *s); \/\/ SSL\u91cd\u534f\u5546\u68c0\u67e5<\/p>\n<p>long (*ssl_ctrl)(SSL *s,int cmd,long larg,void *parg); \/\/ SSL\u63a7\u5236<\/p>\n<p>long (*ssl_ctx_ctrl)(SSL_CTX *ctx,int cmd,long larg,void *parg); \/\/SSL\u4e0a\u4e0b\u6587\u63a7\u5236<\/p>\n<p>SSL_CIPHER *(*get_cipher_by_char)(const unsigned char *ptr); \/\/ \u901a\u8fc7\u540d\u79f0\u83b7\u53d6SSL\u7684\u7b97\u6cd5<\/p>\n<p>int (*put_cipher_by_char)(const SSL_CIPHER *cipher,unsigned char *ptr);<\/p>\n<p>int (*ssl_pending)(SSL *s);<\/p>\n<p>int (*num_ciphers)(void); \/\/ \u7b97\u6cd5\u6570<\/p>\n<p>SSL_CIPHER *(*get_cipher)(unsigned ncipher); \/\/ \u83b7\u53d6\u7b97\u6cd5<\/p>\n<p>struct ssl_method_st *(*get_ssl_method)(int version);<\/p>\n<p>long (*get_timeout)(void); \/\/ \u8d85\u65f6<\/p>\n<p>struct ssl3_enc_method *ssl3_enc; \/* Extra SSLv3\/TLS stuff *\/ \/\/ SSL3\u52a0\u5bc6<\/p>\n<p>int (*ssl_version)(); \/\/ SSL\u7248\u672c\u53f7<\/p>\n<p>long (*ssl_callback_ctrl)(SSL *s, int cb_id, void (*fp)()); \/\/ SSL\u63a7\u5236\u56de\u8c03\u51fd\u6570<\/p>\n<p>long (*ssl_ctx_callback_ctrl)(SSL_CTX *s, int cb_id, void (*fp)()); \/\/SSL\u4e0a\u4e0b\u6587\u63a7\u5236\u56de\u8c03\u51fd\u6570<\/p>\n<p>} SSL_METHOD;<\/p>\n<p>\/* ssl\/s23_srvr.c *\/<\/p>\n<p>SSL_METHOD *SSLv23_server_method(void)<\/p>\n<p>{<\/p>\n<p>static int init=1;<\/p>\n<p>\/\/ \u9759\u6001\u91cf\uff0c\u6bcf\u4e00\u4e2a\u8fdb\u7a0b\u4ec5\u4ec5\u521d\u59cb\u5316\u4e00\u6b21<\/p>\n<p>static SSL_METHOD SSLv23_server_data;<\/p>\n<p>if (init)<\/p>\n<p>{<\/p>\n<p>CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);<\/p>\n<p>if (init)<\/p>\n<p>{<\/p>\n<p>\/\/ ssl23\u7684\u57fa\u672c\u65b9\u6cd5\u7ed3\u6784<\/p>\n<p>memcpy((char *)&amp;SSLv23_server_data,<\/p>\n<p>(char *)sslv23_base_method(),sizeof(SSL_METHOD));<\/p>\n<p>\/\/ \u670d\u52a1\u5668,\u6240\u4ee5\u8981\u5b9a\u4e49accept\u65b9\u6cd5<\/p>\n<p>SSLv23_server_data.ssl_accept=ssl23_accept;<\/p>\n<p>\/\/ \u4f9d\u636eSSL\u7684\u7248\u672c\u53f7\u8bbe\u7f6eSSL\u7684\u8be6\u7ec6\u65b9\u6cd5\u51fd\u6570<\/p>\n<p>SSLv23_server_data.get_ssl_method=ssl23_get_server_method;<\/p>\n<p>init=0;<\/p>\n<p>}<\/p>\n<p>CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);<\/p>\n<p>}<\/p>\n<p>return(&amp;SSLv23_server_data);<\/p>\n<p>}<\/p>\n<p>static SSL_METHOD *ssl23_get_server_method(int ver)<\/p>\n<p>{<\/p>\n<p>#ifndef OPENSSL_NO_SSL2<\/p>\n<p>if (ver == SSL2_VERSION)<\/p>\n<p>return(SSLv2_server_method());<\/p>\n<p>#endif<\/p>\n<p>if (ver == SSL3_VERSION)<\/p>\n<p>return(SSLv3_server_method());<\/p>\n<p>else if (ver == TLS1_VERSION)<\/p>\n<p>return(TLSv1_server_method());<\/p>\n<p>\/\/ \u968f\u7740TLS1.1(RFC4346)\u7684\u63a8\u51fa\uff0c\u9884\u8ba1\u4e0d\u4e45\u5c06\u51fa\u73b0TLSv1_1_server_method()<\/p>\n<p>else<\/p>\n<p>return(NULL);<\/p>\n<p>}<\/p>\n<p>\/\/ SSL23\u7684\u65b9\u6cd5\u57fa\u672c\u6570\u636e\u5b9a\u4e49<\/p>\n<p>\/* ssl\/s23_lib.c *\/<\/p>\n<p>SSL_METHOD *sslv23_base_method(void)<\/p>\n<p>{<\/p>\n<p>return(&amp;SSLv23_data);<\/p>\n<p>}<\/p>\n<p>static SSL_METHOD SSLv23_data= {<\/p>\n<p>TLS1_VERSION,<\/p>\n<p>tls1_new,<\/p>\n<p>tls1_clear,<\/p>\n<p>tls1_free,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl23_read,<\/p>\n<p>ssl23_peek,<\/p>\n<p>ssl23_write,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl_ok,<\/p>\n<p>ssl3_ctrl,<\/p>\n<p>ssl3_ctx_ctrl,<\/p>\n<p>ssl23_get_cipher_by_char,<\/p>\n<p>ssl23_put_cipher_by_char,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl23_num_ciphers,<\/p>\n<p>ssl23_get_cipher,<\/p>\n<p>ssl_bad_method,<\/p>\n<p>ssl23_default_timeout,<\/p>\n<p>&amp;ssl3_undef_enc_method,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl3_callback_ctrl,<\/p>\n<p>ssl3_ctx_callback_ctrl,<\/p>\n<p>};<\/p>\n<p>\u4ee5SSL3\u7684server\u65b9\u6cd5\u51fd\u6570\u4e3a\u4f8b\uff0c\u5176\u5b83\u65b9\u6cd5\u76f8\u4f3c\uff1a<\/p>\n<p>\/* ssl\/s3_srvr.c *\/<\/p>\n<p>SSL_METHOD *SSLv3_server_method(void)<\/p>\n<p>{<\/p>\n<p>static int init=1;<\/p>\n<p>static SSL_METHOD SSLv3_server_data;<\/p>\n<p>\/\/ \u4ec5\u4ec5\u521d\u59cb\u5316\u4e00\u6b21<\/p>\n<p>if (init)<\/p>\n<p>{<\/p>\n<p>CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);<\/p>\n<p>if (init)<\/p>\n<p>{<\/p>\n<p>\/\/ ssl3\u7684\u57fa\u672c\u65b9\u6cd5\u7ed3\u6784<\/p>\n<p>memcpy((char *)&amp;SSLv3_server_data,(char *)sslv3_base_method(),<\/p>\n<p>sizeof(SSL_METHOD));<\/p>\n<p>\/\/ ssl3\u7684\u63a5\u53d7\u65b9\u6cd5<\/p>\n<p>SSLv3_server_data.ssl_accept=ssl3_accept;<\/p>\n<p>\/\/ ssl3\u83b7\u53d6\u670d\u52a1\u5668\u7684\u65b9\u6cd5\u51fd\u6570<\/p>\n<p>SSLv3_server_data.get_ssl_method=ssl3_get_server_method;<\/p>\n<p>init=0;<\/p>\n<p>}<\/p>\n<p>CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);<\/p>\n<p>}<\/p>\n<p>return(&amp;SSLv3_server_data);<\/p>\n<p>}<\/p>\n<p>\/\/ SSL3\u7684\u65b9\u6cd5\u57fa\u672c\u6570\u636e\u5b9a\u4e49<\/p>\n<p>\/* ssl\/s3_lib.c *\/<\/p>\n<p>static SSL_METHOD SSLv3_data= {<\/p>\n<p>SSL3_VERSION,<\/p>\n<p>ssl3_new,<\/p>\n<p>ssl3_clear,<\/p>\n<p>ssl3_free,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl3_read,<\/p>\n<p>ssl3_peek,<\/p>\n<p>ssl3_write,<\/p>\n<p>ssl3_shutdown,<\/p>\n<p>ssl3_renegotiate,<\/p>\n<p>ssl3_renegotiate_check,<\/p>\n<p>ssl3_ctrl,<\/p>\n<p>ssl3_ctx_ctrl,<\/p>\n<p>ssl3_get_cipher_by_char,<\/p>\n<p>ssl3_put_cipher_by_char,<\/p>\n<p>ssl3_pending,<\/p>\n<p>ssl3_num_ciphers,<\/p>\n<p>ssl3_get_cipher,<\/p>\n<p>ssl_bad_method,<\/p>\n<p>ssl3_default_timeout,<\/p>\n<p>&amp;SSLv3_enc_data,<\/p>\n<p>ssl_undefined_function,<\/p>\n<p>ssl3_callback_ctrl,<\/p>\n<p>ssl3_ctx_callback_ctrl,<\/p>\n<p>};<\/p>\n<p>2.4 SSL23_client_method()<\/p>\n<p>\u548cserver\u7aef\u7684\u4e8b\u5b9e\u4e0a\u662f\u540c\u6837\u7684\uff0c\u4ec5\u4ec5\u662f\u4e0d\u5b9a\u4e49\u7ed3\u6784\u4e2d\u7684ssl_accept\u800c\u662f\u5b9a\u4e49ssl_connnect\uff1a<\/p>\n<p>SSL_METHOD *SSLv23_client_method(void)<\/p>\n<p>{<\/p>\n<p>static int init=1;<\/p>\n<p>static SSL_METHOD SSLv23_client_data;<\/p>\n<p>if (init)<\/p>\n<p>{<\/p>\n<p>CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);<\/p>\n<p>if (init)<\/p>\n<p>{<\/p>\n<p>memcpy((char *)&amp;SSLv23_client_data,<\/p>\n<p>(char *)sslv23_base_method(),sizeof(SSL_METHOD));<\/p>\n<p>SSLv23_client_data.ssl_connect=ssl23_connect;<\/p>\n<p>SSLv23_client_data.get_ssl_method=ssl23_get_client_method;<\/p>\n<p>init=0;<\/p>\n<p>}<\/p>\n<p>CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);<\/p>\n<p>}<\/p>\n<p>return(&amp;SSLv23_client_data);<\/p>\n<p>}<\/p>\n<p>2.5 SSL_CTX_new ()<\/p>\n<p>\u8be5\u51fd\u6570\u4f9d\u636eSSL\u65b9\u6cd5\u83b7\u53d6\u4e00\u4e2aSSL\u4e0a\u4e0b\u6587\u7ed3\u6784\uff0c\u8be5\u7ed3\u6784\u5b9a\u4e49\u4e3a\uff1a<\/p>\n<p>\/* ssl\/ssl.h *\/<\/p>\n<p>struct ssl_ctx_st<\/p>\n<p>{<\/p>\n<p>SSL_METHOD *method;<\/p>\n<p>STACK_OF(SSL_CIPHER) *cipher_list;<\/p>\n<p>\/* same as above but sorted for lookup *\/<\/p>\n<p>STACK_OF(SSL_CIPHER) *cipher_list_by_id;<\/p>\n<p>struct x509_store_st \/* X509_STORE *\/ *cert_store;<\/p>\n<p>struct lhash_st \/* LHASH *\/ *sessions;\u00a0\/* a set of SSL_SESSIONs *\/<\/p>\n<p>\/* Most session-ids that will be cached, default is<\/p>\n<p>* SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. *\/<\/p>\n<p>unsigned long session_cache_size;<\/p>\n<p>struct ssl_session_st *session_cache_head;<\/p>\n<p>struct ssl_session_st *session_cache_tail;<\/p>\n<p>\/* This can have one of 2 values, ored together,<\/p>\n<p>* SSL_SESS_CACHE_CLIENT,<\/p>\n<p>* SSL_SESS_CACHE_SERVER,<\/p>\n<p>* Default is SSL_SESSION_CACHE_SERVER, which means only<\/p>\n<p>* SSL_accept which cache SSL_SESSIONS. *\/<\/p>\n<p>int session_cache_mode;<\/p>\n<p>\/* If timeout is not 0, it is the default timeout value set<\/p>\n<p>* when SSL_new() is called.\u00a0 This has been put in to make<\/p>\n<p>* life easier to set things up *\/<\/p>\n<p>long session_timeout;<\/p>\n<p>\/* If this callback is not null, it will be called each<\/p>\n<p>* time a session id is added to the cache.\u00a0 If this function<\/p>\n<p>* returns 1, it means that the callback will do a<\/p>\n<p>* SSL_SESSION_free() when it has finished using it.\u00a0 Otherwise,<\/p>\n<p>* on 0, it means the callback has finished with it.<\/p>\n<p>* If remove_session_cb is not null, it will be called when<\/p>\n<p>* a session-id is removed from the cache.\u00a0 After the call,<\/p>\n<p>* OpenSSL will SSL_SESSION_free() it. *\/<\/p>\n<p>int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess);<\/p>\n<p>void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess);<\/p>\n<p>SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl,<\/p>\n<p>unsigned char *data,int len,int *copy);<\/p>\n<p>struct<\/p>\n<p>{<\/p>\n<p>int sess_connect;\u00a0\/* SSL new conn &#8211; started *\/<\/p>\n<p>int sess_connect_renegotiate;\/* SSL reneg &#8211; requested *\/<\/p>\n<p>int sess_connect_good;\u00a0\/* SSL new conne\/reneg &#8211; finished *\/<\/p>\n<p>int sess_accept;\u00a0\/* SSL new accept &#8211; started *\/<\/p>\n<p>int sess_accept_renegotiate;\/* SSL reneg &#8211; requested *\/<\/p>\n<p>int sess_accept_good;\u00a0\/* SSL accept\/reneg &#8211; finished *\/<\/p>\n<p>int sess_miss;\u00a0\u00a0\/* session lookup misses\u00a0 *\/<\/p>\n<p>int sess_timeout;\u00a0\/* reuse attempt on timeouted session *\/<\/p>\n<p>int sess_cache_full;\u00a0\/* session removed due to full cache *\/<\/p>\n<p>int sess_hit;\u00a0\u00a0\/* session reuse actually done *\/<\/p>\n<p>int sess_cb_hit;\u00a0\/* session-id that was not<\/p>\n<p>* in the cache was<\/p>\n<p>* passed back via the callback.\u00a0 This<\/p>\n<p>* indicates that the application is<\/p>\n<p>* supplying session-id&#8217;s from other<\/p>\n<p>* processes &#8211; spooky \ud83d\ude42 *\/<\/p>\n<p>} stats;<\/p>\n<p>int references;<\/p>\n<p>\/* if defined, these override the X509_verify_cert() calls *\/<\/p>\n<p>int (*app_verify_callback)(X509_STORE_CTX *, void *);<\/p>\n<p>void *app_verify_arg;<\/p>\n<p>\/* before OpenSSL 0.9.7, &#8216;app_verify_arg&#8217; was ignored<\/p>\n<p>* (&#8216;app_verify_callback&#8217; was called with just one argument) *\/<\/p>\n<p>\/* Default password callback. *\/ pem_password_cb *default_passwd_callback;<\/p>\n<p>\/* Default password callback user data. *\/ void *default_passwd_callback_userdata;<\/p>\n<p>\/* get client cert callback *\/ int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey);<\/p>\n<p>CRYPTO_EX_DATA ex_data;<\/p>\n<p>const EVP_MD *rsa_md5;\/* For SSLv2 &#8211; name is &#8216;ssl2-md5&#8217; *\/<\/p>\n<p>const EVP_MD *md5;\u00a0\/* For SSLv3\/TLSv1 &#8216;ssl3-md5&#8217; *\/<\/p>\n<p>const EVP_MD *sha1;\u00a0\u00a0 \/* For SSLv3\/TLSv1 &#8216;ssl3-&gt;sha1&#8217; *\/<\/p>\n<p>STACK_OF(X509) *extra_certs; STACK_OF(SSL_COMP) *comp_methods; \/* stack of SSL_COMP, SSLv3\/TLSv1 *\/<\/p>\n<p>\/* Default values used when no per-SSL value is defined follow *\/<\/p>\n<p>void (*info_callback)(const SSL *ssl,int type,int val); \/* used if SSL&#8217;s info_callback is NULL *\/<\/p>\n<p>\/* what we put in client cert requests *\/ STACK_OF(X509_NAME) *client_CA;<\/p>\n<p>\/* Default values to use in SSL structures follow (these are copied by SSL_new) *\/<\/p>\n<p>unsigned long options;<\/p>\n<p>unsigned long mode;<\/p>\n<p>long max_cert_list;<\/p>\n<p>struct cert_st \/* CERT *\/ *cert; int read_ahead;<\/p>\n<p>\/* callback that allows applications to peek at protocol messages *\/<\/p>\n<p>void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);<\/p>\n<p>void *msg_callback_arg;<\/p>\n<p>int verify_mode;<\/p>\n<p>int verify_depth;<\/p>\n<p>unsigned int sid_ctx_length;<\/p>\n<p>unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];<\/p>\n<p>int (*default_verify_callback)(int ok,X509_STORE_CTX *ctx); \/* called &#8216;verify_callback&#8217; in the SSL *\/<\/p>\n<p>\/* Default generate session ID callback. *\/ GEN_SESSION_CB generate_session_id;<\/p>\n<p>int purpose;\u00a0\u00a0\/* Purpose setting *\/ int trust;\u00a0\u00a0\/* Trust setting *\/<\/p>\n<p>int quiet_shutdown; };<\/p>\n<p>typedef struct ssl_ctx_st SSL_CTX;<\/p>\n<p>\/* ssl\/ssl_lib.h *\/<\/p>\n<p>SSL_CTX *SSL_CTX_new(SSL_METHOD *meth)<\/p>\n<p>{<\/p>\n<p>SSL_CTX *ret=NULL;<\/p>\n<p>if (meth == NULL)<\/p>\n<p>{<\/p>\n<p>SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_NULL_SSL_METHOD_PASSED);<\/p>\n<p>return(NULL);<\/p>\n<p>}<\/p>\n<p>if (SSL_get_ex_data_X509_STORE_CTX_idx() &lt; 0)<\/p>\n<p>{<\/p>\n<p>SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_X509_VERIFICATION_SETUP_PROBLEMS);<\/p>\n<p>goto err;<\/p>\n<p>}<\/p>\n<p>\/\/ \u5206\u914d\u4e0a\u4e0b\u6587\u7684\u5185\u5b58\u7a7a\u95f4<\/p>\n<p>ret=(SSL_CTX *)OPENSSL_malloc(sizeof(SSL_CTX));<\/p>\n<p>if (ret == NULL)<\/p>\n<p>goto err;<\/p>\n<p>memset(ret,0,sizeof(SSL_CTX));<\/p>\n<p>\/\/ \u521d\u59cb\u5316\u4e0a\u4e0b\u6587\u7684\u7ed3\u6784\u53c3\u6570 ret-&gt;method=meth;<\/p>\n<p>ret-&gt;cert_store=NULL;<\/p>\n<p>ret-&gt;session_cache_mode=SSL_SESS_CACHE_SERVER;<\/p>\n<p>ret-&gt;session_cache_size=SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;<\/p>\n<p>ret-&gt;session_cache_head=NULL;<\/p>\n<p>ret-&gt;session_cache_tail=NULL;<\/p>\n<p>\/* We take the system default *\/ ret-&gt;session_timeout=meth-&gt;get_timeout();<\/p>\n<p>ret-&gt;new_session_cb=0;<\/p>\n<p>ret-&gt;remove_session_cb=0;<\/p>\n<p>ret-&gt;get_session_cb=0;<\/p>\n<p>ret-&gt;generate_session_id=0;<\/p>\n<p>memset((char *)&amp;ret-&gt;stats,0,sizeof(ret-&gt;stats));<\/p>\n<p>ret-&gt;references=1; ret-&gt;quiet_shutdown=0;<\/p>\n<p>\/*\u00a0ret-&gt;cipher=NULL;*\/<\/p>\n<p>\/*\u00a0ret-&gt;s2-&gt;challenge=NULL;<\/p>\n<p>ret-&gt;master_key=NULL;<\/p>\n<p>ret-&gt;key_arg=NULL;<\/p>\n<p>ret-&gt;s2-&gt;conn_id=NULL; *\/<\/p>\n<p>ret-&gt;info_callback=NULL;<\/p>\n<p>ret-&gt;app_verify_callback=0; ret-&gt;app_verify_arg=NULL;<\/p>\n<p>ret-&gt;max_cert_list=SSL_MAX_CERT_LIST_DEFAULT;<\/p>\n<p>ret-&gt;read_ahead=0;<\/p>\n<p>ret-&gt;msg_callback=0;<\/p>\n<p>ret-&gt;msg_callback_arg=NULL;<\/p>\n<p>ret-&gt;verify_mode=SSL_VERIFY_NONE;<\/p>\n<p>ret-&gt;verify_depth=-1; \/* Don&#8217;t impose a limit (but x509_lu.c does) *\/<\/p>\n<p>ret-&gt;sid_ctx_length=0;<\/p>\n<p>ret-&gt;default_verify_callback=NULL;<\/p>\n<p>if ((ret-&gt;cert=ssl_cert_new()) == NULL)<\/p>\n<p>goto err;<\/p>\n<p>ret-&gt;default_passwd_callback=0;<\/p>\n<p>ret-&gt;default_passwd_callback_userdata=NULL;<\/p>\n<p>ret-&gt;client_cert_cb=0;<\/p>\n<p>ret-&gt;sessions=lh_new(LHASH_HASH_FN(SSL_SESSION_hash),<\/p>\n<p>LHASH_COMP_FN(SSL_SESSION_cmp));<\/p>\n<p>if (ret-&gt;sessions == NULL) goto err;<\/p>\n<p>ret-&gt;cert_store=X509_STORE_new();<\/p>\n<p>if (ret-&gt;cert_store == NULL) goto err;<\/p>\n<p>\/\/ \u5efa\u7acb\u52a0\u5bc6\u7b97\u6cd5\u94fe\u8868<\/p>\n<p>ssl_create_cipher_list(ret-&gt;method,<\/p>\n<p>&amp;ret-&gt;cipher_list,&amp;ret-&gt;cipher_list_by_id,<\/p>\n<p>SSL_DEFAULT_CIPHER_LIST);<\/p>\n<p>if (ret-&gt;cipher_list == NULL<\/p>\n<p>|| sk_SSL_CIPHER_num(ret-&gt;cipher_list) &lt;= 0)<\/p>\n<p>{<\/p>\n<p>SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_LIBRARY_HAS_NO_CIPHERS);<\/p>\n<p>goto err2;<\/p>\n<p>}<\/p>\n<p>\/\/ \u5b9a\u4e49\u4e0a\u4e0b\u6587\u7ed3\u6784\u4e2dHASH\u7b97\u6cd5<\/p>\n<p>if ((ret-&gt;rsa_md5=EVP_get_digestbyname(&#8220;ssl2-md5&#8221;)) == NULL)<\/p>\n<p>{<\/p>\n<p>SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES);<\/p>\n<p>goto err2;<\/p>\n<p>}<\/p>\n<p>if ((ret-&gt;md5=EVP_get_digestbyname(&#8220;ssl3-md5&#8221;)) == NULL)<\/p>\n<p>{<\/p>\n<p>SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES);<\/p>\n<p>goto err2;<\/p>\n<p>}<\/p>\n<p>if ((ret-&gt;sha1=EVP_get_digestbyname(&#8220;ssl3-sha1&#8221;)) == NULL)<\/p>\n<p>{<\/p>\n<p>SSLerr(SSL_F_SSL_CTX_NEW,SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES);<\/p>\n<p>goto err2;<\/p>\n<p>}<\/p>\n<p>if ((ret-&gt;client_CA=sk_X509_NAME_new_null()) == NULL) goto err;<\/p>\n<p>CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &amp;ret-&gt;ex_data);<\/p>\n<p>ret-&gt;extra_certs=NULL;<\/p>\n<p>\/\/ \u538b\u7f29\u7b97\u6cd5<\/p>\n<p>ret-&gt;comp_methods=SSL_COMP_get_compression_methods();<\/p>\n<p>return(ret);<\/p>\n<p>err:<\/p>\n<p>SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE);<\/p>\n<p>err2:<\/p>\n<p>if (ret != NULL) SSL_CTX_free(ret);<\/p>\n<p>return(NULL);<\/p>\n<p>}<\/p>\n<p>&#8230;\u5f85\u7eed&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Https\u534f\u8bae:SSL\u5efa\u7acb\u8fc7\u7a0b\u5206\u6790 web\u8a2a\u95ee\u7684\u4e24\u79cd\u65b9\u5f0f\u00a0: http\u534f\u8bae\u00a0,\u6211\u4eec\u666e\u901a\u60c5\u51b5\u4e0b\u662f\u901a\u8fc7\u5b83\u8a2a\u95eeweb &#8230; <a title=\"SSL\u8fde\u63a5\u5efa\u7acb\u8fc7\u7a0b\u5206\u6790(1) &#8211; mengfanrong\" class=\"read-more\" href=\"https:\/\/wx.wosign.com\/?p=1193\" aria-label=\"More on SSL\u8fde\u63a5\u5efa\u7acb\u8fc7\u7a0b\u5206\u6790(1) &#8211; mengfanrong\">Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"https:\/\/wx.wosign.com\/index.php?rest_route=\/wp\/v2\/posts\/1193"}],"collection":[{"href":"https:\/\/wx.wosign.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wx.wosign.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wx.wosign.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/wx.wosign.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1193"}],"version-history":[{"count":3,"href":"https:\/\/wx.wosign.com\/index.php?rest_route=\/wp\/v2\/posts\/1193\/revisions"}],"predecessor-version":[{"id":1202,"href":"https:\/\/wx.wosign.com\/index.php?rest_route=\/wp\/v2\/posts\/1193\/revisions\/1202"}],"wp:attachment":[{"href":"https:\/\/wx.wosign.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wx.wosign.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wx.wosign.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}