Ĭ��
���� �������� 13
�뿪��IM������Ʒ�¿ӣ�����3���¹����ҿ�Դ����ߣ������������·��... ��վ�����㽨��
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��
΢��ɨһɨ��ע��

1������


����IM����Ӧ����˵��Ϊ��������ȫ�ԣ���������Ϣ�����dz���������

������֮��Netty�Ǹ����ܵ�Java NIO����ͨ�ſ��ܣ�������Netty��дIM�������������ˡ����Ϲ���ΪNetty���ɡ��Լ�ʹ��SSL/TLS֤���������кܶ࣬�����ڸ���ԭ�������ɵ�֤��Ҫô��Netty���޷���ȡ��ʹ�ã�Ҫô�Ǵ��벻ȫ�򲻾��嵼�¸����䲻ͨSSL/TLS���ܡ�

��������ʱ��ר��Ϊ MobileIMSDK ������һ�ײ���֤�飬˳�ְ��������̼�¼�����������������ҡ�

����Ҫ������������ʹ��OpenSSL�����ڻ���Netty��IM���������õ�SSL/TLS֤�飬���ݰ�����֤���Ĵ��������������е�ע���㣬�Լ���Server�ˡ�Android�ˡ�iOS�ˡ�Java�����ˡ�H5��ʹ��֤���Ĵ��뷶����

�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_cover-opti.png

ע��������Щ���ѹ����˵�3��Ȩ��CA����ǩ����֤�飬���Ƕ�����Ӧ��ʹ���ĵ�������ûʲô��˵�ġ���������֤��ָ���Dz���Ҫ��Ǯ����ǩ��֤����

��������ͬ�������ڼ�ʱͨѶ�����ںţ������ǣ�https://mp.weixin.qq.com/s/1N2WInPTSgsqpYvD0TQaaA��

2��֪ʶ׼��


► ��������IMϵͳ���޸���������Ķ���������IM��������(һ)��ʲô��IMϵͳ����ϵ�����£�ͨ���׶����ʺ�С�ס�

► ��������ϵͳѧϰIM�������ص�����֪ʶ�������������̡�IM�ܹ����Ƶȣ��������Ķ�����������һƪ�͹������㿪���ƶ���IM����

�����㲻�˽�Netty��ʲô�������Ķ����¼�ƪNetty�Ļ������ź����£�


► ������������IM����֪ʶ��ͬʱҲ��Netty�������գ���׼������ʵս���������Ķ�������Netty�����㿪��IM���͡�����Դ��ѧIM������ϵ�����£��и������ż�ʵս���룬ͼ�IJ�ï���ʺ�ѧϰ��

► ��������IM��Netty�ѻ������֣�����IM��ȫ�����ļ��������е������壬�����ض�������Netty��IM�������ܼ���ѧϰ��һ�����峣���ļ��ܸ������������

3��ʲô��Netty


�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_1.png

Netty��һ��Java NIO�����Ŀ�Դ�첽�¼��������������̿��ܣ����ڿ��ٿ�����ά���ĸ�����Э���������Ϳͻ��ˡ���ͨ���˽������Խ�Netty����Ϊ��һ����Java NIO�����˴�����װ�������󽵵�Java NIOʹ���ѶȺ������ż��ij�ţ�ƿ��ܡ��������ԡ�ʷ����ͨ��Netty�������ų��ģ��������ܡ������������ʵս����

PS������ƪ��������Netty����������֪ʶ�Ͳ���׸�������б�Ҫ������ϸ���ű��ĵڶ��ڡ�2��֪ʶ׼�������й�Netty�����½����Ķ���

4��ʲô��OpenSSL


�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_2.png

OpenSSL��һ������Դ�����������⣬Ӧ�ó�������ʹ�������������а�ȫͨ�ţ����������롢�ű������ú͹��̵ļ��ϡ�����Ҫ������ C ������д�ɣ�ʵ���˻����ļ��ܹ��ܣ�ʵ���� SSL �� TLS Э�顣OpenSSL�������������ſ��Էֳ�������Ҫ���ܲ��֣�SSLЭ���⡢Ӧ�ó����������㷨�⡣

PS��OpenSSL�Ľ��ܾ͵㵽Ϊֹ��������Ȥ������ϸ�Ķ�������Netty��IM�������ܼ���ѧϰ��һ�����峣���ļ��ܸ������������

5�����غͰ�װOpenSSL


