Firefox Sync, это служба, которая позволяет пользователям переносить полностью свою историю, пароли, закладки, открытые вкладки и даже дополнения между различными устройствами, на которых установлен браузер Firefox, как для десктопной версии, так и для Android.
Firefox Sync реализуется двумя сущностями — сервисом авторизации (Firefox account API) и сервером синхронизации (Firefox Sync).
Давно возникла идея настроить свой сервер для синхронизации паролей, закладок и прочих радостей жизни. По роду деятельности, не очень доверяю публичным сервисам, таким, как LastPass или Google Account. На мой взгляд, приватные данные должны храниться на своем сервере.
Ну да хватит лирики, приступим к настройке.
Настройка предлагается для сервера под управлением ОС Debian.
Есть возможность реализации нескольких схем синхронизации:
1. Firefox account API + Firefox Sync Server
2. Firefox account API + свой Sync Server
3. Свой account API + свой Sync Server
Я остановился на втором варианте.
Предполагается, что на сервере уже стоит веб-сервер apache2 и сервер баз данных mysql. Последнее, впрочем, необязательно, поскольку я не нашел способа вменяемо подружить сервер синхронизации с БД mysql, и использовал sqlite. При использовании mysql коннектор периодически отваливался от базы данных.
Пусть наш сервер синхронизации будет доступен по адресу sync.domain.com.
Установим необходимые пакеты:
$ sudo apt-get install python-dev git-core python-virtualenv libapache2-mod-wsgi
Установку сервера синхронизации будем вести в директорию /var/www/
$ cd /var/www/
$ git clone https://github.com/mozilla-services/syncserver
$ cd syncserver
$ make build
Произведем базовое конфигурирование сервера:
$ cat syncserver.ini
[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000
[app:main]
use = egg:syncserver
[syncserver]
public_url = https://sync.domain.com/
sqluri = sqlite:////var/www/db.sql
secret = your_server_key
your_server_key может быть любой фразой, я ее сгенерировал так:
head /dev/urandom |md5sum
Создадим файл для базы данных:
$ touch /var/www/db.sql
Поправим права на директорию:
$ chown -R www-data:www-data /var/www/
$ chmod 777 /var/www/db.sql
ОБРАТИТЕ ВНИМАНИЕ!
В своей конфигурации я расположил файл db.sql в директории /var/www/, поскольку сервер используется только для синхронизации, и apache не смотрит на этот файл.
В случае, если в /var/www у вас смотрят другие виртхосты, поместите файл с БД куда-нибудь в другое место.
Обращаться к sync-серверу будем по HTTPS.
Для этого настроим apache.
$ cat /etc/apache2/sites-available/sync.domain.com.conf
<VirtualHost *:80>
ServerName sync.domain.com
Redirect permanent / https://sync.domain.com/
ErrorLog /var/log/apache2/sync/error.log
CustomLog /var/log/apache2/sync/access.log combined
</VirtualHost>
<VirtualHost *:443>
Servername sync.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /var/www/syncserver
WSGIProcessGroup sync.domain.com
WSGIDaemonProcess sync.domain.com user=www-data group=www-data processes=2 threads=25 python-path=/var/www/syncserver/local/lib/python2.7/site-packages
WSGIPassAuthorization On
WSGIScriptAlias / /var/www/syncserver/syncserver.wsgi
ErrorLog /var/log/apache2/sync/error-ssl.log
CustomLog /var/log/apache2/sync/access-ssl.log combined
SSLEngine on
SSLProtocol -ALL +SSLv3 +TLSv1
SSLHonorCipherOrder On
SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH
SSLCertificateFile /etc/apache2/ssl/sync.domain.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/sync.domain.com.key
<Directory /var/www/syncserver>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Сгенерируем самоподписанные ключи:
$ cd /etc/apache2/ssl/
$ openssl genrsa -des3 -out server.key 1024
$ openssl req -new -key server.key -out server.csr
$ cp server.key sync.domain.com.key
$ openssl rsa -in sync.domain.com.key -out server.key
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
$ cp server.crt sync.domain.com.crt
$ cp server.key sync.domain.com.key
Создадим директорию для логов:
$ mkdir /var/log/apache2/sync/
$ touch /var/log/apache2/sync/error-ssl.log
$ touch /var/log/apache2/sync/access-ssl.log
$ touch /var/log/apache2/sync/error.log
$ touch /var/log/apache2/sync/access.log
$ chown -R www-data:www-data /var/log/apache2/sync/
Активируем новый виртхост:
$ a2ensite sync.domain.com
И перезапустим apache:
service apache2 restart
Если мы все сделали правильно, то при обращении к
https://sync.domain.com/token/1.0/sync/1.5
веб-сервер отдаст нам нечто вроде:
{"status": "error", "errors": [{"location": "body", "name": "", "description": "Unauthorized"}]}
Обязательно добавьте свой сертификат в исключения браузера, иначе синхронизация не заработает!
Осталось настроить сам браузер.
Заходим в about:config, и меняем значение ключа services.sync.tokenServerURI на
https://sync.domain.com/token/1.0/sync/1.5
После этого авторизуемся в Меню -> Настройки -> Синхронизация, используя аккаунт Mozilla, и пользуемся.
Кстати, если мы отключимся от аккаунта синхронизации, то ключ services.sync.tokenServerURI примет значение по умолчанию.
P.S.
К сожалению, не удалось настроить синхронизацию с мобильным телефоном на Android, используя fxa-custom-server-addon, если у кого-то получится — отпишитесь, пожалуйста, в комментарии.
Всем спасибо за внимание.
Автор: teamfighter