SVN: server certificate verification failed

I faced such message when I typed “svn update” telling an SSL certification error occurred. Full message is

Server certificate verification failed: certificate has expired, certificate issued for a different hostname, issuer is not trusted

Explaining from the result, I added an option with these comma-separated keywords below;

–trust-server-cert-failures=unknown-ca,cn-mismatch,expired,not-yet-valid,other

I found this solution in the help of “svn update”. Type the command below and read the document carefully because I finally failed to find any advice of someone else.

% svn help update

–trust-server-cert-failures ARG : with –non-interactive, accept SSL server certificates with failures; ARG is comma-separated list of ‘unknown-ca’ (Unknown Authority), ‘cn-mismatch’ (Hostname mismatch), ‘expired’ (Expired certificate), ‘not-yet-valid’ (Not yet valid certificate) and ‘other’ (all other not separately classified certificate errors).

I guess that this problem is common even with “checkout” and other options.
I recommend you check which keyword you need.

I hope this helps you.

コマンドは見たらわかると思うので、日本語では要約にとどめます。

% svn up

でSSLのエラーが出たので、調べました。けっこうな時間を割きましたが、同じ解決策に至った方はおられないようでしたので、書き残します。同様の問題に苦しまれている方はご参照ください。

エラーメッセージは「SSLの証明書の期限が切れており、ホスト名も食い違っているため、発行元が信頼できない」といったところ。

コマンドのオプションのまとめが公式サイトを探しても見つけられなかったのですが、手元のコマンドのヘルプをよく見たらそれっぽいオプションがあったので、書いてみました。その結果、いけました。

たぶん not-yet-valid と other は今回の場合だと要らないと思いますが、試しませんでした。気になる方は調整してください。

Nginx+Apache×2+SSL(+WordPress)

獲得目標は以下の通りです。
●SSLの設定をしたNginxでリバースプロキシをさせて、バックエンドのApacheに渡す。
●Wordpressも動くようにする。

ではさっそく。

Nginx(エンジンエックスと読むそうですね!):

http {
    upstream MidgenasiaServers {
        # バックエンドサーバーの設定をします。
        server 10.0.0.80:8080; # 8080番ポートでhttp通信をListenしているIP 10.0.0.80上のApache 
        server 10.0.0.81:8080; # 8080番ポートでhttp通信をListenしているIP 10.0.0.81上のApache
    }
    upstream OtherServers {
        # こちらもバックエンドサーバーの設定です。上と同じサーバーに格納されている想定です。
        server 10.0.0.80:8081;
        server 10.0.0.81:8081;
    }
    server {
        # http通信はすべてhttpsに301リダイレクトします。
        listen 80;
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl;
        server_name  www.midgen.asia;
        charset utf-8;

        # SSL
        ssl_certificate      path/to/server.crt;
        ssl_certificate_key  path/to/server.key;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers  on;
        # server.keyにパスフレーズを指定してある場合はたぶん必要。パスフレーズだけ書いておけばOK。
        ssl_password_file path/to/server-password;

        location / {
            # upstreamの場所で指定した名称をここに書きます。
            proxy_pass          http://MidgenasiaServers;
            proxy_redirect      off;
            proxy_set_header    Host    $host;
            proxy_set_header    X-Real-IP    $remote_addr;
            proxy_set_header    X-Forwarded-Proto     https;
            proxy_set_header    X-Forwarded-Host      $host;
            proxy_set_header    X-Forwarded-Server    $host;
            proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        }
    }

    # 2つ目のドメインの設定も続けて書きます。
    server {
        server_name  www.another.domain.com;
        charset utf-8;

        ssl_certificate      path/to/another.domain.com.crt;
        ssl_certificate_key  path/to/another.domain.com.key;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers  on;
        ssl_password_file path/to/another.domain.com-password;

        location / {
            # 上記と同様に、upstreamの場所で指定した名称をここに書きます。
            proxy_pass    http://OtherServers;
            proxy_redirect      off;
            proxy_set_header    Host    $host;
            proxy_set_header    X-Real-IP    $remote_addr;
            proxy_set_header    X-Forwarded-Proto     https;
            proxy_set_header    X-Forwarded-Host      $host;
            proxy_set_header    X-Forwarded-Server    $host;
            proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        }
    }
}

※要旨に関係がないコメントや設定は削除してあります。

Apache:

Listen 8080
Listen 8081

>VirtualHost 10.0.0.80:8080<
    ServerName www.midgen.asia
    DocumentRoot "/path/to/midgen.asia.htdocs"
>/VirtualHost<

>VirtualHost 10.0.0.80:8081<
    ServerName www.gowest-comewest.net
    DocumentRoot "/path/to/another.domain.com.htdocs"
>/VirtualHost<

ここまででNginx+SSLとラウンドロビンなApacheは完成。
あとは…Wordpress。リバースプロキシ+SSLという環境下では、特殊な記述をwp-config.phpに加える必要があるようです。

WordPress(wp-config.phpの上のほうに書きます):

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
  $_SERVER['HTTPS'] = 'on';
}
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

参考: WordPressをhttps化してnginx reverse proxy配下で使うには

これでWordpressのCSSやJavaScriptが読み込まれないという状況も打破できます。

できてよかった!