开始使用 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

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 就可以直接用鼠标滚轮进行音量调节了。右键-配置,可以对其进行配置,功能是很丰富的。

SSH 端口转发

简介

ssh 端口转发是建立了一个 ssh 隧道,原来传输的数据通过这个隧道来传输。先来说说大家最熟悉的动态转发。

动态转发

ssh -D <local port> <SSH server>

这种使用方法应该都很熟悉,(能干嘛?:D),它能动态地将各种数据转发到远程的端口上,相当于在本发建立了一个 sock5 的代理。

本地转发

本地端口转发的命令格式是:

ssh -L <local port>:<remote host>:<remote prot> <SSH server>

使用场景:假设我们现在有一台 smtp 服务器 server,但它被监听在 127.0.0.1:25,也就是说只允许来自自己的请求,所以我们不能在远程访问到它的 25 端口。但是 server 允许远程的 ssh 连接。这个时候在本地执行:

ssh -L 2525:localhost:25 server

这个时候我们就能通过访问 localhost:2525 来访问到 server 中的 25 端口了。

还有一种情况:假设现在 local 不能访问到 ser2 的 23 端口,但 local 能访问到 ser1 的 ssh,而且 ser1 也能访问到 ser2 的 23 端口。

这个时候,我们只需要在本地运行:

ssh -L 2323:ser2:23 ser1

这个时候,我们只要访问 localhost:2323 就能通过 ser1 访问 ser2:23 了。

远程转发

它的命令格式是:

ssh -R <local port>:<remote host>:<remote port> <SSH server>

使用场景:假设现在有一台 web 服务器(srv1)处于局域网中,它不能被广域网访问到,另一台服务器(srv2)处于广域网中。srv1 能 ssh 到 srv2,这个时候想让 srv2 访问到 srv1 的 web 服务。在 srv1 中执行

ssh -R 8088:srv1:80 ser2

这个时候就能在 srv2 中访问 localhost:8088 就能访问到 srv1 中的 web 服务器了。

这个时候 srv2 的 8088 只能监听在 127.0.0.1 的,要想允许外部访问,可改写为 -R *:8088:srv1:80,并确保在服务器的 sshd_config 中打开了 GatewayPorts yes 选项。

X 协议转发

ssh -X <SSH Server>

登录完成后,就可以直接在 shell 里执行远程的 X 应用,这里建立的 X 转发会自动设置 DISPLAY 环境变量,通常会被设置成 localhost:10.0,我们无需也不应该在连接之后再进行修改此环境变量。

常用参数

端口转发常与以下参数配合使用:

选项 说明
-f ssh将在后台运行
-N 不执行命令,仅转发端口
-C 压缩传送的数据
-i 使用指定的密钥登录
-g 创建监听 0.0.0.0 的端口

参考资料

  1. SSH端口转发
  2. 实战 SSH 端口转发