1������һ�����Դ�OpenSSL��Github�ֿ�����Դ�����б��루Դ�����ص�ַ��������һ��ʹ������˵�����ѱ�����ʵ�е��鷳�����Ƽ���ô�档

2������һ��Ҳ���Դ�������վ���ص�3�������õ�OpenSSL��װ��������װ�������ص�ַ�����������ּ򵥿��ݡ��������Բο���openssl��װ�̳̣�windows7ϵͳ������ϸ������ƪ���¡�

3������һ��Ҳ����ֱ�������渽�����İ�װ������������һֱ�õİ汾���汾���ϣ�����Ȥ��ֱ������ʹ������
Openssl-windows-0.9.8k(52im.net).rar (874.97 KB , ���ش���: 135 , �ۼ�: 1 ����)

4������ ��openssl.cnf�Ҳ����� �����⣺�����㰲װ��OpenSSL����ʹ��ʱ����openssl.cnf�Ҳ���������������ȱ��openssl.cnf����֮��������ʾ������������������ openssl.cnf�ļ���

openssl.cnf �ļ��������أ�
openssl_conf(52im.net).rar (4.63 KB , ���ش���: 54 , �ۼ�: 1 ����)

openssl.cnf �ļ���ѹ������
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_3.png

openssl.cnf�ļ�����ʹ�ã�
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_4.png

������ openssl.cnf �ļ�������ʹ����������ҵİ�װĿ¼Ϊ����
C:\Openssl-windows-0.9.8k-out32dll>set OPENSSL_CONF=c:/WINDOWS/system32/openssl.cnf

׼�����������������ǾͿ��Կ�ʼ����SSL/TLS֤���ˣ�

6������Netty���õ�SSL/TLS֤��


6.1����


����ʵ��������Netty���õ�SSL/TLS֤����Ҫ4����

  • 1������˽Կ֤�飻
  • 2����˽Կ��ʽת��pk8��
  • 3������֤��������
  • 4�����ɹ�Կ֤�顣

�����������ű������ݣ�һ����ʹ��OpenSSL����һ����������Netty����ʹ�õ���ǩ��֤�顣

6.2��һ��������˽Կ֤��


��CMD����̨��ִ������ָ����ǵ��ֶ����� netty Ŀ¼��
openssl genrsa -des3 -out netty/netty-key2.pem 1024
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_5.png

��ʾ������ָ���У����ޡ�-des3����������Netty�Ĵ�����ʹ��ʱ������File does not contain valid private key���ȴ���������ͼ��ʾ����

�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_6.png

6.3�ڶ�������˽Կ��ʽת��pk8


��CMD����̨��ִ������ָ�
openssl pkcs8 -in netty/netty-key2.pem -topk8 -out netty/netty-key2.pk8
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_7.png

��ʾ1���粻תpk8��ʽ����Netty�Ĵ�����ʹ��ʱ�ᱨ���´�����
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_8.png

��ʾ2���������в�Ϊkey�������룬��Netty�Ĵ�����ʹ��ʱ�ᱨ���´�����
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_9.png

��ʾ3��Netty�Ĵ�����ʹ��ʱҪ�����Ϸ�����Key֤��ʱ�����뼴�ɣ�
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_10.png

6.4������������֤������


��CMD����̨��ִ������ָ�
openssl req -new -out netty/netty-req2.csr -key netty/netty-key2.pem
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_11.png

��ʾ������ָ���У�Common Nameָ������֤���󶨵���������������������ip����������������������

6.5���IJ������ɹ�Կ֤��


��CMD����̨��ִ������ָ�
openssl x509 -req -in ca/netty-req2.csr -out netty/netty-cert2.crt -signkey netty/netty-key2.pem -days 3650
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_12.png

��ʾ��out �������ɵ���.crt������ǰ������.pem����ֻ����չ�����������ݶ�һ����

6.6���ճɹ�


�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_13.png

�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_14.png

���ˣ������Ѿ�ΪNetty��������֤�飬���������½ڣ����Ƿ������ζ�ȡ��ʹ����Щ֤���ġ�

7��ʵս����


7.1����


���ڽ�Ϊ����ʾ�����ڻ���Netty��IM��ʹ���Ͻ������ɵ�֤�顣

Ϊ����ʾ����������ʵս���壬���ڵ�ʾ�����뽫���õ��ǿ�ԴIM����MobileIMSDK ��Դ�룬��������Ȥ����ѧϰ�����Դ������Ŀ�Դ�ֿ������ص�MobileIMSDK������Դ�롣


7.2����Netty��IM�����������SSL/TLS


