2.2.
SSLË«ÏòÈÏÖ¤
2.2.1. SSLË«ÏòÈÏÖ¤¿ª·¢
ÎÒÃÇÔÚ2.1Õ½ڵĻù´¡ÉϽøÐпª·¢£¬Óëµ¥ÏòÈÏÖ¤²»Í¬µÄÊÇ·þÎñ¶ËÒ²ÐèÒª¶Ô¿Í»§¶Ë½øÐа²È«ÈÏÖ¤¡£Õâ¾ÍÒâζ×ſͻ§¶ËµÄ×ÔÇ©ÃûÖ¤ÊéÒ²ÐèÒªµ¼Èëµ½·þÎñ¶ËµÄÊý×ÖÖ¤Êé²Ö¿âÖС£
Ê×ÏÈ£¬Éú³É¿Í»§¶ËµÄ×ÔÇ©ÃûÖ¤Ê飺
keytool -export -alias smcc -keystore cChat.jks -storepass cNetty -file cChat.cer |
×îºó£¬½«¿Í»§¶ËµÄ×ÔÇ©ÃûÖ¤Êéµ¼Èëµ½·þÎñ¶ËµÄÐÅÈÎÖ¤Êé²Ö¿âÖУº
keytool -import -trustcacerts -alias smcc -file cChat.cer -storepass sNetty -keystore sChat.jks |
Ö¤Êéµ¼ÈëÖ®ºó£¬ÐèÒª¶ÔSSL¿Í»§¶ËºÍ·þÎñ¶ËµÄ´úÂëͬʱ½øÐÐÐ޸ģ¬Ê×ÏÈÎÒÃÇ¿´Ï·þÎñ¶ËÈçºÎÐ޸ġ£
ÓÉÓÚ·þÎñ¶ËÐèÒª¶Ô¿Í»§¶Ë½øÐÐÑéÖ¤£¬Òò´ËÔÚ³õʼ»¯·þÎñ¶ËSSLContextµÄʱºòÐèÒª¼ÓÔØÖ¤Êé²Ö¿â¡£Ê×ÏÈÐèÒª¶ÔTrustManagerFactory½øÐгõʼ»¯£¬´úÂëÈçÏ£º

³õʼ»¯SSLContextµÄʱºò¸ù¾ÝTrustManagerFactory»ñÈ¡TrustManagerÊý×飬´úÂëÈçÏ£º

×îºó£¬´´½¨SSLEngineÖ®ºó£¬ÉèÖÃÐèÒª½øÐпͻ§¶ËÈÏÖ¤£¬´úÂëÈçÏ£º

Íê³É·þÎñ¶ËÐÞ¸ÄÖ®ºó£¬ÔÙ»ØÍ·¿´Ï¿ͻ§¶ËµÄÐ޸ģ¬ÓÉÓÚ·þÎñ¶ËÐèÒªÈÏÖ¤¿Í»§¶ËµÄÖ¤Ê飬Òò´Ë£¬ÐèÒª³õʼ»¯ºÍ¼ÓÔØË½Ô¿²Ö¿â£¬Ïò·þÎñ¶Ë·¢Ë͹«Ô¿£¬³õʼ»¯KeyStoreµÄ´úÂëÈçÏ£º

³õʼ»¯SSLContextµÄʱºòÐèÒª´«ÈëKeyManagerÊý×飬´úÂëÈçÏ£º

¿Í»§¶Ë¿ª·¢Íê³ÉÖ®ºó£¬²âÊÔϳÌÐòÊÇ·ñÄܹ»Õý³£¹¤×÷£¬ÔËÐнá¹ûÈçÏÂËùʾ¡£
¿Í»§¶ËÔËÐнá¹û£º

ͼ2-5 Netty SSLË«ÏòÈÏÖ¤¿Í»§¶ËÔËÐнá¹û
·þÎñ¶ËÔËÐнá¹û£º

ͼ2-6 Netty SSLË«ÏòÈÏÖ¤·þÎñ¶ËÔËÐнá¹û
ÔÚ¿Í»§¶Ë¿ØÖÆÌ¨½øÐÐÊäÈ룬¿´SSL´«ÊäÊÇ·ñÕý³££º

