V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Hardrain
V2EX  ›  问与答

修改 nginx 源码所遇到的奇怪问题

  •  
  •   Hardrain · 2018-09-22 13:15:57 +08:00 · 2308 次点击
    这是一个创建于 2033 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Nginx 不能设置 TLS1.3 加密套件的顺序,因为 OpenSSL 1.1.1 的正式版本(及之前的几个 beta 版本)使用了新的 functionint SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str);来设置 TLS1.3 加密套件,而 TLS1.2 加密套件使用先前存在的int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str);来设置。

    (参考 https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_ciphersuites.html)

    用 grep -rnwi 检索 nginx 1.15.3 的源码,发现没有使用前者(function),于是自己做了一个patch,添加ssl_ciphers_tls13一项配置文件参数来设置 TLS1.3 加密套件。


    奇怪的问题是:

    ssl_ciphers_tls13必须在每个server {}块中都存在,才能正常地运行服务器,否则报出 segmentation error。而ssl_ciphers可以在http {}中定义,作为全局配置。

    我初学 C 语言,水平不高。暂时无法解决这个 bug,故寻求帮助。 致谢。

    8 条回复    2018-10-01 04:01:55 +08:00
    Dannytmp
        1
    Dannytmp  
       2018-09-22 19:10:55 +08:00 via Android
    难度不小,等高手解答。
    msg7086
        2
    msg7086  
       2018-09-23 03:08:35 +08:00
    https://g.x86.men/root/nginx-pika/commit/7f4c2321c2a5cc57a7715e560181b5edaed274bf
    我是这么解决的,比较省心。
    Hardrain
        3
    Hardrain  
    OP
       2018-09-23 14:17:09 +08:00
    @msg7086 我测试了一下,这样会报错(nginx/1.15.3)
    似乎是因为不能用 int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str);来设置 TLSv1.2 加密套件

    此外,可以这样测试:

    openssl ciphers -v -ciphersuites 'TLS1.3 加密套件' 'TLS1.2 加密套件'

    如果将两个 parameters 设成同样的、都包含 1.3 和 1.2 加密套件的字符串(如:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES128-GCM-SHA256),执行上述命令也报错。
    msg7086
        4
    msg7086  
       2018-09-23 17:52:00 +08:00
    确实,不知道是之前我测试方法有问题还是改过 API 行为了。回头我看看怎么搞吧。
    msg7086
        5
    msg7086  
       2018-09-23 18:11:22 +08:00
    以及如果你要尝试缩小范围的话,可以尝试着在不影响程序工作的情况下注释掉部分补丁,直到完全不会出问题为止。至少这样可以帮助你确定哪些代码可能有问题,哪些代码没问题。
    msg7086
        6
    msg7086  
       2018-09-24 08:08:38 +08:00
    https://g.x86.men/root/nginx-pika/commit/a1885bf8a262d82b71a1aa07f8849d9b464969ff
    新的补丁。
    Hardrain
        7
    Hardrain  
    OP
       2018-10-01 00:16:25 +08:00
    @msg7086 试了一下,这个补丁似乎可行(未发现问题)

    解决方案是判断每个 string,如果以 TLS_开头就作为 TLS1.3 cipher ?
    msg7086
        8
    msg7086  
       2018-10-01 04:01:55 +08:00
    @Hardrain 是这样的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1065 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 19:10 · PVG 03:10 · LAX 12:10 · JFK 15:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.