���Ƚ��Ͻ������ɵ�֤�飬���õ�����IM�����˴���Ŀ¼�¡����½�ͼ��ʾ��������MobileIMSDK�Ŀ�Դ����Ϊ����

���ǿ��Խ�֤���ŵ�����λ�ã�
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_15.png

ʹ��֤����ʾ������Ƭ�Σ��������������� ServerLauncherImpl.java��
/**
 * ����SslContext���������ڿ���SSL/TLS���ܴ��䡣
 * 
 * @return �����ɹ������򷵻�SslContext���󣬷��򷵻�null
 */
private static SslContext createSslContext() {                
    try {
         // ֤���ļ�
         InputStream certChainFile = ServerLauncherImpl.class.getResourceAsStream("certs/netty-cert2.crt");
         // ˽Կ�ļ���ע�⣺Nettyֻ֧��.pk8��ʽ��
         InputStream keyFile = ServerLauncherImpl.class.getResourceAsStream("certs/netty-key2.pk8");
         // ˽Կ����
         String keyPassword = "123456";
         // ����SslContext������Ϊ�˷������⣬�˴�ʹ�õ��ǵ�����֤��
         SslContext sslCtx = SslContextBuilder.forServer(certChainFile, keyFile, keyPassword).clientAuth(ClientAuth.NONE).build();                  
         return sslCtx;
    } catch (Exception e) {
        logger.warn("createSslContext()ʱ�����ˣ�ԭ����"+e.getMessage(), e);
    }
    return null;
}

PS�������������Ѷ�����������һ�£������Ķ���MobileIMSDK��Demoʹ�ð�����Server������

�����������ݣ����ǽ�ʵ�ֿͻ������ӵ�ʹ��SSL/TLS֤����Netty IM�����ˡ�

7.3Android�������SSL/TLS


��Ϊ�������Ѿ�������SSL/TLS���ܣ������ڿ���IM�Ŀͻ���ʱ������������SSL/TLS�أ�������δ����SSL/TLS�Ŀͻ��˿϶������������ķ����˵�����

����Ϊ�˷���ʾ��������ͬ���� MobileIMSDK��Android�˿�Դ����Ϊ����

Android�˿���SSL/TLS���ܵ�ʾ������Ƭ�Σ��������������� IMClientManager.java��
/**
 * ����SslContext���������ڿ���SSL/TLS���ܴ��䡣
 *
 * @return �����ɹ������򷵻�SslContext���󣬷��򷵻�null
 */
public SslContext createSslContext() {
        SslContext sslContext = null;
        try {
                sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
                Log.d(TAG, "��IMCORE-TCP���ѿ���SSL/TLS����(������֤)����sslContext�����ɹ���");
        } catch (Exception e) {
                Log.w(TAG, "��IMCORE-TCP������sslContextʱ������ԭ���ǣ�" + e.getMessage(), e);
        }

        return sslContext;
}

PS�������������Ѷ�����������һ�£������Ķ���MobileIMSDK��Demoʹ�ð�����Android������

7.4iOS�������SSL/TLS


ͬ���ģ�iOS�˸����ο���SSL/TLS�أ�

����������Ȼ�� MobileIMSDK��iOS�˿�Դ����Ϊ����MobileIMSDK��iOSʹ�õ��� CocoaAsyncSocket �����⣬������Ҳ���õ������Ϳ���ֱ�Ӳο��ˣ���Ϊ������SSL/TLS��CocoaAsyncSocket������δ�������ܵĴ����÷������϶࣬���ⷽ�����Բο������Ͻ�������

iOS�˿���SSL/TLS���ܵ�ʾ������Ƭ�Σ��������������� LocalSocketProvider.m��
/**
 * ��socket�Ѿ��������Ӳ�׼���ö���д����ʱ�������ô˷�����
 */
