さくらサーバーをリモートだけでSSL化する


| |シリーズ：さくらサーバーで遊ぶ|
|:--|:--|
|設定等のメモ|http://qiita.com/cielavenir/items/67a7c631713b4c816b6d|
|SSL化|http://qiita.com/cielavenir/items/aad29b2348fc4d3f9155|
|(さくらサーバー導入の主目的)<br>メールをフックする|http://qiita.com/cielavenir/items/5ce4568fc405329d421a|
|Linuxbrewを導入する(旧)|http://qiita.com/cielavenir/items/741921fcecb281555f77|
|Homebrewを導入する|https://qiita.com/cielavenir/items/67ce0ec9cd8d43ed00f1|
|さくらサーバーでgccへの依存が発生しない理由<br>(HOMEBREW_BUILD_FROM_SOURCE=1は不要)|https://qiita.com/cielavenir/items/410ded536d9b520989c4|

## 前説
さくらサーバー(マネージド/専有で無いほう)はroot権限がないので、SSL化をさくらサーバー内で完結するにはやや複雑な手順が必要となる。

PYTHONPATHとかでエラーが出る場合は適宜私の設定を参照して下さい。

## certbotの導入

### pipの導入

```sh:pip.sh
mkdir -p ~/local/lib/python2.7/site-packages/
ls -s local ~/.local
easy_install --prefix=$HOME/local pip
```

### cffiの導入
http://pkg.freebsd.org/FreeBSD:9:amd64/latest/All/libffi-3.2.1.txz を~/local/libや~/local/include配下にうまく展開。manとかは不要。

その後、以下のようにすれば導入できます。-Rはrpathのオプションです。

```sh:cffi.sh
~/local/bin/pip install --upgrade --user -I setuptools
~/local/bin/pip install --global-option=build_ext --global-option="-I/home/USER/local/include" --global-option="-L/home/USER/local/lib" --global-option="-R/home/USER/local/lib" --user cffi
```

### certbotの導入

/usr/local/ssl/を使ってもらう必要があるが、こちらは、/usr/local/libdata/ldconfig/opensslにrpathの記載があるため、-Rは不要。

```sh:certbot.sh
~/local/bin/pip install --global-option=build_ext --global-option="-I/usr/local/ssl/include" --global-option="-L/usr/local/ssl/lib" --user cryptography
~/local/bin/pip install --user certbot
```

## Ruby-mechanizeの導入
rbenvは(設定等のメモに書かれた方法で)導入済みとします。
(さくらコントロールパネルはTLS1.2が必要なので、Rubyビルド時にOpenSSLディレクトリ指定が必要です)

```sh:mechanize.sh
gem install pkg-config
gem install nokogiri -- --with-opt-include=/usr/local/include --with-opt-lib=/usr/local/lib --use-system-libraries
gem install mechanize
```

※savonを導入したい場合は、mechanizeについては改造版を入れる必要があります
https://github.com/sparklemotion/mechanize/issues/407

## 証明書取得

### certbot実行

DOMAINにはsakura.ne.jpは指定できないと思われる。発行部数が上限を超えている他、コントロールパネルに証明書登録画面がない。

```sh:certbot_exec.sh
local/bin/certbot certonly --webroot --config-dir=letsencrypt/config --work-dir=letsencrypt/work --logs-dir=letsencrypt/logs  -w /home/USER/www/ -d DOMAIN
```

### 証明書のアップロード

```rb:cert_upload.rb
#!/usr/bin/env /home/cielavenir/.rbenv/shims/ruby
#coding:utf-8
require 'mechanize'
COREDOMAIN='USER.sakura.ne.jp'
PASSWORD=''
DOMAIN=''

agent=Mechanize.new
agent.ca_file='/usr/local/share/certs/ca-root-nss.crt'
agent.get('https://secure.sakura.ad.jp/rscontrol/rs')
form=agent.page.form_with(:name => 'login')
form.domain=COREDOMAIN
form.password=PASSWORD
form.click_button

agent.get("https://secure.sakura.ad.jp/rscontrol/rs/ssl?SNIDomain=#{DOMAIN}")
form=agent.page.forms.find{|e|e.button_with(:value => '秘密鍵を含む新しい設定の作成')}
form.click_button if form

form=agent.page.forms.find{|e|e.button_with(:value => '秘密鍵をアップロードする')}
form.file_upload.file_name="letsencrypt/config/live/#{DOMAIN}/privkey.pem"
form.file_upload.mime_type="application/x-x509-ca-cert"
form.click_button

#証明書のインストール
form=agent.page.forms.find{|e|e.field_with(:name => 'Cert')}
form.Cert=File.read("letsencrypt/config/live/#{DOMAIN}/cert.pem")
form.click_button

#中間証明書のインストール
agent.get("https://secure.sakura.ad.jp/rscontrol/rs/ssl?CACert=1&SNIDomain=#{DOMAIN}")
form=agent.page.forms.find{|e|e.field_with(:name => 'Cert')}
form.Cert=File.read("letsencrypt/config/live/#{DOMAIN}/chain.pem")
form.click_button

#証明書の更新である場合、更新を適用する
agent.get("https://secure.sakura.ad.jp/rscontrol/rs/ssl?SNIDomain=#{DOMAIN}")
form=agent.page.forms.find{|e|e.button_with(:value => '新しい設定を有効化する')}
if form
	form.checkboxes[0].checked=true
	form.click_button
end
```