多站点数据库升级SSL错误

时间:2013-09-23 作者:夏期劇場

我已将我的多站点设置WordPress升级到3.6.1。在那之后,当我Network Upgrade > Database Upgrade 它显示:

警告更新时出现问题http://www.example.com/site1. 您的服务器可能无法连接到其上运行的站点。

错误消息:无法使用已知CA证书对对等证书进行身份验证

请问发生了什么事

我当前正在受信任的通配符SSL下运行该站点(not self-signed), 但仅安装在负载平衡器上。(显然,Apache服务器不需要安装证书。)<这是根本原因吗

  • 数据库位于Amazon RDS(默认设置),该RDS不带SSL*
  • 9 个回复
    最合适的回答,由SO网友:Jona 整理而成

    如果可能,您应该尝试修复此错误的原因-SSL证书无效。但在某些情况下,这是不可能或不可取的。一个明显的例子是使用自签名SSL证书的开发站点。

    解决此问题的一种方法是在wp includes/class http的第1161行之前将$ssl\\u verify设置为false。php:

    curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, ( $ssl_verify === true ) ? 2 : false )
    
    我过去这样做的方式是添加:

    $ssl_verify = false;
    
    在进行多站点升级并在之后将其删除之前,请转至第1159行。看起来应该有更复杂的方法来做到这一点。从它周围的代码来看,根据它周围的代码判断,您应该能够解析paramater sslverify=false,但这似乎不起作用(可能是因为升级包装器没有传递参数)。

    为了避免对Core进行更改,我会在您完成升级后取消此更改。

    SO网友:brasofilo

    我不知道这是否有用,但值得一试。创建Must Use plugin 并删除此行,请参见代码注释:

    <?php
    /* Plugin Name: Network upgrade exception */
    
    // Run only in the Upgrade screen
    add_action( \'load-upgrade.php\', \'add_filter_wpse_115279\' );
    
    function add_filter_wpse_115279()
    {
        add_filter( \'http_request_args\', \'apply_filter_wpse_115279\', 10, 2 );
    }
    
    // http://core.trac.wordpress.org/browser/tags/3.6.1/wp-admin/network/upgrade.php#L68 
    // wp_remote_get( $upgrade_url, array( \'timeout\' => 120, \'httpversion\' => \'1.1\' ) );
    // This function will end up calling WP_Http class, where we can use the filter http_request_args
    function apply_filter_wpse_115279( $args, $url )
    {
        # Adjust var <----------------------------------
        $ms_domain_to_check = \'http://example.com/site1/\';
        if( FALSE !== strpos( $url, $ms_domain_to_check ) )
        {
            $args[\'sslverify\'] = false;
        }
        return $args;
    }
    
    /**
     * Full list of arguments in
     * http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/class-http.php#L84
    
      $defaults = array(
        \'method\' => \'GET\',
        \'timeout\' => apply_filters( \'http_request_timeout\', 5),
        \'redirection\' => apply_filters( \'http_request_redirection_count\', 5),
        \'httpversion\' => apply_filters( \'http_request_version\', \'1.0\'),
        \'user-agent\' => apply_filters( \'http_headers_useragent\', \'WordPress/\' . $wp_version . \'; \' . get_bloginfo( \'url\' ) ),
        \'reject_unsafe_urls\' => apply_filters( \'http_request_reject_unsafe_urls\', false ),
        \'blocking\' => true,
        \'headers\' => array(),
        \'cookies\' => array(),
        \'body\' => null,
        \'compress\' => false,
        \'decompress\' => true,
        \'sslverify\' => true,
        \'stream\' => false,
        \'filename\' => null,
        \'limit_response_size\' => null,
      );
    
    */
    

    SO网友:cybmeta

    该错误可能是由于Wordpress多站点更新过程中使用了cURL。默认情况下,cURL将尝试使用捆绑的CA证书集中接受的CA验证SSL证书。

    您至少有四种选择:

    确保您在PHP安装中使用的是最新版本的cURL,以确保已使用的CA集得到更新。

    手动设置SSL证书的路径:

    curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 1);curl_setopt($AuthNetConn, CURLOPT_CAINFO, "path:/ca-bundle.crt");

    绕过SSL验证:

    curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, false);

    对于选项2和3,您可能需要过滤WordPress用于发出http请求的参数<请看@brasofilo的答案,这可能有用。

    无论如何,您应该调查SSL验证失败的原因,而不是绕过它。

    SO网友:here

    在许多情况下,您可以使用以下筛选器禁用本地ssl验证。这对于自签名证书错误非常有用。

    add_filter(\'https_local_ssl_verify\', \'__return_false\');

    当前版本v4。3.0确定请求是否是“本地”的,在wp-includes/class-http.php

    // Determine if this request is to OUR install of WordPress.
    $homeURL = parse_url( get_bloginfo( \'url\' ) );
    $r[\'local\'] = \'localhost\' == $arrURL[\'host\'] || ( isset( $homeURL[\'host\'] ) && $homeURL[\'host\'] == $arrURL[\'host\'] );
    unset( $homeURL );
    
    在某些情况下,本地考虑可能不起作用,在这种情况下,您可以考虑更具包容性的过滤器,add_filter(\'https_ssl_verify\', \'__return_false\');

    多站点安装,混合httphttps schemes可能会找到有关trac的更多信息,upgrade.php fails with mixed HTTPS (SSL) and simple HTTP sites

    无论如何,手动解决方法是访问每个子站点的/wp-admin/upgrade.php

    其他相关描述,http://scottnelle.com/683/ssl-error-upgrading-wordpress-multisite-network/

    SO网友:here

    通过访问以下站点,可以分别升级/更新每个子站点的数据库:

    https://rootsite/subsite/wp-admin/upgrade.php

    另请参阅相关的core trac票证,Database is not upgraded in multisite if loopback is disabled

    SO网友:habakuk

    如前所述Scott Nelle 建议如下:

    在中创建文件wpcontent/mu-plugins/ 把它命名为network-upgrade-ignore-ssl.php. 在文件中输入以下内容:

    <?php
       add_filter(\'https_ssl_verify\', \'__return_false\');
       add_filter(\'https_local_ssl_verify\', \'__return_false\');
    ?>
    

    SO网友:rahul kharbanda

    在AWS EC2托管的WordPress多站点实例上,我们遇到了一个类似的问题,即在添加新站点后更新网络时,在WP和DNS记录中出现了一个“curl6”问题;“A”;在同一网络静态ip上解析记录。

    实际上,这很简单,只是数据库传输导致了这些问题,我们使用免费版本的WP Optimize来运行所有优化,然后升级了网络,这就成功了。

    使用$ssl\\u verify=false修改核心文件;(不推荐)

    对于我们来说,这不是一个解决方案,因为我们正在使用Google AMP;Native“;“标准模式”;需要在每个点验证SSL。

    对于SSL,我们使用的是非常简单的SSL(免费),也可以在URL上激活,以便更好地使用。

    谢谢

    SO网友:Ronny Lindner

    我正在使用Wordpress 3.8.1,我更改了line 67 of wp-admin/network/upgrade.php 并添加, \'sslverify\' => false 像这样:

    --- a/wp-admin/network/upgrade.php      2014-03-29 14:31:28.081943490 +0100
    +++ b/wp-admin/network/upgrade.php      2014-03-29 14:30:52.785947460 +0100
    @@ -64,7 +64,7 @@
                            $upgrade_url = admin_url( \'upgrade.php?step=upgrade_db\' );
                            restore_current_blog();
                            echo "<li>$siteurl</li>";
    -                       $response = wp_remote_get( $upgrade_url, array( \'timeout\' => 120, \'httpversion\' => \'1.1\' ) );
    +                       $response = wp_remote_get( $upgrade_url, array( \'timeout\' => 120, \'httpversion\' => \'1.1\', \'sslverify\' => false ) );
                            if ( is_wp_error( $response ) )
                                    wp_die( sprintf( __( \'Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: <em>%2$s</em>\' ), $siteurl, $response->get_error_message() ) );
                            do_action( \'after_mu_upgrade\', $response );
    
    这样,仅在这种特定情况下才禁用验证,使用补丁文件,您可以在升级后轻松应用更改:

    # go to the directory with wp-admin/ in it
    cd wordpresshomedir
    
    # without --dry-run if there are no errors
    patch --dry-run -p1 < ../disable-sslverify.patch
    

    SO网友:borayeris

    正确的解决方案是检查服务器时间。如果它是错误的SSL不能正常工作。

    结束

    相关推荐

    WordPress MultiSite可以使用了吗?

    我计划为不同类型的社区创建一个网站。例如,不同类型的开发人员。PHPJavaAndroidTC每种类型都有不同的注册和配置文件字段。现在我的困惑是,要么我应该创建多站点网络,每个站点将包含不同的开发人员,要么只有一个站点可以明智地完成这项工作?我需要做的一些事情是允许用户随时开始使用其他网站,例如,如果x用户注册了Java,现在他想注册PHP,他应该能够在不再次注册的情况下放置他的内容,并且用户id也应该是相同的,所以每当我通过用户id获取内容时,它都会给我来自同一用户的不同网站的所有数据。另一个问题是,