- (void)socket:(MBGCDAsyncSocket *)socket didConnectToHost:(NSString *)host port:(uint16_t)port
{
    if([ClientCoreSDK isENABLED_DEBUG])
        NSLog(@"��IMCORE-TCP-SOCKET�����յ�����TCP��connect����, isConnected? %d���ѿ���ssl����? %d", [socket isConnected], [ClientCoreSDK isSSL]);
    
    // ����δ����SSL���ܴ��䣬�����������������ɺ��Ĵ����߼�
    if(![ClientCoreSDK isSSL]) {
        [self whenDidConnect:socket];
    }
    // �����ѿ���SSL���ܴ��䣬����Ҫ�ڻص��е���startTLS�������Ա�ʵ�ָ������˵�SSL���ֹ��̣�
    // ����ssl���ֳɹ�������ͨ�� socketDidSecure: �ص�֪ͨ������
    else {
        // ���� SSL/TLS ������Ϣ
        NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3];
        // ������ǩ��֤���ֶ���֤
        [settings setObject:@YES forKey:GCDAsyncSocketManuallyEvaluateTrust];
        // �����ԣ�������ò���Ӱ��SSL������
//      [settings setObject:@"�˴���������IP��ַ" forKey:GCDAsyncSocketSSLPeerName];
        // ����������ǩ��֤�飬����Ȩ��֤���䷢����ע��������֤�飬����settings�ֵ��ɲ�������ʹ��GCDAsyncSocket��Ĭ�����ã�
        [socket startTLS:settings];
    }
}

/**
 * ��SSL���ֳɹ�����Ҳ�����Ϸ�����startSSL:�����󣩣������ô˷�����
 */
- (void)socketDidSecure:(MBGCDAsyncSocket *)socket
{
    [self whenDidConnect:socket];
}

/**
 * Allows a socket delegate to hook into the TLS handshake and manually validate the peer it's connecting to.
 */
