开始使用 ECC 证书

之前经常有听说 ECC 证书,它体积小,速度快,但是不兼容旧的浏览器,所以我也一直只使用 RSA 证书。
但从 Nginx 1.11.0 开始提供了对 RSA/ECC 双证书的支持。它的实现原理是:分析在 TLS 握手中双方协商得到的 Cipher Suite,如果支持 ECDSA 就返回 ECC 证书,否则返回 RSA 证书。也就是说,配合最新的 Nginx,我们可以使用 ECC 证书为现代浏览器提供更好的体验,同时老旧浏览器依然会得到 RSA 证书,从而保证了兼容性。这一次,鱼与熊掌可以兼得。

下面介绍一下如何使用 ECC 证书:

1.申请

如果你的 CA 支持签发 ECC 证书,使用以下命令生成 CSR(Certificate Signing Request,证书签名请求)文件并提交给提供商,就可以获得 ECC 证书:

openssl ecparam -genkey -name secp256r1 | openssl ec -out ecc.key
openssl req -new -key ecc.key -out ecc.csr

以上命令中可供选择的算法有 secp256r1 和 secp384r1,secp521r1 已被 Chrome 和 Firefox 废弃,而且 escp256p1 已经足够健壮。
目前很火的 Let’s Encrypt,也支持签发 ECC 证书。我们可以使用 acme.sh 这个小巧的工具来签发证书,指定 -k ec-256 就可以将证书类型改为 ECC:

/PATH/TO/.acme.sh/acme.sh --issue --dns dns_cx -d imququ.com -d www.imququ.com -k ec-256

2.配合 Nginx 使用

有了 RSA/ECC 双证书之后,需要安装 Nginx 1.11.x。
一切准备妥当后,将证书配置改为双份即可:

ssl_certificate     example.com.rsa.crt;
ssl_certificate_key example.com.rsa.key;

ssl_certificate     example.com.ecdsa.crt;
ssl_certificate_key example.com.ecdsa.key;

修改 Cipher Suites 配置如下,供参考:

ssl_ciphers                EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

参考:https://imququ.com/post/ecc-certificate.html

折腾 HTTP/2

之前看到 ningx 1.9.5 版发布了,把 spdy 换成了 http2,安装主要参考了 这里

  1. nginx 官网上下载最新的 1.9.5 源代码,因为 HTTP/2 module 需要用到 “ALPN” OpenSSL_1.0.2 以上提供与 “NPN” OpenSSL_1.0.1 以上提供, 所以还要去 OpenSSLLibreSSL(建议用 LibreSSL 有一些新的特性)官网下载最新的 SSL 源码包并分别解压。

  2. 预编译的时候需要启用 http_v2_modulehttp_ssl_module 这两个模块:

    $ ./configure --with-openssl=/PATH/TO/LibreSSL --with-http_v2_module --with-http_ssl_module --with-ld-opt=-lrt #使用 LibreSSL
    $ ./configure --with-openssl=/PATH/TO/OpenSSL --with-http_v2_module --with-http_ssl_module  #使用 OpenSSL
  3. 然后 makemake install

  4. 在 Nginx 配置中启用站点对 HTTP/2 的支持也很方便,只需要在 listen 时加上 http2 就可以了:

    listen 443 ssl http2;

  5. 其它配置就跟 https 的配置是一样的,可以参考以前的

Debian Linux 编译 Realtek (RTL8111/RTL8168) 网卡驱动

有一台电脑上用了 Realtek (RTL8111/RTL8168) 的网卡,lspci 显示:

01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)

在这台电脑上装了 Debian wheezy,虽然 Debian 内核里有它的驱动(用了 r8169),也能使用,但网络很不稳定。所以我打算把 r8169 换成官方的 Realtek (r8168) 驱动。
继续阅读Debian Linux 编译 Realtek (RTL8111/RTL8168) 网卡驱动

archlinux 的 top 命令变红了

Archlinux 在某次更新了 procps-ng 后,top 命令变成红色了,如下图

看习惯了传统的 top 对这个还是很不习惯,所以找方法把它变成原来的样子:

首先删除 $HOME 目录下的 .toprc 如果有的话

rm ~/.toprc

然后启动 top,在 top 界面依次按如下键:

 z
 V
 1
 y
 m m
 t t t

这个时候,应该可以发现跟原来的 top 命令一样了,最后按 W 保存配置,这样就可以在 ~/.toprc 里写入 top 的配置,下次使用 top 命令的时候也是原来的样子了。

press W

红色top

参考:https://bbs.archlinux.org/viewtopic.php?pid=1474872#p1474872

nginx 中 https 优化配置

https 网站比 http 网站慢一些,原因很多,诸如握手次数、缓存限制等。

那么进行一定的配置优化可以加快一些 https 的加载速度,下面是一个配置示例:

ssl on spdy;
ssl_certificate ssl/ssl.crt;
ssl_certificate_key ssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate ssl/trustchain.crt;
resolver 223.5.5.5 223.6.6.6;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497  https://$host$request_uri;

其中ssl_certificate对应单张证书,ssl_certificate_key对应私钥,ssl_trusted_certificate对应信任链,即需要附加到单张证书后面的那两张证书链,这里可以把他们剥离出来。

参考:
Optimizing HTTPS on Nginx – {bjørn:johansen}
Nginx Performance Tuning for SSL – Tech Samurais

另外,当配置好SSL之后,可以去这个站点进行测试,看看还有没有什么的地方可以优化的 SSL 配置检查工具

使用 homebrew 安装 php-fpm

虽然在 OS X 上自带了 php-fpm 但是好多 ext 都没有,要装的话要自己编译,想想还是从 homebrew 里新装一个 php 吧。