ͼ2-7 Netty SSL °²È«´«Êä²âÊÔ
2.2.2. SSLË«ÏòÈÏÖ¤ÔÀí·ÖÎö
SSLË«ÏòÈÏÖ¤Ïà±Èµ¥ÏòÈÏÖ¤£¬¶àÁËÒ»²½·þÎñ¶Ë·¢ËÍÈÏÖ¤ÇëÇóÏûÏ¢¸ø¿Í»§¶Ë£¬¿Í»§¶Ë·¢ËÍ×ÔÇ©ÃûÖ¤Ê鏸·þÎñ¶Ë½øÐа²È«ÈÏÖ¤µÄ¹ý³Ì¡£ÏÂÃæ£¬ÎÒÃǽáºÏNetty
SSLµ÷²âÈÕÖ¾£¬¶ÔË«ÏòÈÏÖ¤µÄ²îÒìµã½øÐзÖÎö¡£
Ïà±ÈÓÚ¿Í»§¶Ë£¬·þÎñ¶ËÔÚ·¢ËÍServerHelloʱЯ´øÁËÒªÇó¿Í»§¶ËÈÏÖ¤µÄÇëÇóÐÅÏ¢£¬ÈçÏÂËùʾ£º
*** CertificateRequest Cert Types: RSA, DSS, ECDSA Cert Authorities: <CN=localhost> <CN=localhost> *** ServerHelloDone |
¿Í»§¶Ë½ÓÊÕµ½·þÎñ¶ËÒªÇó¿Í»§¶ËÈÏÖ¤µÄÇëÇóÏûÏ¢Ö®ºó£¬·¢ËÍ×Ô¼ºµÄÖ¤ÊéÐÅÏ¢¸ø·þÎñ¶Ë£¬ÐÅÏ¢ÈçÏ£º
matching alias: smcc *** Certificate chain chain [0] = [ [ Version: V3 Subject: CN=localhost Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
Key: Sun RSA public key, 2048 bits
modulus: 212639695562264078962258083015763969567082142460170954053624074
53705267323050920051941696590911289892005894127848317880153980200067657563
15944918691324084822137929027919841383304228071408660098765703368443353862
47349919704780645114810932016343908989985053434023995248208445566727867691
73042913746571760169661698040844437316556983406538131853892449014877947773
16977794500345715634646402492099542466990685058179767825995777860790787074
72339147926907851214779520246763960901175126351376922481444497141021631392
59603124160944922844840171133151822882039207352509182052426500279100525773
147139994269292585983679425433429361
public exponent: 65537
Validity: [From: Sun Jul 27 08:50:35 CST 2014,
To: Mon Jul 27 08:50:35 CST 2015]
Issuer: CN=localhost
SerialNumber: [ 53d44cdb] |
·þÎñ¶Ë¶Ô¿Í»§¶ËµÄ×ÔÇ©ÃûÖ¤Êé½øÐÐÈÏÖ¤£¬ÐÅÏ¢ÈçÏ£º
*** Found trusted certificate: [ [ Version: V3 Subject: CN=localhost Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
Key: Sun RSA public key, 2048 bits
modulus: 21263969556226407896225808301576396956708214246017095405362407
4537052673230509200519416965909112898920058941278483178801539802000676575
6315944918691324084822137929027919841383304228071408660098765703368443353
8624734991970478064511481093201634390898998505343402399524820844556672786
7691730429137465717601696616980408444373165569834065381318538924490148779
4777316977794500345715634646402492099542466990685058179767825995777860790
7870747233914792690785121477952024676396090117512635137692248144449714102
1631392596031241609449228448401711331518228820392073525091820524265002791
00525773147139994269292585983679425433429361
public exponent: 65537
Validity: [From: Sun Jul 27 08:50:35 CST 2014,
To: Mon Jul 27 08:50:35 CST 2015]
Issuer: CN=localhost
SerialNumber: [ 53d44cdb] |
2.3. µÚÈý·½CAÈÏÖ¤
ʹÓÃjdk keytoolÉú³ÉµÄÊý×ÖÖ¤ÊéÊÇ×ÔÇ©ÃûµÄ¡£×ÔÇ©Ãû¾ÍÊÇÖ¸Ö¤ÊéÖ»Äܱ£Ö¤×Ô¼ºÊÇÍêÕûÇÒûÓо¹ý·Ç·¨Ð޸쬵«ÊÇÎÞ·¨±£Ö¤Õâ¸öÖ¤ÊéÊÇÊôÓÚ˵ġ£ÎªÁ˶Ô×ÔÇ©ÃûÖ¤Êé½øÐÐÈÏÖ¤£¬ÐèҪÿ¸ö¿Í»§¶ËºÍ·þÎñ¶Ë¶¼½»»»×Ô¼º×ÔÇ©ÃûµÄ˽ÓÐÖ¤Ê飬¶ÔÓÚÒ»¸ö´óÐÍÍøÕ¾»òÕßÓ¦Ó÷þÎñÆ÷£¬ÕâÖÖ¹¤×÷Á¿ÊǷdz£´óµÄ¡£
»ùÓÚ×ÔÇ©ÃûµÄSSLË«ÏòÈÏÖ¤£¬Ö»Òª¿Í»§¶Ë»òÕß·þÎñ¶ËÐÞ¸ÄÁËÃÜÔ¿ºÍÖ¤Ê飬¾ÍÐèÒªÖØÐ½øÐÐÇ©ÃûºÍÖ¤Êé½»»»£¬ÕâÖÖµ÷ÊÔºÍά»¤¹¤×÷Á¿ÊǷdz£´óµÄ¡£Òò´Ë£¬ÔÚʵ¼ÊµÄÉÌÓÃϵͳÖÐÍùÍù»áʹÓõÚÈý·½CAÖ¤Êé°ä·¢»ú¹¹½øÐÐÇ©ÃûºÍÑéÖ¤¡£ÎÒÃǵÄä¯ÀÀÆ÷¾Í±£´æÁ˼¸¸ö³£ÓõÄCA_ROOT¡£Ã¿´ÎÁ¬½Óµ½ÍøÕ¾Ê±Ö»ÒªÕâ¸öÍøÕ¾µÄÖ¤ÊéÊǾ¹ýÕâЩCA_ROOTÇ©Ãû¹ýµÄ¡£¾Í¿ÉÒÔͨ¹ýÑéÖ¤ÁË¡£
CAÊý×ÖÖ¤ÊéÈÏÖ¤·þÎñÍùÍùÊÇÊշѵ쬹úÄÚÓкܶàÊý×ÖÈÏÖ¤ÖÐÐͼÌṩÏà¹ØµÄ·þÎñ£¬ÈçÏÂËùʾ£º

ͼ2-8 ÉÌÒµµÄÊý×ÖÈÏÖ¤ÖÐÐÄ
×÷ΪʾÀý£¬ÎÒÃÇ×Ô¼ºÉú³ÉÒ»¸öCA_ROOTµÄÃÜÔ¿¶Ô£¬²¿ÊðÓ¦ÓÃʱ£¬°ÑÕâ¸öCA_ROOTµÄ˽Կ²¿ÊðÔÚËùÓÐÐèÒªSSL´«ÊäµÄ½Úµã¾Í¿ÉÒÔÍê³É°²È«ÈÏÖ¤¡£×÷ΪʾÀý£¬Èç¹ûÒªÉú³ÉCA_ROOT£¬ÎÒÃÇʹÓÿªÔ´µÄOpenSSL¡£
ÔÚWindowsÉϰ²×°ºÍʹÓÃOpenSSLÍøÉÏÓкܶà½Ì³Ì£¬Ò²²»ÊDZ¾ÎĵÄÖØµã£¬Òò´Ë£¬OpenSSLµÄ°²×°ºÍʹÓñ¾ÎIJ»Ïêϸ½éÉÜ¡£
ÏÂÃæÎÒÃǶԻùÓÚµÚÈý·½CAÈÏÖ¤µÄ²½Öè½øÐÐÏêϸ½éÉÜ¡£
2.3.1. ·þÎñ¶ËÖ¤ÊéÖÆ×÷
²½Öè1£ºÀûÓÃOpenSSLÉú³ÉCAÖ¤Ê飺
openssl req -new -x509 -keyout ca.key -out ca.crt -days 365 |
²½Öè2£ºÉú³É·þÎñ¶ËÃÜÔ¿¶Ô£º
keytool -genkey -alias securechat -keysize 2048 -validity 365 -keyalg RSA -dname "CN=localhost" -keypass sNetty -storepass sNetty -keystore sChat.jks |
²½Öè3£ºÉú³ÉÖ¤ÊéÇ©ÃûÇëÇó£º
keytool -certreq -alias securechat -sigalg MD5withRSA -file sChat.csr -keypass sNetty -storepass sNetty -keystore sChat.jks |
²½Öè4£ºÓÃCA˽Կ½øÐÐÇ©Ãû£º
openssl ca -in sChat.csr -out sChat.crt -cert ca.crt -keyfile ca.key -notext |
²½Öè5£ºµ¼ÈëÐÅÈεÄCA¸ùÖ¤Êéµ½keystore£º
keytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass sNetty -keystore sChat.jks |
²½Öè6£º½«CAÇ©ÃûºóµÄserver¶ËÖ¤Êéµ¼Èëkeystore£º
keytool -import -v -alias securechat -file server.crt -keypass sNetty -storepass sNetty -keystore sChat.jks |
2.3.2. ¿Í»§¶ËÖ¤ÊéÖÆ×÷
²½Öè1£ºÉú³É¿Í»§¶ËÃÜÔ¿¶Ô£º
keytool -genkey -alias smcc -keysize 2048 -validity 365 -keyalg RSA -dname "CN=localhost" -keypass cNetty -storepass cNetty -keystore cChat.jks |
²½Öè2£ºÉú³ÉÖ¤ÊéÇ©ÃûÇëÇó£º
keytool -certreq -alias smcc -sigalg MD5withRSA -file cChat.csr -keypass cNetty -storepass cNetty -keystore cChat.jks |
²½Öè3£ºÓÃCA˽Կ½øÐÐÇ©Ãû£º
openssl ca -in cChat.csr -out cNetty.crt -cert ca.crt -keyfile ca.key -notext |
²½Öè4£ºµ¼ÈëÐÅÈεÄCA¸ùÖ¤Êéµ½keystore£º
keytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass cNetty -keystore cChat.jks |
²½Öè5£º½«CAÇ©ÃûºóµÄclient¶ËÖ¤Êéµ¼Èëkeystore£º
keytool -import -v -alias smcc -file cNetty.crt -keypass cNetty -storepass cNetty -keystore cChat.jks |
2.3.3. ¿ª·¢ºÍ²âÊÔ
»ùÓÚCAÈÏÖ¤µÄ¿ª·¢ºÍ²âÊÔÓëSSLË«ÏòºÍµ¥ÏòÈÏÖ¤´úÂëÏàͬ£¬´Ë´¦²»ÔÙ׸Êö¡£
3. Netty SSLÔ´Âë·ÖÎö
3.1. SSL¿Í»§¶Ë
µ±¿Í»§¶ËºÍ·þÎñ¶ËµÄTCPÁ´Â·½¨Á¢³É¹¦Ö®ºó£¬SslHandlerµÄchannelActive±»´¥·¢£¬SSL¿Í»§¶Ëͨ¹ýSSLÒýÇæ·¢ÆðÎÕÊÖÇëÇóÏûÏ¢£¬´úÂëÈçÏ£º

·¢ÆðÎÕÊÖÇëÇóÖ®ºó£¬ÐèÒª½«SSLEngine´´½¨µÄÎÕÊÖÇëÇóÏûÏ¢½øÐÐSSL±àÂ룬·¢Ë͸ø·þÎñ¶Ë£¬Òò´Ë£¬ÎÕÊÖÖ®ºóÁ¢¼´µ÷ÓÃwrapNonAppData·½·¨£¬ÏÂÃæ¾ßÌå¶Ô¸Ã·½·¨½øÐзÖÎö£º

ÒòΪֻÐèÒª·¢ËÍÎÕÊÖÇëÇóÏûÏ¢£¬Òò´ËSource ByteBufΪ¿Õ£¬ÏÂÃæ¿´ÏÂwrap·½·¨µÄ¾ßÌåʵÏÖ£º

½«SSLÒýÇæÖд´½¨µÄÎÕÊÖÇëÇóÏûÏ¢±àÂ뵽Ŀ±êByteBufferÖУ¬È»ºó¶ÔдË÷Òý½øÐиüС£ÅжÏдÈë²Ù×÷ÊÇ·ñÔ½½ç£¬Èç¹ûÔ½½ç˵Ã÷outÈÝÁ¿²»×㣬ÐèÒªµ÷ÓÃensureWritable¶ÔByteBuf½øÐж¯Ì¬À©Õ¹£¬À©Õ¹Ö®ºó¼ÌÐø³¢ÊÔ±àÂë²Ù×÷¡£Èç¹û±àÂë³É¹¦£¬·µ»ØSSLÒýÇæ²Ù×÷½á¹û¡£
¶Ô±àÂë½á¹û½øÐÐÅжϣ¬Èç¹û±àÂë×Ö½ÚÊý´óÓÚ0£¬Ôò½«±àÂëºóµÄ½á¹û·¢Ë͸ø·þÎñ¶Ë£¬È»ºóÊÍ·ÅÁÙʱ±äÁ¿out¡£
ÅжÏSSLÒýÇæµÄ²Ù×÷½á¹û£¬SSLÒýÇæµÄ²Ù×÷½á¹û¶¨ÒåÈçÏ£º
1.FINISHED£ºSSLEngine ÒѾÍê³ÉÎÕÊÖ£»
2.NEED_TASK£ºSSLEngine ÔÚ¼ÌÐø½øÐÐÎÕÊÖǰÐèÒªÒ»¸ö£¨»ò¶à¸ö£©´úÀíÈÎÎñµÄ½á¹û£»
3.NEED_UNWRAP£ºÔÚ¼ÌÐø½øÐÐÎÕÊÖǰ£¬SSLEngine ÐèÒª´ÓÔ¶¶Ë½ÓÊÕÊý¾Ý£¬ËùÒÔÓ¦´øµ÷ÓÃSSLEngine.unwrap()£»
4.NEED_WRAP:ÔÚ¼ÌÐø½øÐÐÎÕÊÖǰ£¬SSLEngine ±ØÐëÏòÔ¶¶Ë·¢ËÍÊý¾Ý£¬ËùÒÔÓ¦¸Ãµ÷ÓÃ
SSLEngine.wrap()£»
5.NOT_HANDSHAKING:SSLEngine µ±Ç°Ã»ÓнøÐÐÎÕÊÖ¡£
ÏÂÃæÎÒÃÇ·Ö±ð¶Ô5ÖÖ²Ù×÷µÄ´úÂë½øÐзÖÎö£º

Èç¹ûÎÕÊֳɹ¦£¬ÔòÉèÖÃhandshakePromiseµÄ²Ù×÷½á¹ûΪ³É¹¦£¬Í¬Ê±·¢ËÍSslHandshakeCompletionEvent.SUCCES¸øSSL¼àÌýÆ÷£¬´úÂëÈçÏ£º

Èç¹ûÊÇNEED_TASK£¬ËµÃ÷Òì²½Ö´ÐÐSSL Task£¬Íê³ÉºóÐø¿ÉÄܺÄʱµÄ²Ù×÷»òÕßÈÎÎñ£¬Netty·â×°ÁËÒ»¸öÈÎÎñÁ¢¼´Ö´ÐÐÏ̳߳Ø×¨ÃÅ´¦ÀíSSLµÄ´úÀíÈÎÎñ£¬´úÂëÈçÏ£º

Èç¹ûÊÇNEED_UNWRAP£¬ÔòÅжÏÊÇ·ñÓÉUNWRAP·¢Æð£¬Èç¹û²»ÊÇÔòÖ´ÐÐUNWRAP²Ù×÷¡£
Èç¹ûÊÇNOT_HANDSHAKING£¬Ôòµ÷ÓÃunwrap£¬¼ÌÐø½ÓÊÕ·þÎñ¶ËµÄÏûÏ¢¡£
·þÎñ¶ËÓ¦´ðÏûÏ¢µÄ½ÓÊÕ¸ú·þÎñ¶Ë½ÓÊÕ¿Í»§¶ËµÄ´úÂëÀàËÆ£¬Î¨Ò»²»Í¬Ö®´¦ÔÚÓÚSSLÒýÇæµÄ¿Í»§¶ËģʽÉèÖò»Í¬£¬Ò»¸öÊÇ·þÎñ¶Ë£¬Ò»¸öÊǿͻ§¶Ë¡£ÉϲãµÄ´úÂë´¦ÀíÊÇÏàͬµÄ£¬ÏÂÃæÎÒÃÇÔÚSSL·þÎñ¶ËÕ½ڷÖÎöÎÕÊÖÏûÏ¢µÄ½ÓÊÕ¡£
3.2. SSL·þÎñ¶Ë
SSL·þÎñ¶Ë½ÓÊÕ¿Í»§¶ËÎÕÊÖÇëÇóÏûÏ¢µÄÈë¿Ú·½·¨ÊÇdecode·½·¨£¬ÏÂÃæ¶ÔËü½øÐÐÏêϸ·ÖÎö¡£
Ê×ÏÈ»ñÈ¡½ÓÊÕ»º³åÇøµÄ¶ÁдË÷Òý£¬²¢¶Ô¶ÁÈ¡µÄÆ«ÒÆÁ¿Ö¸Õë½øÐб¸·Ý£º

¶Ô°ë°ü±êʶ½øÐÐÅжϣ¬Èç¹ûÉÏÒ»¸öÏûÏ¢Êǰë°üÏûÏ¢£¬ÔòÅжϵ±Ç°¿É¶ÁµÄ×Ö½ÚÊýÊÇ·ñСÓÚÕû°üÏûÏ¢µÄ³¤¶È£¬Èç¹ûСÓÚÕû°ü³¤¶È£¬Ôò˵Ã÷±¾´Î¶ÁÈ¡²Ù×÷ÈÔȻûÓаÑSSLÕû°üÏûÏ¢¶ÁÈ¡ÍêÕû£¬ÐèÒª·µ»ØIOÏ̼߳ÌÐø¶ÁÈ¡£¬´úÂëÈçÏ£º

Èç¹ûÏûÏ¢¶ÁÈ¡ÍêÕû£¬ÔòÐÞ¸ÄÆ«ÒÆÁ¿£ºÍ¬Ê±ÖÃλ°ë°ü³¤¶È±êʶ¡£

ÏÂÃæÔÚforÑ»·ÖжÁÈ¡SSLÏûÏ¢£¬ÒòΪTCP´æÔÚ²ð°üºÍÕ³°ü£¬Òò´ËÒ»¸öByteBuf¿ÉÄܰüº¬¶àÌõÍêÕûµÄSSLÏûÏ¢¡£
Ê×ÏÈÅжϿɶÁµÄ×Ö½ÚÊýÊÇ·ñСÓÚÐÒéÏûϢͷ³¤¶È£¬Èç¹ûÊÇÔòÍ˳öÑ»·¼ÌÐøÓÉIOÏ߳̽ÓÊÕºóÐøµÄ±¨ÎÄ£º

»ñÈ¡SSLÏûÏ¢°üµÄ±¨Îij¤¶È£¬¾ßÌåËã·¨²»ÔÙ½éÉÜ£¬¿ÉÒԲο¼SSLµÄ¹æ·¶Îĵµ½øÐнâ¶Á£¬´úÂëÈçÏ£º

¶Ô³¤¶È½øÐÐÅжϣ¬Èç¹ûSSL±¨Îij¤¶È´óÓڿɶÁµÄ×Ö½ÚÊý£¬ËµÃ÷ÊǸö°ë°üÏûÏ¢£¬½«°ë°ü±êʶ³¤¶ÈÖÃ룬·µ»ØIOÏ̼߳ÌÐø¶ÁÈ¡ºóÐøµÄÊý¾Ý±¨£¬´úÂëÈçÏ£º

¶ÔÏûÏ¢½øÐнâÂ룬½«SSL¼ÓÃܵÄÏûÏ¢½âÂëΪ¼ÓÃÜǰµÄÔʼÊý¾Ý£¬unwrap·½·¨ÈçÏ£º

µ÷ÓÃSSLEngineµÄunwrap·½·¨¶ÔSSLÔʼÏûÏ¢½øÐнâÂ룬¶Ô½âÂë½á¹û½øÐÐÅжϣ¬Èç¹ûÔ½½ç£¬ËµÃ÷out»º³åÇø²»¹»£¬ÐèÒª½øÐж¯Ì¬À©Õ¹¡£Èç¹ûÊÇÊ×´ÎÔ½½ç£¬ÎªÁ˾¡Á¿½ÚÔ¼Äڴ棬ʹÓÃSSL×î´ó»º³åÇø³¤¶ÈºÍSSLÔʼ»º³åÇø¿É¶ÁµÄ×Ö½ÚÊýÖнÏСµÄ¡£Èç¹ûÔٴη¢Éú»º³åÇøÔ½½ç£¬ËµÃ÷À©ÕźóµÄ»º³åÇøÈÔÈ»²»¹»Óã¬Ö±½ÓʹÓÃSSL»º³åÇøµÄ×î´ó³¤¶È£¬±£Ö¤Ï´νâÂë³É¹¦¡£
½âÂë³É¹¦Ö®ºó£¬¶ÔSSLÒýÇæµÄ²Ù×÷½á¹û½øÐÐÅжϣºÈç¹ûÐèÒª¼ÌÐø½ÓÊÕÊý¾Ý£¬Ôò¼ÌÐøÖ´ÐнâÂë²Ù×÷£»Èç¹ûÐèÒª·¢ËÍÎÕÊÖÏûÏ¢£¬Ôòµ÷ÓÃwrapNonAppData·¢ËÍÎÕÊÖÏûÏ¢£»Èç¹ûÐèÒªÒì²½Ö´ÐÐSSL´úÀíÈÎÎñ£¬Ôòµ÷ÓÃÁ¢¼´Ö´ÐÐÏ̳߳ØÖ´ÐдúÀíÈÎÎñ£»Èç¹ûÊÇÎÕÊֳɹ¦£¬ÔòÉèÖÃSSL²Ù×÷½á¹û£¬·¢ËÍSSLÎÕÊֳɹ¦Ê¼þ£»Èç¹ûÊÇ

Ó¦ÓòãµÄÒµÎñÊý¾Ý£¬Ôò¼ÌÐøÖ´ÐнâÂë²Ù×÷£¬ÆäËü²Ù×÷½á¹û£¬Å׳ö²Ù×÷ÀàÐÍÒì³£¡£
ÐèÒªÖ¸³öµÄÊÇ£¬SSL¿Í»§¶ËºÍ·þÎñ¶Ë½ÓÊÕ¶Ô·½SSLÎÕÊÖÏûÏ¢µÄ´úÂëÊÇÏàͬµÄ£¬ÄÇΪʲôSSL·þÎñ¶ËºÍ¿Í»§¶Ë·¢Ë͵ÄÎÕÊÖÏûÏ¢²»Í¬ÄØ£¿ÕâЩÊÇSSLÒýÇæ¸ºÔðÇø·ÖºÍ´¦ÀíµÄ£¬ÎÒÃÇÔÚ´´½¨SSLÒýÇæµÄʱºòÉèÖÃÁ˿ͻ§¶Ëģʽ£¬SSLÒýÇæ¾ÍÊǸù¾ÝÕâ¸öÀ´½øÐÐÇø·ÖµÄ£¬´úÂëÈçÏ£º

ÎÞÂÛ¿Í»§¶Ë»¹ÊÇ·þÎñ¶Ë£¬Ö»ÐèÒªÎ§ÈÆSSLÒýÇæµÄ²Ù×÷½á¹û½øÐбà³Ì¼´¿É¡£
3.3. SSLÏûÏ¢¶ÁÈ¡
SSLµÄÏûÏ¢¶Áȡʵ¼Ê¾ÍÊÇByteToMessageDecoder½«½ÓÊÕµ½µÄSSL¼ÓÃܺóµÄ±¨ÎĽâÂëΪÔʼ±¨ÎÄ£¬È»ºó½«Õû°üÏûϢͶµÝ¸øºóÐøµÄÏûÏ¢½âÂëÆ÷£¬¶ÔÏûÏ¢×ö¶þ´Î½âÂë¡£»ùÓÚSSLµÄÏûÏ¢½âÂëÄ£ÐÍÈçÏ£º

SSLÏûÏ¢¶ÁÈ¡µÄÈë¿Ú¶¼ÊÇdecode£¬ÒòΪÊÇ·ÇÎÕÊÖÏûÏ¢£¬ËüµÄ´¦Àí·Ç³£¼òµ¥£¬¾ÍÊÇÑ»·µ÷ÓÃÒýÇæµÄunwrap·½·¨£¬½«SSL±¨ÎĽâÂëΪÔʼµÄ±¨ÎÄ£¬´úÂëÈçÏ£º

ÎÕÊֳɹ¦Ö®ºóµÄËùÓÐÏûÏ¢¶¼ÊÇÓ¦ÓÃÊý¾Ý£¬Òò´ËËüµÄ²Ù×÷½á¹ûΪNOT_HANDSHAKING£¬Óöµ½´Ë±êʶ֮ºó¼ÌÐø¶ÁÈ¡ÏûÏ¢£¬Ö±µ½Ã»ÓпɶÁµÄ×Ö½Ú£¬Í˳öÑ»·£¬´úÂëÈçÏ£º

Èç¹û¶ÁÈ¡µ½ÁË¿ÉÓõÄ×Ö½Ú£¬Ôò½«¶ÁÈ¡µ½µÄ»º³åÇø¼Óµ½Êä³ö½á¹ûÁбíÖУ¬´úÂëÈçÏ£º

ByteToMessageDecoderÅжϽâÂë½á¹ûList£¬Èç¹û·Ç¿Õ£¬ÔòÑ»·µ÷ÓúóÐøµÄHandler£¬ÓɺóÐøµÄ½âÂëÆ÷¶Ô½âÃܺóµÄ±¨ÎĽøÐжþ´Î½âÂë¡£
3.4. SSLÏûÏ¢·¢ËÍ
SSLÏûÏ¢·¢ËÍʱ£¬ÓÉSslHandler¶ÔÏûÏ¢½øÐбàÂ룬±àÂëºóµÄÏûϢʵ¼Ê¾ÍÊÇSSL¼ÓÃܺóµÄÏûÏ¢£¬ËüµÄÈë¿ÚÊÇflush·½·¨£¬´úÂëÈçÏ£º

´Ó´ý¼ÓÃܵÄÏûÏ¢¶ÓÁÐÖе¯³öÏûÏ¢£¬µ÷ÓÃSSLÒýÇæµÄwrap·½·¨½øÐбàÂ룬´úÂëÈçÏ£º

wrap·½·¨ºÜ¼òµ¥£¬¾ÍÊǵ÷ÓÃSSLÒýÇæµÄ±àÂë·½·¨£¬È»ºó¶ÔдË÷Òý½øÐÐÐ޸ģ¬Èç¹û»º³åÇøÔ½½ç£¬Ôò¶¯Ì¬À©Õ¹»º³åÇø£º

¶ÔSSL²Ù×÷½á¹û½øÐÐÅжϣ¬ÒòΪÒѾÎÕÊֳɹ¦£¬Òò´Ë·µ»ØµÄ½á¹ûÊÇNOT_HANDSHAKING£¬Ö´ÐÐfinishWrap·½·¨£¬µ÷ÓÃChannelHandlerContextµÄwrite·½·¨£¬½«ÏûϢдÈë·¢ËÍ»º³åÇøÖУ¬Èç¹û´ý·¢Ë͵ÄÏûϢΪ¿Õ£¬Ôò¹¹Ôì¿ÕµÄByteBufдÈ룺

±àÂëºó£¬µ÷ÓÃChannelHandlerContextµÄflush·½·¨ÏûÏ¢·¢Ë͸ø¶Ô·½£¬´úÂëÈçÏ£º
|