- (void)socket:(MBGCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler
{
    NSLog(@"��IMCORE-TCP-SOCKET��didReceiveTrust...");
    
    // ����û���������ӵ�ssl֤����֤�߼���������Ҫʵ�ָ�ǿ����˫����֤���߼������Բο����
    // [url=https://github.com/FuangCao/cavan/blob/338ca8c09d6c78c5b38b95c6ffe994241afcc96e/xcode/TestSSL/TestSSL/ViewController.m]https://github.com/FuangCao/cava ... SL/ViewController.m[/url]
    if(completionHandler) {
        completionHandler(YES);
    }
}

˵����CocoaAsyncSocket�п���SSL/TLS������Android��Java����ô�򵥣�����ֻ�Ǽ��д������£������������ݶ�ȡ�߼��ı仯��

PS�������������Ѷ�����������һ�£������Ķ���MobileIMSDK��Demoʹ�ð�����iOS������

7.5Java�����������SSL/TLS


Java�����˿���SSL/TLS�Ĵ�����Android����һ��������ͬ���� MobileIMSDK��Java����Դ����Ϊ����

Java�����˿���SSL/TLS���ܵ�ʾ������Ƭ�Σ��������������� IMClientManager.java��
/**
 * ����SslContext���������ڿ���SSL/TLS���ܴ��䡣
 * 
 * @return �����ɹ������򷵻�SslContext���󣬷��򷵻�null
 */
public SslContext createSslContext() {
        SslContext sslContext = null;
        try {
                sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
                Log.d(TAG, "��IMCORE-TCP���ѿ���SSL/TLS����(������֤)����sslContext�����ɹ���");
        } catch (Exception e) {
                Log.w(TAG, "��IMCORE-TCP������sslContextʱ������ԭ���ǣ�" + e.getMessage(), e);
        }
        
        return sslContext;
}

PS�������������Ѷ�����������һ�£������Ķ���MobileIMSDK��Demoʹ�ð�����Java������

7.6H5�������SSL/TLS


������˵��H5�ˣ�ָ������֧�ֱ�׼HTML5��WebSocketЭ����PC�������ˡ��ֻ��ƶ�����Ƕ��Web�����ȳ�����

H5���ܿ���SSL/TLS������ǰ�᣺

  • 1����3��CA����ǩ����SSL/TLS֤�飨�����ǹؼ�����Ȼ����������ȫԭ������ֹWebSocket���ӵĽ�������
  • 2������Netty��IM�������ѿ���SSL/TLS�������¡�7.2 ����Netty��IM���������ο���SSL/TLS������

����������������H5��ʲô���붼�����Ķ���ֻ�轫����url�ɡ�ws���ijɡ�wss����
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_16.png

8�������


[1] MobileIMSDK��Դ����Դ��
[2] ʷ����ͨ��Netty�������ų��ģ��������ܡ������������ʵս
[3] ����Netty�����㿪��IM
[4] ����Netty��IM�������ܼ���ѧϰ��һ�����峣���ļ��ܸ��������
[5] IM����ϵͳ��ȫ�ֶ�֮ͨ�����Ӳ����ܼ���
[6] ͨ���׶���һƪ���ռ�ʱͨѶ����Ϣ���䰲ȫԭ��
[7] ̽�����ϼ����㷨��IM�е�Ӧ��
[8] openssl��װ�̳̣�windows7ϵͳ������ϸ��
[9] WebSocket�����ŵ���ͨ����Сʱ�͹���

��ʱͨѶ�� - ��ʱͨѶ������������ ��Դ�� - ��ʱͨѶ������������

��һƪ��IMͨѶЭ��ר��ѧϰ(��)���ְ��ֽ���������Android�ϴ���ʹ��Protobuf��һƪ����Ϊ��֪����������(ʮ��)����������ϵͳ��һ�ĸ㶮Socket������ʲô

��������¼�����¼���ר��

�Ƽ�����
���� 13
�������ã�����ssl֤�����Է�nginx��������
���ã�921124136 ������ 2023-02-20 17:59
�������ã�����ssl֤�����Է�nginx��������

��Ҫ��nginx��Ҫʲô����ʽ��֤���ˣ��㰴��Ҫ���ĸ�ʽ���ɼ��ɡ�

��ƪ�������������nettyҪ���ĸ�ʽ��֤���������ɵ�ר��֤�飬���ķ����ܲ����ã���������ר��ȥ������

�����Կ����������DZ�Ȩ��CAǩ�����շ�֤��Ҳ��һ�������������Ը��ֲ�ͬ��Ӧ��ȥ����ר��֤����ʽ��
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_ͼƬ1.png
���ã�JackJiang ������ 2023-02-20 18:17
��Ҫ��nginx��Ҫʲô����ʽ��֤���ˣ��㰴��Ҫ���ĸ�ʽ���ɼ��ɡ�

��ƪ�������������nettyҪ���ĸ� ...

�õ�
�����£�nginx������wss��ssl��netty ��ssl������ͬһ����
���ã�jeremy111 ������ 2023-04-25 20:15
�����£�nginx������wss��ssl��netty ��ssl������ͬһ����

��ûʵ���������������Ͽ���
�����£�ca/netty-req2.csr�����ļ������������ִ�е����IJ��迨��������
���ã�����Գ���ڼ��� ������ 2024-04-24 11:39
�����£�ca/netty-req2.csr�����ļ������������ִ�е����IJ��迨��������

������һ�ڣ���6.4 ������������֤��������
���ã����Ѿ������˵�����������֤�����󣬵��Dz�û������ca/netty-req2.csr�����ļ���������ָ��
���ã�����Գ���ڼ��� ������ 2024-04-24 13:53
���ã����Ѿ������˵�����������֤�����󣬵��Dz�û������ca/netty-req2.csr�����ļ���������ָ��

��������ɶ�����ܵ��и�������
���ã�JackJiang ������ 2024-04-24 15:20
��������ɶ�����ܵ��и�������

G:\OpenSsl\Openssl-windows-0.9.8k\out32dll>openssl req -new -out netty/netty-req2.csr -key netty/netty-key2.pem
Enter pass phrase for netty/netty-key2.pem:
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:tianjin
Locality Name (eg, city) []:tianjin
Organization Name (eg, company) [Internet Widgits Pty Ltd]:personal
Organizational Unit Name (eg, section) []:personal
Common Name (e.g. server FQDN or YOUR name) []:127.0.0.1
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:personal

G:\OpenSsl\Openssl-windows-0.9.8k\out32dll>A


ɶҲû���ɣ�����ִ�е��������ͼƬ�ύ���ˣ��Ͱ����ָ��Ƴ����ˣ�



���ã�����Գ���ڼ��� ������ 2024-04-24 16:32
G:\OpenSsl\Openssl-windows-0.9.8k\out32dll>openssl req -new -out netty/netty-req2.csr -key netty/n ...

�����ҵ�Ŀ¼�������ܸо���������Ŀ¼��̫�ԣ��ص㿴������nettyĿ¼�治���ڣ������ھ��ֶ�������
�ְ��ֽ���Ϊ����Netty��IM������ǩ��SSL/TLS֤��_WX20240424-184546@2x.png
�Լ����ص����°汾��������������������֤�飬��Ŀ��֤������ʹ�������ṩ�İ汾openssl��ʹ������
���ã�beichen ������ 2024-06-17 10:12
�Լ����ص����°汾��������������������֤�飬��Ŀ��֤������ʹ�������ṩ�İ汾openssl��ʹ������

����ͨ�ù��߾�����Ҫȥ���غ��µİ汾
����¥�� ×
ʹ��΢�Ŵ��ͣ� ʹ��֧�������ͣ�

���ض���