certificate verify failedなsvn+httpsサーバからmercurial+hgsubversionでcloneする
Tags: subversion, mercurial
Published: 2012-09-24 03:29:00

---
title: certificate verify failedなsvn+httpsサーバからmercurial+hgsubversionでcloneする
published: true
tags: Subversion, Mercurial
date: 20120924T03:29Z
canonical_url: https://qiita.com/shiena/items/05f4b5254d952f8b2800
---
certificate verify failedなsvn+httpsサーバとmercurialの連携が一筋縄ではいかなかったので手順をまとめました。
環境によっては途中の手順を飛ばせるかもしれませんし、逆に最後まで進めても解決しないかもしれません。

まずは普通にcloneしてみます。

```sh
$ hg clone https://example.org/svn/
abort: error: _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
```

clone元のSSL証明書がオレオレ証明書だったり有効期限が切れているとエラーになってしまいます。
そこで検証を省略するために`--insecure`オプションを使います。

```sh
$ hg clone --insecure https://example.org/svn/
warning: example.org certificate with fingerprint xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx not verified (check hostfingerprints or web.cacerts config setting)
abort: Failed to open Subversion repository; please try running 'svn ls https://example.org/svn/' for details.
```

今度はsvnライブラリでエラーになってしまうのでエラーメッセージの通りにコマンドを実行します。

```sh
$ svn ls https://example.org/svn/
Error validating server certificate for 'https://example.org:443':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: example.org
 - Valid: from Fri, 16 Sep 2011 22:55:11 GMT until Mon, 17 Sep 2012 16:58:51 GMT
 - Issuer: Foo
 - Fingerprint: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
(R)eject, accept (t)emporarily or accept (p)ermanently? 
```

ここではSSL証明書を常に承認するために`p`を入力します。
それと`--insecure`オプションでは大量のwarningが出るので上記の`Fingerprint`を`hostfingerprints`に追加します。
__実際のFingerprintは:で区切られた16進数です。__

* Windowsの場合 `%USERPROFILE%\Mercurial.ini`
* Mac, UNIX系の場合 `$HOME/.hgrc`

```sh:.hgrcまたはMercurial.ini
[hostfingerprints]
example.org = xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
```

これでSSL証明書のエラー回避ができたので再びcloneしてみます。

```sh
$ hg clone https://example.org/svn/
destination directory: svn
abort: Failed to open Subversion repository; please try running 'svn ls https://example.org/svn/' for details.
```

ここでエラーメッセージが変わらない場合はsvnライブラリが使うhttpライブラリに問題があるので
`servers`ファイルの`global`セクションの`http-library`に`serf`もしくは`neon`を指定します。

* Windowsの場合 `%APPDATA%\Subversion\servers`
* Mac, UNIX系の場合 `$HOME/.subversion/servers`

```sh:servers
[global]
http-library = serf
```

もしくは

```sh:servers
[global]
http-library = neon
```
httpライブラリを変えたので、もう一度SSL証明書の受け入れを承認します。

```sh
$ svn ls https://example.org/svn/
Error validating server certificate for 'https://example.org:443':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: example.org
 - Valid: from Fri, 16 Sep 2011 22:55:11 GMT until Mon, 17 Sep 2012 16:58:51 GMT
 - Issuer: Foo
 - Fingerprint: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
(R)eject, accept (t)emporarily or accept (p)ermanently? 
```

今度こそSSL証明書のエラーを回避できたのでcloneしてみます。

```sh
$ hg clone https://example.org/svn/
destination directory: svn
abort: The OPTIONS response did not include the requested version-name value (subversion error: 1703)
```

今度はHTTPのOPTIONSメソッドで出てしまいました。
この場合はsvnのbranchとtagが反映されなくなりますが、singleレイアウトにするとcloneできました。

```sh
$ hg clone --layout single https://example.org/svn/
destination directory: svn
```
これで無事にsvn+httpsサーバからcloneできました。