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

シリーズ:さくらサーバーで遊ぶ

設定等のメモ
http://qiita.com/cielavenir/items/67a7c631713b4c816b6d

SSL化
http://qiita.com/cielavenir/items/aad29b2348fc4d3f9155

(さくらサーバー導入の主目的)
メールをフックする
http://qiita.com/cielavenir/items/5ce4568fc405329d421a

Linuxbrewを導入する(旧)
http://qiita.com/cielavenir/items/741921fcecb281555f77

Homebrewを導入する
https://qiita.com/cielavenir/items/67ce0ec9cd8d43ed00f1


前説

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

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


certbotの導入


pipの導入


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のオプションです。


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は不要。


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ディレクトリ指定が必要です)


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は指定できないと思われる。発行部数が上限を超えている他、コントロールパネルに証明書登録画面がない。


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



証明書のアップロード


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