在 homebrew 里安装 php-fpm 很简单:

brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/php
brew install --without-apache --with-fpm php5x #这里需要把 x 换成版本号,比如 3, 4, 5, 6
brew install php5x-mcrypt php5x-memcache php5x-memcached ...

配置文件在 /usr/local/etc/php/版本号/ 目录下面

安装好后,可以在 /usr/local/sbin/ 目录下找到 php5x-fpm,这就是启动脚本了,赋予它执行权限

chmod a+x php5x-fpm

然后就可以 /usr/local/sbin/php5x-fpm {start|restart|stop} 了。

Nginx 使用 openssl 的自签名证书

一、准备证书

0. 前期准备工作

cd ~/
mkdir ssl
cd ssl
mkdir demoCA
cd demoCA
mkdir newcerts
mkdir private
touch index.txt
echo '01' > serial

1. 制件 CA 证书

生成 CA 私钥: ca.key

openssl genrsa -des3 -out ca.key 2048

这样是生成 rsa 私钥,`des3` 算法,openssl 格式,2048 位强度。`ca.key` 是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。另外可以通过以下方法生成没有密码的key:

openssl rsa -in ca.key -out ca_decrypted.key

生成 CA 根证书的公钥 ca.crt:

openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

2. 制作网站的 https 证书,并用 CA 签名认证

假设我们需要为 abc.com 域名制作证书

先生成 abc.com 的证书私钥 abc.com.pem

openssl genrsa -des3 -out abc.com.pem 1024

无密码的私钥

openssl rsa -in abc.com.pem -out abc.com.key

生成 csr 签名请求

openssl req -new -key abc.com.pem -out abc.com.csr

这里需要输入国家,地区,组织,email等。最重要的是 **common name**,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名一样,即,这里要写 abc.com,否则会引发浏览器警报,这里可以用 *.abc.com 来做泛域名证书。

最后,需要用 CA 证书进行签名:

openssl ca -policy policy_anything -days 1460 -cert ./demoCA/ca.crt -keyfile ./demoCA/ca.key -in abc.com.csr -out abc.com.crt

这样网站的 https 证书就做完了。

还有一步就是把 ca.crt 的内容追加到 abc.com.crt 后面,因为有些浏览似乎不支持。

cat demoCA/ca.crt >> abc.com.crt

nginx 配置

加入配置内容:

server {
        listen 443;
        server_name abc.com www.abc.com;

        root html;
        index index.html index.htm;

        ssl on; 
        ssl_certificate /PATH/TO/abc.com.crt;
        ssl_certificate_key /PATH/TO/abc.com.key;

        ssl_session_timeout 5m;

        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
        ssl_prefer_server_ciphers on;

        location / {
                try_files $uri $uri/ =404;
        }       
}

其它

其实很多时候,并不需要加密的 key,所以像这面这么做就好了。

cd ~/
mkdir ssl
cd ssl
mkdir demoCA
cd demoCA
mkdir newcerts
mkdir private
touch index.txt
echo '01' > serial
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
cd ..
openssl genrsa -out abc.com.key 2048
openssl req -new -key abc.com.key -out abc.com.csr
openssl ca  -policy policy_anything  -days 1460 -in abc.com.csr -out abc.com.crt -cert ./demoCA/ca.crt -keyfile ./demoCA/ca.key

Ubuntu 下移动 MySQL 的默认目录

最近配置了一台 Ubuntu 1404 的服务器,装好 MySQL 之后,准备把 MySQL 的数据目录(datadir)移动到其它地方(/srv/mysql),之前在 Debian 下面的话,直接做完下面几步就好了:

# service mysql stop
# cp -rp /var/lb/mysql /srv/mysql
# 在 my.cnf 中修改 datadir = /srv/mysql 
# service mysql start

但,这次在 Ubuntu 下直接启动不成功,抛出 start: Job failed to start,Google 之,发现原来在 Ubuntu 中引入了一个 AppArmor 的安全模组,它可以界定单个程序进入一组文件列表。

所以在 Ubuntu 下还需要做一步操作:

/srv/mysql/ 目录加入到 mysqld 的目录列表中去,编辑 /etc/apparmor.d/usr.sbin.mysqld

# vim /etc/apparmor.d/usr.sbin.mysqld

作以下修改

...
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
+ /srv/mysql/ r,
+ /srv/mysql/** rwk, 
...

重启 apparmor

# /etc/init.d/apparmor restart

然后启动 MySQL 就不会报错了。

# service mysql restart

关于 AppArmor 的官方介绍:https://help.ubuntu.com/14.04/serverguide/apparmor.html

Debian 下设置默认的编辑器

debian 安装好后,转为的编辑器是 nano,我想把它改成 vim,以前都是在 .bashrc 里添加 export EDITOR=vim

其实,Debian 下面有专门设置默认编辑器的工具:

sudo update-alternatives --config editor

update-alternatives 是 Debian/Ubuntu 系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本,比如,上面的修改默认编辑器。

关于 update-alternatives 的用户可以 man update-alternatives 问一下男人。

Openbox 音量控制

Openbox 上的音量控制,以前都是按照 archlinux wiki 里的来配置的,直接用 rc.xml 绑定按键来控制音量,当然效果也不错。不过有时候只想用鼠标来控制的话就不能完成了,这时可以给 openbox 加一个音量调节的托盘按钮。

pacman -S volumeicon

然后在 autostart.sh 中加入:

# Volume
if which volumeicon >/dev/null 2>&1; then
       volumeicon &
fi

重新进入 openbox 就可以直接用鼠标滚轮进行音量调节了。右键-配置,可以对其进行配置,功能是很丰富的。